Ограничение и удаление доступных полей при расшифровке в СКД

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При формировании отчетов на базе Системы компоновки данных (СКД) пользователи часто используют интерактивную расшифровку ячеек (команда «Расшифровать...» по двойному клику или из контекстного меню). При этом выбывает стандартный диалог «Выбор поля», где платформа автоматически выводит список всех полей, доступных для группировки. В практических задачах часто требуется ограничить этот список — убрать служебные реквизиты, оставить только конкретные аналитические разрезы или скрыть пользовательские поля.

Рассмотрим подробно способы решения этой задачи: от стандартных настроек схемы компоновки данных до полной программной подмены диалога расшифровки.

Способ 1. Установка ограничений на использование полей в группировках СКД

Самый простой и эффективный способ скрыть ненужные поля из диалога выбора поля при расшифровке — настроить ограничения в самой схеме компоновки данных на уровне набора данных.

Разберем последовательность действий в конфигураторе:

  1. Откроем схему компоновки данных и перейдем на вкладку Наборы данных.
  2. В табличной части полей найдем нужное поле (или реквизит), которое необходимо скрыть из списка расшифровки.
  3. Найдем колонку Ограничение поля и раскроем ее свойства.
  4. Установим флаг Ограничение группировки для данного поля.

Важная деталь: если вы хотите скрыть из диалога расшифровки реквизиты составных объектов (например, реквизиты справочника ДоговорыКонтрагентов или Контрагенты), ограничение необходимо устанавливать как для самого родительского поля, так и для его дочерних реквизитов.

Программно задать такое ограничение до сбора отчета (например, в событии ПриКомпоновкеРезультата) можно обходом коллекции полей схемы компоновки данных:


Для Каждого Поле Из СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Поля Цикл
    Если Поле.Имя = "ДоговорКонтрагента" Тогда
        Поле.ОграничениеГруппировки = Истина;
    КонецЕсли;
КонецЦикла;

Способ 2. Ограничение для пользовательских полей

Пользовательские поля создаются не в самом наборе данных, а в настройках компоновщика данных, поэтому на них не распространяются стандартные ограничения набора данных. Если требуется исключить пользовательское поле из стандартного диалога выборки:

  1. Преобразуйте пользовательское поле в Вычисляемое поле схемы компоновки данных (на вкладке Вычисляемые поля).
  2. Для созданного вычисляемого поля на вкладке Наборы данных установите ограничение использования в группировках, как описано в первом способе.

Способ 3. Переопределение стандартного диалога расшифровки (программный метод)

Штатный диалог «Выбор поля» платформы не предоставляет прямой API-функции для динамического удаления элементов непосредственно в момент его открытия. Если необходимо предоставить пользователю строго ограниченный выбор или сразу выполнять переход к нужному отчету/документу без показа стандартных окон, следует отключить стандартную обработку в форме отчета.

Для этого используется событие таблицы формы РезультатОбработкаРасшифровки. В нем мы устанавливаем параметр СтандартнаяОбработка = Ложь и прописываем собственную логику.

Проанализируем пример кода, позволяющего извлечь значения текущей ячейки и ее родителей, чтобы выполнить расшифровку программно или вывести собственный диалог выбора:


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

Процедура ЗаполнитьЗначенияПолейРасшифровки(ЭлементРасшифровки, ЗначенияПолей)
    
    Перем Элемент;
    
    Если ТипЗнч(ЭлементРасшифровки) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
        Для Каждого Элемент Из ЭлементРасшифровки.ПолучитьПоля() Цикл
            Если НЕ Элемент.Иерархия Тогда
                ЗначенияПолей.Вставить(Элемент.Поле, Элемент.Значение);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    
    Родители = ЭлементРасшифровки.ПолучитьРодителей();
    Для Каждого Элемент Из Родители Цикл
        ЗаполнитьЗначенияПолейРасшифровки(Элемент, ЗначенияПолей);
    КонецЦикла;
    
КонецПроцедуры

Обратите внимание: использование коллекции Соответствие предпочтительнее коллекции Структура, так как имена пользовательских полей и полей СКД могут содержать спецсимволы и пробелы, не подходящие под требования к именам свойств структуры.

Способ 4. Использование объекта ОбработкаРасшифровкиКомпоновкиДанных

Для тонкой настройки действий доступен объект ОбработкаРасшифровкиКомпоновкиДанных. С его помощью можно применить подмененный ИсточникДоступныхНастроекКомпоновкиДанных, в котором заранее модифицирована схема (удалены нежелательные поля из группировок), либо ограничить массив ДоступныеДействия, оставив только конкретные операции (например, открытие значения вместо стандартной группировки).

Подводя итоги: для простого ограничения состава полей в стандартном окне достаточно воспользоваться галочкой Ограничение группировки в конфигураторе или перевести поле в статус вычисляемого. Для полного контроля над интерфейсом расшифровки оптимальным решением является отключение СтандартнаяОбработка и вызов собственного алгоритма.

← На главную