Как выбрать номенклатуру без движений за определенный период в 1С?

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

При проведении инвентаризации, оптимизации складских запасов или аудите номенклатурного справочника часто возникает задача выявить позиции, по которым не было никаких движений (поступлений, перемещений, списаний или продаж) за длительный срок — например, за последний год. Разберем основные способы решения этой задачи с помощью языка запросов 1С и в схеме компоновки данных (СКД).

Логика построения запроса

Чтобы найти элементы справочника Номенклатура, по которым отсутствовали движения, необходимо выполнить следующие шаги:

  1. Выбрать список позиций номенклатуры, по которым зафиксированы обороты в регистре накопления за проверяемый интервал дат (задав параметры &ДатаНачала и &ДатаКонца).
  2. Соединить полный справочник Номенклатура с полученным списком движений.
  3. Оставить только те позиции справочника, для которых в регистре накопления отсутствуют записи за период (проверка на ЕСТЬ NULL).
  4. Отфильтровать группы справочника (папки), помеченные на удаление элементы и нематериальные сущности (услуги).

Вариант 1. Использование временной таблицы и левого соединения (рекомендуемый)

С точки зрения производительности реляционных СУБД (MS SQL Server, PostgreSQL) оптимальным подходом является предварительная выборка уникальных позиций с движениями во временную таблицу с индексацией, а затем левое соединение со справочником. Рассмотрим пример такого запроса:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ТоварыНаСкладахОбороты.Номенклатура КАК Номенклатура
ПОМЕСТИТЬ ВТ_НоменклатураСДвижениями
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаКонца, , ) КАК ТоварыНаСкладахОбороты
ИНДЕКСИРОВАТЬ ПО
    Номенклатура
;

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

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

  1. В виртуальную таблицу ТоварыНаСкладах.Обороты обязательно передаются границы периода &ДатаНачала и &ДатаКонца. Это позволяет платформе 1С читать только нужные итоги и записи, а не всю историю базы.
  2. Использование ИНДЕКСИРОВАТЬ ПО ускоряет последующее левое соединение на больших объемах данных.
  3. Условие ВТ_Движения.Номенклатура ЕСТЬ NULL отсекает все товары, которые попали во временную таблицу (то есть имели хотя бы один оборот за период).
  4. Дополнительные условия НЕ СпрНоменклатура.ЭтоГруппа, НЕ СпрНоменклатура.ПометкаУдаления и НЕ СпрНоменклатура.Услуга исключают служебные и неактуальные строки.

Вариант 2. Использование подзапроса с условием «НЕ В»

Посмотрим на более компактный вариант запроса, где проверка оборотов вынесена в подзапрос. Такой синтаксис часто используется для быстрых выборок в консоли запросов:


ВЫБРАТЬ
    СпрНоменклатура.Ссылка КАК Номенклатура,
    СпрНоменклатура.Код КАК Код
ИЗ
    Справочник.Номенклатура КАК СпрНоменклатура
ГДЕ
    НЕ СпрНоменклатура.ЭтоГруппа
    И НЕ СпрНоменклатура.ПометкаУдаления
    И НЕ СпрНоменклатура.Ссылка В
            (ВЫБРАТЬ РАЗЛИЧНЫЕ
                Обороты.Номенклатура
            ИЗ
                РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаКонца, , ) КАК Обороты)
УПОРЯДОЧИТЬ ПО
    СпрНоменклатура.Наименование

Обратите внимание: на сверхбольших справочниках (сотни тысяч элементов) конструкция с НЕ ... В (ВЫБРАТЬ ...) может уступать по скорости варианту с временной таблицей и левым соединением из-за особенностей построения плана запроса в СУБД.

Выбор регистра для анализа

Выясним, какой регистр накопления следует использовать в качестве источника данных:

  1. Регистр «Товары на складах» (или «Товары в рознице») — наиболее универсальный вариант для оперативного складского учета. Он отражает все фактические приходы, расходы и перемещения товаров.
  2. Регистр «Партии товаров на складах» — подходит для конфигураций с традиционным партионным учетом (например, УТ 10.3, КА 1.1, УПП 1.3). Однако стоит учитывать: если в программе включен режим расширенной аналитики учета затрат (РАУЗ) или списание партий выполняется регламентной обработкой с задержкой, данные в этом регистре могут быть неполными или отсутствовать вовсе.

Реализация в схеме компоновки данных (СКД)

Если отчет строится в СКД, нет необходимости жестко прописывать отбор в тексте запроса. Разберем порядок настройки:

  1. Создаем набор данных — запрос, в котором связываем справочник Номенклатура и виртуальную таблицу Обороты через ЛЕВОЕ СОЕДИНЕНИЕ.
  2. В параметрах виртуальной таблицы указываем стандартные параметры СКД: &НачалоПериода и &КонецПериода.
  3. На вкладке Настройки в отборах отчета добавляем условие: КоличествоОборот Не Заполнено (или КоличествоОборот Равно 0).
  4. При формировании отчета пользователь указывает нужный интервал в настройках (например, «Прошлый год» или «С начала текущего года»), и система автоматически отбирает только неактивные позиции.
← На главную