Как написать запросы для выборки номенклатуры без продаж и поиска актуального курса валюты?

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

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

Задача 1: Выборка номенклатуры, по которой не было отгрузок за период

Для поиска позиций, которые не фигурировали в продажах, мы можем использовать несколько подходов. Рассмотрим самые эффективные из них.

Способ 1: Использование левого соединения

Этот метод считается наиболее производительным. Мы берем все справочники номенклатуры и «присоединяем» к ним данные о продажах. Если после соединения поле из регистра оказалось пустым (NULL), значит, продаж по данной позиции не было.


ВЫБРАТЬ
    СпрНоменклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ
    РегистрНакоплений.Продажи.Обороты КАК ПродажиОбороты
ПО
    СпрНоменклатура.Ссылка = ПродажиОбороты.Номенклатура
ГДЕ
    ПродажиОбороты.Номенклатура ЕСТЬ NULL

Способ 2: Использование конструкции НЕ В

Этот метод более нагляден, но при очень больших объемах данных в оборотных регистрах может работать медленнее, чем левое соединение.


ВЫБРАТЬ
    СпрНоменклатура.Ссылка
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
ГДЕ
    НЕ СпрНоменклатура.Ссылка В (
        ВЫБРАТЬ Номенклатура ИЗ РегистрНакоплений.Продажи.Обороты
    )

Задача 2: Получение курса валюты на заданную дату без виртуальных таблиц

Иногда требуется получить значение курса, которое было актуально на конкретный момент времени, не прибегая к использованию виртуальной таблицы СрезПоследних. Для этого нам нужно найти «последнюю» дату, которая меньше или равна искомой, и сопоставить её с таблицей курсов.

Рассмотрим алгоритм действий:

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

ВЫБРАТЬ
    вв2.Дата,
    вв2.Курс
ИЗ (
    ВЫБРАТЬ
        МАКСИМУМ(вв.Дата) КАК МаксДата
    ИЗ
        РегистрСведений.КурсыВалют КАК вв
    ГДЕ
        вв.Дата <= &Период
) КАК вв
ЛЕВОЕ СОЕДИНЕНИЕ
    РегистрСведений.КурсыВалют КАК вв2
ПО
    вв.МаксДата = вв2.Дата
ГДЕ
    НЕ вв2.Валюта ЕСТЬ NULL

Почему важно понимать разницу между запросами?

Разберем, почему разработчики часто спорят о методах написания запросов:

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

← На главную