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