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