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