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