Как выбрать данные из регистра накопления «Внутренние заказы» с помощью запроса

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

Работа с регистрами накопления является одной из базовых и наиболее часто встречающихся задач при разработке на платформе 1С. Регистр ВнутренниеЗаказы обычно используется в конфигурациях, построенных на классической архитектуре (таких как «Управление производственным предприятием 1.3» или «Управление торговлей 10.3»), для учета потребностей подразделений предприятия в товарах и материалах. Разберем подробно, как правильно извлекать данные из этого регистра, настраивать фильтры и получать дополнительные реквизиты номенклатуры.

Основы построения запроса к физической таблице регистра

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


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВнутренниеЗаказы.Регистратор КАК ДокументДвижения
ИЗ
    РегистрНакопления.ВнутренниеЗаказы КАК ВнутренниеЗаказы

В данном примере использование ключевого слова РАЗЛИЧНЫЕ позволяет нам избежать дублирования строк, если один и тот же документ сделал несколько записей в регистре (например, по разным строкам номенклатуры). Однако на практике нам чаще всего требуется детальная информация: номенклатура, количество и склад.

Настройка периода и условий фильтрации

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


ВЫБРАТЬ
    ВнутренниеЗаказы.Период,
    ВнутренниеЗаказы.Номенклатура,
    ВнутренниеЗаказы.Количество
ИЗ
    РегистрНакопления.ВнутренниеЗаказы КАК ВнутренниеЗаказы
ГДЕ
    ВнутренниеЗаказы.Период МЕЖДУ &ДатаНачала И &ДатаОкончания

Здесь &ДатаНачала и &ДатаОкончания — это параметры, которые вы задаете в консоли запросов. Поле Период содержит дату и время совершения хозяйственной операции.

Особенности измерений: где искать Склад?

В конфигурациях, использующих регистр ВнутренниеЗаказы, склад-получатель часто фигурирует под именем измерения Заказчик. Это связано с тем, что заказчиком внутреннего заказа может выступать как конкретный склад, так и подразделение предприятия. Рассмотрим, как добавить фильтр по складу:

  1. Откроем конструктор запроса и перейдем на закладку «Условия».
  2. Выберем поле Заказчик.
  3. Установим условие Заказчик В (&СписокСкладов) или Заказчик = &Склад.

Если вы пишете код вручную, это будет выглядеть следующим образом:


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

Получение дополнительных данных: Артикул и Штрихкод

Часто в отчет нужно вывести не только название номенклатуры, но и ее технические характеристики. Рассмотрим, как это реализовать наиболее эффективно.

Артикул является реквизитом справочника Номенклатура. В языке запросов 1С мы можем получить его через «точку» от поля номенклатуры. Платформа автоматически выполнит неявное соединение таблиц.


ВЫБРАТЬ
    ВнутренниеЗаказы.Номенклатура.Артикул КАК Артикул,
    ВнутренниеЗаказы.Номенклатура КАК Товар
ИЗ
    РегистрНакопления.ВнутренниеЗаказы КАК ВнутренниеЗаказы

Штрихкод — ситуация сложнее. Штрихкоды обычно хранятся в независимом регистре сведений (например, Штрихкоды). Поскольку у одной номенклатуры может быть несколько штрихкодов, нам необходимо использовать ЛЕВОЕ СОЕДИНЕНИЕ, чтобы не потерять строки заказов, для которых штрихкод не задан.

Использование виртуальных таблиц для получения остатков

Если ваша задача — увидеть не историю движений, а текущее состояние (сколько товара еще «висит» в заказах и не отгружено), использование физической таблицы будет ошибкой с точки зрения производительности и сложности логики. Правильнее использовать виртуальную таблицу Остатки.

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


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

Комплексный пример запроса с временной таблицей

Разберем продвинутый вариант, когда мы сначала выбираем данные из регистра во временную таблицу, а затем соединяем их со справочником единиц измерения и артикулами. Это позволяет структурировать код и ускорить выполнение сложных запросов.


// Шаг 1: Помещаем основные данные во временную таблицу
ВЫБРАТЬ
    ВнутренниеЗаказы.Период КАК Дата,
    ВнутренниеЗаказы.Номенклатура КАК Номенклатура,
    ВнутренниеЗаказы.Количество КАК Количество,
    ВнутренниеЗаказы.Регистратор.Номер КАК НомерДокумента,
    ВнутренниеЗаказы.НомерСтроки КАК НомерСтроки
ПОМЕСТИТЬ ВТ_ДанныеЗаказов
ИЗ
    РегистрНакопления.ВнутренниеЗаказы КАК ВнутренниеЗаказы
ГДЕ
    ВнутренниеЗаказы.Регистратор ССЫЛКА Документ.ВнутреннийЗаказ;

////////////////////////////////////////////////////////////////////////////////
// Шаг 2: Выбираем из временной таблицы с добавлением артикула и единиц
ВЫБРАТЬ
    ВТ.НомерДокумента КАК DOCNUMBER,
    ВТ.Дата КАК DATE,
    ВТ.НомерСтроки КАК Position,
    ВТ.Номенклатура.Артикул КАК Артикул,
    ВТ.Номенклатура КАК Товар,
    ВТ.Количество КАК Quantity,
    Единицы.Наименование КАК ЕдиницаИзмерения
ИЗ
    ВТ_ДанныеЗаказов КАК ВТ
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЕдиницыИзмерения КАК Единицы
        ПО ВТ.Номенклатура = Единицы.Владелец
        И ВТ.Номенклатура.БазоваяЕдиницаИзмерения = Единицы.ЕдиницаПоКлассификатору
УПОРЯДОЧИТЬ ПО
    DOCNUMBER,
    Position

Важные замечания по коду:

  1. Использование ССЫЛКА в условии позволяет отфильтровать записи только по конкретному типу документа-регистратора.
  2. Обращение к Регистратор.Номер позволяет получить строковый номер документа непосредственно в запросе.
  3. Соединение со справочником ЕдиницыИзмерения по владельцу и базовой единице помогает вывести корректное строковое представление единицы (например, «кг» или «шт»).

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

← На главную