Почему не отображается расшифровка отчета при программной компоновке и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с Системой компоновки данных (СКД) разработчики часто сталкиваются с необходимостью полностью контролировать процесс формирования отчета. Это требуется для использования внешних наборов данных, программной коррекции настроек или вывода в нетипичные формы. Однако при установке СтандартнаяОбработка = Ложь в процедуре ПриКомпоновкеРезультата часто «отваливается» стандартная расшифровка. Разберем детально, почему это происходит и как вернуть интерактивность вашим отчетам.

Анализ проблемы: где теряется связь?

В типовом механизме СКД платформа берет на себя всю цепочку передачи данных: от схемы до формирования ячеек в ТабличныйДокумент. Когда мы перехватываем управление, мы обязаны сами воссоздать эту цепочку. Если расшифровка не работает (при нажатии на ячейку ничего не происходит или открывается стандартное меню без действий СКД), это означает, что в ячейках результирующего документа отсутствует связь с объектом ДанныеРасшифровкиКомпоновкиДанных.

Рассмотрим стандартную, но ошибочную последовательность действий в процедуре ПриКомпоновкеРезультата:


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

Шаг 1. Исправление инициализации процессора компоновки

Самая критическая ошибка кроется в методе Инициализировать объекта ПроцессорКомпоновкиДанных. Проанализируем ситуацию: даже если вы передали переменную ДанныеРасшифровки в КомпоновщикМакета.Выполнить, это лишь подготовило макет. Чтобы сам процессор при генерации результата заполнял идентификаторы расшифровки в каждой строке, он должен знать, в какой объект их записывать.

Правильный код инициализации:


// Третий параметр метода Инициализировать — это и есть наши данные расшифровки
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);

Без этого параметра ПроцессорКомпоновкиДанных сформирует «немой» результат — данные будут выведены, но свойства ячеек, отвечающие за расшифровку, останутся пустыми.

Шаг 2. Работа с переменной ДанныеРасшифровки

Выясним причину, по которой нельзя просто написать ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных. В управляемых формах параметр ДанныеРасшифровки, приходящий в процедуру ПриКомпоновкеРезультата, — это не сам объект, а строковый идентификатор (адрес во временном хранилище). Если мы присвоим этой переменной новый объект, мы «потеряем» ссылку, которую ждет форма отчета для обработки кликов.

Как правильно поступить:

  1. Если вы работаете в стандартной форме отчета, платформа сама создаст объект по завершении процедуры, если вы правильно заполнили передаваемую переменную.
  2. Если вы все же создаете объект вручную, его нужно инициализировать и убедиться, что он «проброшен» через все этапы компоновки.

Проанализируем правильную структуру формирования, исключив лишнее переопределение:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Берем текущие настройки из компоновщика
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // Не создаем "Новый ДанныеРасшифровкиКомпоновкиДанных", 
    // если платформа уже предоставила контейнер
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    // Обязательно передаем ДанныеРасшифровки третьим параметром
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    
КонецПроцедуры

Шаг 3. Нюансы использования внешних данных

Если ваша задача включает использование внешних наборов данных (например, таблицы значений), расшифровка может не работать, даже если код выше написан верно. Рассмотрим важные моменты:

Типизация полей: Убедитесь, что в схеме компоновки данных для полей внешнего набора данных четко указаны типы. Если 1С не понимает, что поле является ссылкой на справочник Номенклатура, она не сможет предложить стандартные действия (открыть карточку, сформировать отчет по движениям).

Передача внешних данных: При инициализации процессора компоновки не забудьте передать саму таблицу с данными:


ВнешниеДанные = Новый Структура("МояТаблица", ТаблицаСДанными);
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеДанные, ДанныеРасшифровки);

Шаг 4. Свойства Табличного Документа

Проанализируем ситуацию, когда код идеален, но расшифровка всё равно не открывается. Проверьте свойства ДокументРезультат (Табличного документа):

Это связано с тем, что в режиме редактирования двойной клик входит в режим правки текста ячейки, а не инициирует событие расшифровки.

Итоги

Для того чтобы программная компоновка отчета сохранила всю мощь интерактивности СКД, необходимо соблюдать «правило трех точек». Объект расшифровки должен быть последовательно передан в:

  1. КомпоновщикМакета.Выполнить() — для подготовки структуры расшифровки в макете.
  2. ПроцессорКомпоновкиДанных.Инициализировать() — для связки конкретных выводимых данных с идентификаторами.
  3. (В случае ручного вывода в форму) Результат.ДанныеРасшифровки — для связи табличного поля на форме с адресом в хранилище.

Соблюдение этого порядка гарантирует, что ваши отчеты будут работать так же корректно, как и при использовании стандартных механизмов платформы.

← На главную