При работе с конфигурацией 1С:Управление нашей фирмой многие разработчики, привыкшие к архитектуре 1С:Управление торговлей или 1С:ERP, сталкиваются с необычным поведением регистра Запасы и затраты. При проведении документа Заказ покупателя система создает две записи для одной номенклатуры: одну с расходом, другую с приходом. Давайте разберемся, зачем это нужно и как правильно работать с такими данными.
В отличие от более сложных конфигураций, где резервирование может выделяться в отдельные ресурсы регистра или даже в отдельные регистры накопления, в 1С:УНФ резервы и физические остатки ведутся в рамках одного регистра. Принцип работы основан на изменении аналитического разреза (измерения) Заказ покупателя.
Когда товар резервируется под конкретный заказ, происходит «перемещение» количества из состояния «свободный остаток» в состояние «зарезервированный под заказ»:
Заказ покупателя не заполнено (пустая ссылка). Это означает списание товара из свободных остатков.Заказ покупателя указан текущий документ. Это означает фиксацию резерва за данным заказом.Такой подход обеспечивает высокую производительность, так как для получения данных не нужно выполнять сложные соединения (JOIN) между таблицами. Все необходимые показатели находятся внутри одной таблицы.
Так как остатки и резервы — это одна физическая величина, разделенная по измерениям, логика формирования запросов становится предельно простой. Чтобы получить свободный остаток, мы должны исключить записи, в которых товар закреплен за конкретным заказом.
Рассмотрим пример запроса, который выбирает только свободный остаток на складе:
ВЫБРАТЬ
ЗапасыОстатки.Номенклатура КАК Номенклатура,
ЗапасыОстатки.КоличествоОстаток КАК СвободныйОстаток
ИЗ
РегистрНакопления.ЗапасыИЗатраты.Остатки(&Период, ) КАК ЗапасыОстатки
ГДЕ
ЗапасыОстатки.ЗаказПокупателя = ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
Если же нам необходимо получить общий остаток товара (вне зависимости от того, зарезервирован он или нет), мы просто не накладываем условие на измерение Заказ покупателя. В этом случае система просуммирует значения всех записей, так как в сумме «расход со свободного» и «приход на заказ» дают ноль, но общий итог по номенклатуре останется неизменным.
Для того чтобы узнать объем товаров, зарезервированных под конкретный заказ, мы можем применить обратное условие в запросе:
ВЫБРАТЬ
ЗапасыОстатки.ЗаказПокупателя КАК Заказ,
ЗапасыОстатки.КоличествоОстаток КАК Зарезервировано
ИЗ
РегистрНакопления.ЗапасыИЗатраты.Остатки(&Период, ) КАК ЗапасыОстатки
ГДЕ
ЗапасыОстатки.ЗаказПокупателя <> ЗНАЧЕНИЕ(Документ.ЗаказПокупателя.ПустаяСсылка)
Разберем основные преимущества такой структуры данных, которую внедрили разработчики 1С:УНФ:
Заказ покупателя, вы получаете мгновенный отчет о том, под какие именно заказы распределены товары на складе.Таким образом, когда вы видите в движениях документа Заказ покупателя пару записей, не стоит пугаться — это стандартный механизм переноса товара из статуса «свободный» в статус «под заказ» внутри регистра Запасы и затраты. Понимание того, что пустое значение измерения Заказ покупателя означает свободный товар, а заполненное — зарезервированный, позволяет легко строить любые отчеты и выводить корректные данные для пользователей.