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