При работе с Системой компоновки данных (СКД) разработчики часто сталкиваются с необходимостью полностью контролировать процесс формирования отчета. Это требуется для использования внешних наборов данных, программной коррекции настроек или вывода в нетипичные формы. Однако при установке СтандартнаяОбработка = Ложь в процедуре ПриКомпоновкеРезультата часто «отваливается» стандартная расшифровка. Разберем детально, почему это происходит и как вернуть интерактивность вашим отчетам.
В типовом механизме СКД платформа берет на себя всю цепочку передачи данных: от схемы до формирования ячеек в ТабличныйДокумент. Когда мы перехватываем управление, мы обязаны сами воссоздать эту цепочку. Если расшифровка не работает (при нажатии на ячейку ничего не происходит или открывается стандартное меню без действий СКД), это означает, что в ячейках результирующего документа отсутствует связь с объектом ДанныеРасшифровкиКомпоновкиДанных.
Рассмотрим стандартную, но ошибочную последовательность действий в процедуре ПриКомпоновкеРезультата:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// ОШИБКА 1: Переопределение переменной
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
// ОШИБКА 2: Отсутствие передачи расшифровки в инициализатор
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
Самая критическая ошибка кроется в методе Инициализировать объекта ПроцессорКомпоновкиДанных. Проанализируем ситуацию: даже если вы передали переменную ДанныеРасшифровки в КомпоновщикМакета.Выполнить, это лишь подготовило макет. Чтобы сам процессор при генерации результата заполнял идентификаторы расшифровки в каждой строке, он должен знать, в какой объект их записывать.
Правильный код инициализации:
// Третий параметр метода Инициализировать — это и есть наши данные расшифровки
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
Без этого параметра ПроцессорКомпоновкиДанных сформирует «немой» результат — данные будут выведены, но свойства ячеек, отвечающие за расшифровку, останутся пустыми.
Выясним причину, по которой нельзя просто написать ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных. В управляемых формах параметр ДанныеРасшифровки, приходящий в процедуру ПриКомпоновкеРезультата, — это не сам объект, а строковый идентификатор (адрес во временном хранилище). Если мы присвоим этой переменной новый объект, мы «потеряем» ссылку, которую ждет форма отчета для обработки кликов.
Как правильно поступить:
Проанализируем правильную структуру формирования, исключив лишнее переопределение:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Берем текущие настройки из компоновщика
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Не создаем "Новый ДанныеРасшифровкиКомпоновкиДанных",
// если платформа уже предоставила контейнер
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
// Обязательно передаем ДанныеРасшифровки третьим параметром
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
Если ваша задача включает использование внешних наборов данных (например, таблицы значений), расшифровка может не работать, даже если код выше написан верно. Рассмотрим важные моменты:
Типизация полей: Убедитесь, что в схеме компоновки данных для полей внешнего набора данных четко указаны типы. Если 1С не понимает, что поле является ссылкой на справочник Номенклатура, она не сможет предложить стандартные действия (открыть карточку, сформировать отчет по движениям).
Передача внешних данных: При инициализации процессора компоновки не забудьте передать саму таблицу с данными:
ВнешниеДанные = Новый Структура("МояТаблица", ТаблицаСДанными);
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеДанные, ДанныеРасшифровки);
Проанализируем ситуацию, когда код идеален, но расшифровка всё равно не открывается. Проверьте свойства ДокументРезультат (Табличного документа):
ДокументРезультат.ТолькоПросмотр = Истина;.ДокументРезультат.Защита = Истина;.Это связано с тем, что в режиме редактирования двойной клик входит в режим правки текста ячейки, а не инициирует событие расшифровки.
Для того чтобы программная компоновка отчета сохранила всю мощь интерактивности СКД, необходимо соблюдать «правило трех точек». Объект расшифровки должен быть последовательно передан в:
КомпоновщикМакета.Выполнить() — для подготовки структуры расшифровки в макете.ПроцессорКомпоновкиДанных.Инициализировать() — для связки конкретных выводимых данных с идентификаторами.Результат.ДанныеРасшифровки — для связи табличного поля на форме с адресом в хранилище.Соблюдение этого порядка гарантирует, что ваши отчеты будут работать так же корректно, как и при использовании стандартных механизмов платформы.