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