Что означает звездочка .* в запросе 1С и как отфильтровать данные по конкретному складу

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с отчетами в 1С (особенно построенными на ПостроителеОтчета или Системе компоновки данных) разработчики часто сталкиваются со специфическим синтаксисом в запросах: фигурные скобки {} и конструкции вида Склад.* КАК Склад. Разберем подробнее, зачем используется этот синтаксис, как он влияет на работу платформы и какими способами можно ограничить выборку остатков конкретным складом.

Назначение конструкции .* и фигурных скобок в запросах 1С

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

Проанализируем ключевые элементы этой конструкции:

  1. Фигурные скобки {} — указывают платформе на необязательность описанных внутри полей и условий. Если пользователь или алгоритм программы не задает отбор по указанному полю, этот кусок кода игнорируется при формировании итогового SQL-запроса. Если же отбор установлен, платформа автоматически встраивает условие в нужное место запроса.
  2. Символ звездочки .* — разрешает отбор не только по самой ссылке на объект (например, по конкретному элементу справочника Склады), но и по всем его реквизитам. Запись Склад.* дает возможность накладывать фильтры на поля Склад.ВидСклада, Склад.Ответственный, Склад.Код и другие свойства справочника.
  3. Размещение в параметрах виртуальной таблицы — когда фигурные скобки с полями указаны в параметрах виртуальной таблицы остатков (например, РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, {Склад.* КАК Склад})), платформа при установке пользователем отбора подставляет условие напрямую в параметры виртуальной таблицы СУБД. Это обеспечивает максимальное быстродействие, так как срез остатков рассчитывается только по выбранным складам, а не по всей базе.

Рассмотрим пример запроса с расширением языка запросов:


ВЫБРАТЬ
    Ост.Номенклатура КАК Номенклатура,
    Ост.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    Ост.КоличествоОстаток КАК Остаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, {Склад.* КАК Склад,
       Склад.ВидСклада.* КАК ВидСклада, Номенклатура.* КАК Номенклатура,
       Номенклатура.ЦеноваяГруппа.* КАК ЦеноваяГруппа}) КАК Ост

Как ограничить выборку конкретным складом

Если требуется получать остатки только по определенному складу (например, "Основной склад"), рассмотрим несколько правильных подходов в зависимости от задачи.

Способ 1. Использование механизма отборов отчета (без изменения текста запроса)

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

Пример установки отбора через код в ПостроителеОтчета:


// Устанавливаем отбор по конкретному складу
ЭлементОтбора = ПостроительОтчета.Отбор.Склад;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ВидСравнения  = ВидСравнения.Равно;
ЭлементОтбора.Значение      = ИскомыйСклад; // Ссылка на справочник Склады

Способ 2. Явное жесткое ограничение в тексте запроса через параметр

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


ВЫБРАТЬ
    Ост.Номенклатура КАК Номенклатура,
    Ост.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    Ост.КоличествоОстаток КАК Остаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Ост

В коде программы перед выполнением запроса передаем ссылку на нужный склад:


Запрос.УстановитьПараметр("Дата", НачПериода);
Запрос.УстановитьПараметр("Склад", СсылкаНаОсновнойСклад);

Почему не стоит фильтровать по наименованию склада

Попытка написать условие поиска по текстовому наименованию (например, Склад.Наименование = "Основной склад") считается ошибочной практикой в разработке 1С по следующим причинам:

  1. Ненадежность: Наименование справочника легко изменить в пользовательском режиме. При любом изменении названия или опечатке отчет перестанет выгружать данные.
  2. Производительность: Поиск и сравнение по строковым полям в СУБД выполняется значительно медленнее, чем сравнение по ссылке (уникальному идентификатору GUID).

Разберем рекомендации: всегда старайтесь передавать в параметры запросов или отборов конкретную ссылку на объект (полученную из предопределенных данных, настроек пользователя или реквизитов формы), а не искать элементы по наименованию.

← На главную