Данные строки в обработке расшифровки СКД
Скорее заметка на память, чем статья. Прошелся по форумам и не нашел решения данной проблемы. Везде предлагается получить значения только группировок, в которые входит эта ячейка. Был еще способ создать свой макет и там в параметрах ячейки указать параметры расшифровки, но мне показалось такое решение слишком сложным. Предлагаю другой путь — обойти ячейки строки, для каждой ячейки получить реквизит "Расшифровка" и данные расшифровки.
- Описание
- Подробнее
Описание
Код должен располагаться в модуле формы отчета. У поля табличного документа событие «ОбработкаРасшифровки» должно ссылаться на процедуру РезультатОбработкаРасшифровки
Решение, которое предлагают на форумах для получения значений группировок:
Функция ПолучитьРекурсивноСтруктуруОтбора(ТекущееПоле, СтруктураОтбора = Неопределено)
Если СтруктураОтбора = Неопределено Тогда
СтруктураОтбора = Новый Структура;
КонецЕсли;
Если ТипЗнч(ТекущееПоле) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
Для Каждого ТекЭл Из ТекущееПоле.ПолучитьПоля() Цикл
СтруктураОтбора.Вставить(ТекЭл.Поле, ТекЭл.Значение);
КонецЦикла;
КонецЕсли;
Для Каждого ТекЭл Из ТекущееПоле.ПолучитьРодителей() Цикл
ПолучитьРекурсивноСтруктуруОтбора(ТекЭл, СтруктураОтбора);
КонецЦикла;
Возврат СтруктураОтбора;
КонецФункции
Функции для передвижения по строке: разбирается имя ячейки и увеличивается или уменьшается номер колонки:
Функция РаспарситьИмяПоля(ИмяПоля)
ИндексСи = Найти(ИмяПоля, "C");
БазаИмени = Лев(ИмяПоля, ИндексСи);
НомерКолонкиСтрокой = СтрЗаменить(ИмяПоля, БазаИмени, "");
НомерКолонки = Число(НомерКолонкиСтрокой);
Возврат Новый Структура (
"БазаИмени, НомерКолонки",
БазаИмени,
НомерКолонки
);
КонецФункции
Функция ИмяПредыдущегоПоляВСтроке(ИмяПоля)
Данные = РаспарситьИмяПоля(ИмяПоля);
Если Данные.НомерКолонки = 1 Тогда
Возврат "";
КонецЕсли;
Результат = Данные.БазаИмени + (Данные.НомерКолонки - 1);
Возврат Результат;
КонецФункции
Функция ИмяСледующегоПоляВСтроке(ИмяПоля, МаксНомерКолонки = 100)
Данные = РаспарситьИмяПоля(ИмяПоля);
Если Данные.НомерКолонки = МаксНомерКолонки Тогда
Возврат "";
КонецЕсли;
Результат = Данные.БазаИмени + (Данные.НомерКолонки + 1);
Возврат Результат;
КонецФункции
Собственно функции, которые собирают значения ячеек строки и добавляют их к переданной структуре
Функция ПолучитьДанныеРасшифровкиПоИмени(Элемент, ИмяПоля, СтруктураОтбора = Неопределено)
Если СтруктураОтбора = Неопределено Тогда
СтруктураОтбора = Новый Структура;
КонецЕсли;
Расшифровка = Элемент.ПолучитьОбласть(ИмяПоля).ТекущаяОбласть.Расшифровка;
Если Расшифровка = Неопределено тогда
Возврат СтруктураОтбора;
КонецЕсли;
Поле = ДанныеРасшифровки.Элементы[Расшифровка];
СтруктураОтбора = ПолучитьРекурсивноСтруктуруОтбора(Поле, СтруктураОтбора);
Возврат СтруктураОтбора;
КонецФункции
Функция ПолучитьДанныеРасшифровкиЯчеекСтроки(Элемент, СтруктураОтбора = Неопределено)
Если СтруктураОтбора = Неопределено Тогда
СтруктураОтбора = Новый Структура;
КонецЕсли;
Если ТипЗнч(Элемент) = Тип("ПолеТабличногоДокумента") Тогда
ТекущееИмя = Элемент.ТекущаяОбласть.Имя;
ИмяСчетчик = ИмяПредыдущегоПоляВСтроке(ТекущееИмя);
Пока ИмяСчетчик <> "" Цикл
СтруктураОтбора = ПолучитьДанныеРасшифровкиПоИмени(Элемент, ИмяСчетчик, СтруктураОтбора);
ИмяСчетчик = ИмяПредыдущегоПоляВСтроке(ИмяСчетчик);
КонецЦикла;
ИмяСчетчик = ИмяСледующегоПоляВСтроке(ТекущееИмя);
Пока ИмяСчетчик <> "" Цикл
СтруктураОтбора = ПолучитьДанныеРасшифровкиПоИмени(Элемент, ИмяСчетчик, СтруктураОтбора);
ИмяСчетчик = ИмяСледующегоПоляВСтроке(ИмяСчетчик);
КонецЦикла;
КонецЕсли;
Возврат СтруктураОтбора;
КонецФункцииТеперь в обработке расшифровки мы можем получить структуру со значениями группировок и ячеек нашей строки
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Поле = ДанныеРасшифровки.Элементы[Расшифровка];
СтруктураОтбора = ПолучитьРекурсивноСтруктуруОтбора(Поле);
СтруктураОтбора = ПолучитьДанныеРасшифровкиЯчеекСтроки(Элемент, СтруктураОтбора);
КонецПроцедуры

