Почему при проведении Заказа покупателя в 1С:УНФ формируется две записи в регистре «Запасы и затраты» и как рассчитать свободный остаток?

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

При работе с конфигурацией 1С:Управление нашей фирмой многие разработчики, привыкшие к архитектуре 1С:Управление торговлей или 1С:ERP, сталкиваются с необычным поведением регистра Запасы и затраты. При проведении документа Заказ покупателя система создает две записи для одной номенклатуры: одну с расходом, другую с приходом. Давайте разберемся, зачем это нужно и как правильно работать с такими данными.

Понимаем архитектуру регистра «Запасы и затраты»

В отличие от более сложных конфигураций, где резервирование может выделяться в отдельные ресурсы регистра или даже в отдельные регистры накопления, в 1С:УНФ резервы и физические остатки ведутся в рамках одного регистра. Принцип работы основан на изменении аналитического разреза (измерения) Заказ покупателя.

Когда товар резервируется под конкретный заказ, происходит «перемещение» количества из состояния «свободный остаток» в состояние «зарезервированный под заказ»:

  1. Запись с расходом (минус) по строке, где измерение Заказ покупателя не заполнено (пустая ссылка). Это означает списание товара из свободных остатков.
  2. Запись с приходом (плюс) по строке, где в измерении Заказ покупателя указан текущий документ. Это означает фиксацию резерва за данным заказом.

Такой подход обеспечивает высокую производительность, так как для получения данных не нужно выполнять сложные соединения (JOIN) между таблицами. Все необходимые показатели находятся внутри одной таблицы.

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

Так как остатки и резервы — это одна физическая величина, разделенная по измерениям, логика формирования запросов становится предельно простой. Чтобы получить свободный остаток, мы должны исключить записи, в которых товар закреплен за конкретным заказом.

Рассмотрим пример запроса, который выбирает только свободный остаток на складе:


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

Если же нам необходимо получить общий остаток товара (вне зависимости от того, зарезервирован он или нет), мы просто не накладываем условие на измерение Заказ покупателя. В этом случае система просуммирует значения всех записей, так как в сумме «расход со свободного» и «приход на заказ» дают ноль, но общий итог по номенклатуре останется неизменным.

Анализ состояния резервов

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


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

Почему это удобно?

Разберем основные преимущества такой структуры данных, которую внедрили разработчики 1С:УНФ:

Таким образом, когда вы видите в движениях документа Заказ покупателя пару записей, не стоит пугаться — это стандартный механизм переноса товара из статуса «свободный» в статус «под заказ» внутри регистра Запасы и затраты. Понимание того, что пустое значение измерения Заказ покупателя означает свободный товар, а заполненное — зарезервированный, позволяет легко строить любые отчеты и выводить корректные данные для пользователей.

← На главную