Как настроить отбор по группе иерархии в запросе СКД без возможности изменения пользователем?

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

При разработке отчетов на базе схемы компоновки данных часто возникает задача жестко ограничить выборку данных определенной папкой справочника (например, отобрать номенклатуру только из группы «Аксессуары»). При этом требуется, чтобы пользователь не мог изменить это условие и даже не видел его в настройках отчета.

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

Почему нельзя сослаться на конкретную группу прямо в тексте запроса

Разберем причину, по которой попытка указать конкретный элемент справочника в конфигураторе вызывает затруднения. Схема компоновки данных настраивается на уровне метаданных в конфигураторе. Конфигуратор оперирует структурой объектов и предопределенными элементами, но не имеет прямого доступа к конкретным ссылкам элементов, созданных пользователями в режиме «1С:Предприятие».

Если группа «Аксессуары» не является предопределенным элементом, платформа не знает ее уникального идентификатора на этапе компиляции схемы. Поэтому прямое указание значения без дополнительных механизмов невозможно.

Вариант 1. Использование параметра СКД с ограничением доступности и выражением

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

Разберем реализацию по шагам:

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

В результате при формировании отчета СКД сама вычислит ссылку на группу и подставит ее в условие, а пользователь не увидит параметр в списке настроек.

Вариант 2. Использование предопределенного элемента

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

Если группа создана в конфигураторе как предопределенная (с именем, например, Аксессуары), мы получаем возможность обратиться к ней через литерал ЗНАЧЕНИЕ() прямо в тексте запроса без использования параметров:


ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Количество КАК Количество,
    РеализацияТоваровУслугТовары.Сумма КАК Сумма,
    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Номенклатура В ИЕРАРХИИ (ЗНАЧЕНИЕ(Справочник.Номенклатура.Аксессуары))

Это решение является максимально производительным и надежным, так как исключает сбои при случайном переименовании папки пользователями в режиме «1С:Предприятие».

Вариант 3. Подзапрос в секции ГДЕ

Посмотрим на вариант, предложенный на форуме: получение ссылки на группу через вложенный подзапрос к справочнику прямо в условии ГДЕ.


ВЫБРАТЬ
    РеализацияТоваровУслугТовары.Количество КАК Количество,
    РеализацияТоваровУслугТовары.Сумма КАК Сумма,
    РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура
ИЗ
    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
    РеализацияТоваровУслугТовары.Номенклатура В ИЕРАРХИИ
        (ВЫБРАТЬ ПЕРВЫЕ 1
            СправочникНоменклатура.Ссылка
        ИЗ
            Справочник.Номенклатура КАК СправочникНоменклатура
        ГДЕ
            СправочникНоменклатура.Наименование = "Аксессуары"
            И СправочникНоменклатура.ЭтоГруппа = ИСТИНА)

Такой подход решает задачу без настройки вкладки параметров, однако несет в себе серьезные архитектурные риски:

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

Вариант 4. Настройка отбора в варианте отчета

Рассмотрим еще один способ, не требующий жесткого прописывания группы в тексте запроса. В запросе СКД условие ГДЕ не накладывается вовсе, а отбор задается на вкладке Настройки:

  1. В поле отбора добавляем поле Номенклатура с видом сравнения В иерархии.
  2. В режиме «1С:Предприятие» выбираем группу «Аксессуары».
  3. В свойствах элемента отбора отключаем флажок включения в пользовательские настройки или устанавливаем режим редактирования Недоступный.
  4. Сохраняем данный вариант отчета как стандартный для всех пользователей информационной базы.

Таким образом, для закрытых от модификации типовых конфигураций оптимальным выбором будет Вариант 1 (выражение в параметрах с ограничением доступности), а для дорабатываемых систем — Вариант 2 (предопределенный элемент справочника).

← На главную