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