Работа с регистрами накопления является одной из базовых и наиболее часто встречающихся задач при разработке на платформе 1С. Регистр ВнутренниеЗаказы обычно используется в конфигурациях, построенных на классической архитектуре (таких как «Управление производственным предприятием 1.3» или «Управление торговлей 10.3»), для учета потребностей подразделений предприятия в товарах и материалах. Разберем подробно, как правильно извлекать данные из этого регистра, настраивать фильтры и получать дополнительные реквизиты номенклатуры.
Если нам необходимо получить историю всех движений (записей), которые были сделаны документами в регистре, мы обращаемся к его основной (физической) таблице. Рассмотрим простейший пример выбора регистраторов (документов, создавших записи):
ВЫБРАТЬ РАЗЛИЧНЫЕ
ВнутренниеЗаказы.Регистратор КАК ДокументДвижения
ИЗ
РегистрНакопления.ВнутренниеЗаказы КАК ВнутренниеЗаказы
В данном примере использование ключевого слова РАЗЛИЧНЫЕ позволяет нам избежать дублирования строк, если один и тот же документ сделал несколько записей в регистре (например, по разным строкам номенклатуры). Однако на практике нам чаще всего требуется детальная информация: номенклатура, количество и склад.
При работе в консоли запросов начинающие разработчики часто сталкиваются с тем, что установка периода в параметрах консоли не влияет на результат. Выясним причину: если запрос написан к физической таблице, условие по периоду должно быть явно прописано в секции ГДЕ. Проанализируем ситуацию на примере:
ВЫБРАТЬ
ВнутренниеЗаказы.Период,
ВнутренниеЗаказы.Номенклатура,
ВнутренниеЗаказы.Количество
ИЗ
РегистрНакопления.ВнутренниеЗаказы КАК ВнутренниеЗаказы
ГДЕ
ВнутренниеЗаказы.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
Здесь &ДатаНачала и &ДатаОкончания — это параметры, которые вы задаете в консоли запросов. Поле Период содержит дату и время совершения хозяйственной операции.
В конфигурациях, использующих регистр ВнутренниеЗаказы, склад-получатель часто фигурирует под именем измерения Заказчик. Это связано с тем, что заказчиком внутреннего заказа может выступать как конкретный склад, так и подразделение предприятия. Рассмотрим, как добавить фильтр по складу:
Заказчик.Заказчик В (&СписокСкладов) или Заказчик = &Склад.Если вы пишете код вручную, это будет выглядеть следующим образом:
ВЫБРАТЬ
ВнутренниеЗаказы.Номенклатура,
ВнутренниеЗаказы.Количество,
ВнутренниеЗаказы.Заказчик КАК Склад
ИЗ
РегистрНакопления.ВнутренниеЗаказы КАК ВнутренниеЗаказы
ГДЕ
ВнутренниеЗаказы.Заказчик = &НужныйСклад
Часто в отчет нужно вывести не только название номенклатуры, но и ее технические характеристики. Рассмотрим, как это реализовать наиболее эффективно.
Артикул является реквизитом справочника Номенклатура. В языке запросов 1С мы можем получить его через «точку» от поля номенклатуры. Платформа автоматически выполнит неявное соединение таблиц.
ВЫБРАТЬ
ВнутренниеЗаказы.Номенклатура.Артикул КАК Артикул,
ВнутренниеЗаказы.Номенклатура КАК Товар
ИЗ
РегистрНакопления.ВнутренниеЗаказы КАК ВнутренниеЗаказы
Штрихкод — ситуация сложнее. Штрихкоды обычно хранятся в независимом регистре сведений (например, Штрихкоды). Поскольку у одной номенклатуры может быть несколько штрихкодов, нам необходимо использовать ЛЕВОЕ СОЕДИНЕНИЕ, чтобы не потерять строки заказов, для которых штрихкод не задан.
Если ваша задача — увидеть не историю движений, а текущее состояние (сколько товара еще «висит» в заказах и не отгружено), использование физической таблицы будет ошибкой с точки зрения производительности и сложности логики. Правильнее использовать виртуальную таблицу Остатки.
Виртуальная таблица сама вычисляет итоги на указанный момент времени. Параметры (период и условия) передаются не в ГДЕ, а в скобках после имени таблицы. Проанализируем пример:
ВЫБРАТЬ
ВнутренниеЗаказыОстатки.Номенклатура,
ВнутренниеЗаказыОстатки.Заказчик,
ВнутренниеЗаказыОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ВнутренниеЗаказы.Остатки(&Период, ) КАК ВнутренниеЗаказыОстатки
Разберем продвинутый вариант, когда мы сначала выбираем данные из регистра во временную таблицу, а затем соединяем их со справочником единиц измерения и артикулами. Это позволяет структурировать код и ускорить выполнение сложных запросов.
// Шаг 1: Помещаем основные данные во временную таблицу
ВЫБРАТЬ
ВнутренниеЗаказы.Период КАК Дата,
ВнутренниеЗаказы.Номенклатура КАК Номенклатура,
ВнутренниеЗаказы.Количество КАК Количество,
ВнутренниеЗаказы.Регистратор.Номер КАК НомерДокумента,
ВнутренниеЗаказы.НомерСтроки КАК НомерСтроки
ПОМЕСТИТЬ ВТ_ДанныеЗаказов
ИЗ
РегистрНакопления.ВнутренниеЗаказы КАК ВнутренниеЗаказы
ГДЕ
ВнутренниеЗаказы.Регистратор ССЫЛКА Документ.ВнутреннийЗаказ;
////////////////////////////////////////////////////////////////////////////////
// Шаг 2: Выбираем из временной таблицы с добавлением артикула и единиц
ВЫБРАТЬ
ВТ.НомерДокумента КАК DOCNUMBER,
ВТ.Дата КАК DATE,
ВТ.НомерСтроки КАК Position,
ВТ.Номенклатура.Артикул КАК Артикул,
ВТ.Номенклатура КАК Товар,
ВТ.Количество КАК Quantity,
Единицы.Наименование КАК ЕдиницаИзмерения
ИЗ
ВТ_ДанныеЗаказов КАК ВТ
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЕдиницыИзмерения КАК Единицы
ПО ВТ.Номенклатура = Единицы.Владелец
И ВТ.Номенклатура.БазоваяЕдиницаИзмерения = Единицы.ЕдиницаПоКлассификатору
УПОРЯДОЧИТЬ ПО
DOCNUMBER,
Position
Важные замечания по коду:
ССЫЛКА в условии позволяет отфильтровать записи только по конкретному типу документа-регистратора.Регистратор.Номер позволяет получить строковый номер документа непосредственно в запросе.ЕдиницыИзмерения по владельцу и базовой единице помогает вывести корректное строковое представление единицы (например, «кг» или «шт»).Для оптимизации работы всегда рекомендуем использовать Конструктор запросов. Он вызывается контекстным меню (правой кнопкой мыши) в редакторе кода. Конструктор визуализирует связи между таблицами и помогает избежать синтаксических ошибок в именах полей 1С, таких как Регистратор, Номенклатура или Период.