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