Как настроить СКД для корректной расшифровки по полю без вывода его в пользовательские отборы

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

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

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

Разберем детально, почему так происходит и какими способами можно решить эту задачу в 1С.

Причина поведения платформы при расшифровке

Рассмотрим механику работы расшифровки: когда пользователь выбирает пункт «Расшифровать...» в сформированном отчете, платформа считывает состав группировок текущей строки из объекта ДанныеРасшифровки и создает новый макет компоновки с автоматически добавленными элементами отбора.

Для того чтобы компоновщик макета мог наложить отбор по полю группировки, это поле обязательно должно быть доступно для отбора в системе компоновки данных. Если поле исключено из доступных полей или в запросе не указан элемент {ГДЕ ИзмерениеБ}, механизм расшифровки теряет возможность отфильтровать данные по этому измерению.

Способ 1. Использование свойства «Режим отображения» отбора

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

Проанализируем порядок действий для этого решения:

  1. Разрешим поле для отбора в схеме компоновки данных. В запросе СКД обязательно указываем спецификатор расширения языка запросов:
    
    ВЫБРАТЬ
        Таблица.ИзмерениеА КАК ИзмерениеА,
        Таблица.ИзмерениеБ КАК ИзмерениеБ,
        Таблица.ЗначениеРесурса КАК ЗначениеРесурса
    ИЗ
        РегистрНакопления.Продажи КАК Таблица
    {ГДЕ
        Таблица.ИзмерениеБ.*}
    
  2. В настройках компоновки данных (на вкладке «Отбор» или в структуре отчета) создадим элемент отбора по полю ИзмерениеБ.
  3. Установим для созданного элемента отбора свойство Режим отображения в значение Недоступен (или снимаем флаг вывода в пользовательские настройки).

В результате универсальные формы отчетов БСП не выведут данное поле в пользовательскую панель отборов, и пользователь не сможет изменить его при обычном формировании. При этом механизм расшифровки 1С сохранит доступ к полю и сформирует детализацию корректно.

Способ 2. Программная обработка события расшифровки

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

Для реализации этого подхода выполним следующие шаги:

  1. В форме отчета подключим обработчик события РезультатОбработкаРасшифровки.
  2. Отключим стандартную обработку и программно считаем значения измерений из текущей строки:
    
    &НаКлиенте
    Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
        
        СтандартнаяОбработка = Ложь;
        
        // Передаем обработку на сервер для анализа данных расшифровки
        ОбработатьРасшифровкуНаСервере(Расшифровка);
        
    КонецПроцедуры
    
  3. На сервере извлекаем текущее значение измерения из объекта ДанныеРасшифровкиКомпоновкиДанных и открываем форму детализирующего отчета с явной передачей структуры отбора:
    
    &НаСервере
    Процедура ОбработатьРасшифровкуНаСервере(ИдентификаторРасшифровки)
        
        ДанныеРасшифровкиОбъект = ПолучитьИзВременногоХранилища(ДанныеРасшифровки);
        ЭлементРасшифровки = ДанныеРасшифровкиОбъект.Элементы[ИдентификаторРасшифровки];
        
        // Получаем значения полей текущей группировки
        ПоляРасшифровки = Новый Структура;
        Для Каждого Измерение Из ЭлементРасшифровки.ПолучитьПоля() Цикл
            ПоляРасшифровки.Вставить(Измерение.Имя, Измерение.Значение);
        КонецЦикла;
        
        // Формируем параметры открытия детализирующего отчета
        // ...
    КонецПроцедуры
    

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

Посмотрим на ещё один метод, который применяется при использовании пользовательских макетов оформления ячеек в СКД.

В настройках макета поля на вкладке «Макетов» для ячейки вывода группировки заполняется свойство ПараметрРасшифровки. Вместо стандартного значения расшифровки можно передать выражение или структурированный параметр. При клике на ячейку платформа передает в контекст переопределенное значение, что позволяет обойти ограничение доступности полей отбора при создании уточняющего отчета.

Итоги

Для сохранения корректной работы расшифровки в СКД поле обязательно должно присутствовать в контексте компоновки. Оптимальным решением является использование свойства РежимОтображения.Недоступен для элементов отбора, что позволяет скрыть поле от пользователя в интерфейсе отчета без отключения механизмов платформы 1С.

← На главную