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