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