При доработке механизмов проведения документов в конфигурации «Управление торговлей 10.3» разработчики нередко сталкиваются с необходимостью связать партию оприходованного товара с документом-основанием, например, с документом ИнвентаризацияТоваровНаСкладе. Попытка напрямую изменить поле Регистратор в коллекции движений приводит к ошибкам платформы. Разберем, почему возникает эта проблема, как устроена работа регистраторов в 1С:Предприятии и где именно в типовой архитектуре УТ 10.3 следует переопределять партионный документ.
Рассмотрим код, с которого часто начинаются неудачные попытки переопределения партий:
Движения.ПартииТоваровНаСкладах.Отбор.Регистратор = Движения.ПартииТоваровНаСкладах.Регистратор.Значение.ИнвентаризацияТоваровНаСкладе;
В этом случае платформа выдает ошибку о том, что поле Регистратор не доступно для записи, либо сообщает, что метод объекта не обнаружен при вызове метода Установить().
Выясним причину такого поведения платформы 1С:Предприятие:
Движения в модуле объекта документа содержит коллекцию наборов записей, изначально привязанных к ссылке текущего проводимого документа (ЭтотОбъект.Ссылка). Платформа на уровне ядра запрещает изменять отбор по регистратору внутри штатной коллекции Движения, чтобы исключить повреждение структуры данных.Регистратор указывает на документ, который физически сформировал запись в базе данных. Если движение создает документ ОприходованиеТоваров, то именно он является регистратором. Документ ИнвентаризацияТоваровНаСкладе в типовой конфигурации является непроводимым (выполняет роль сличительной ведомости), не входит в список регистраторов регистра накопления и не может формировать движения.Движения.ПартииТоваровНаСкладах представляет собой коллекцию строк (набор записей), а не отдельную строку. Нельзя обратиться к реквизитам или измерениям напрямую через точку от коллекции.В конфигурациях на базе классического партионного учета (УТ 10.3, УПП 1.3, КА 1.1) сущность «партия» определяется не системным полем Регистратор, а специальным измерением регистра накопления ПартииТоваровНаСкладах — измерением ДокументОприходования. Именно это измерение хранит ссылку на документ, сформировавший себестоимость и определивший дату образования партии для списания по алгоритмам FIFO или LIFO.
Следовательно, для привязки партии к инвентаризации необходимо передавать ссылку именно в измерение ДокументОприходования, а не подменять системный Регистратор.
Разберем по шагам, как правильно реализовать заполнение партии при проведении документа ОприходованиеТоваров.
ПартииТоваровНаСкладах (а также ПартииТоваровНаСкладахБухгалтерскийУчет и ПартииТоваровНаСкладахНалоговыйУчет, если они используются). В свойствах измерения ДокументОприходования проверим тип данных. Если типа ДокументСсылка.ИнвентаризацияТоваровНаСкладе в списке нет, его необходимо добавить, иначе платформа запишет в измерение пустое значение.ОбработкаПроведения, а через специализированные процедуры подготовки таблиц движений. Найдем в модуле объекта документа процедуру ЗаполнитьПоляПартииТоваровНаСкладах.ДокументОприходования в зависимости от заполненности реквизита шапки:
Процедура ЗаполнитьПоляПартииТоваровНаСкладах(ТаблицаТЧ, ТаблицаДвижений, СтруктураШапкиДокумента)
ТаблицаТЧ.Индексы.Добавить("НомерСтроки");
Для Каждого СтрокаДвижений Из ТаблицаДвижений Цикл
// Проверка ведения партионного учета по складам
Если НЕ СтруктураШапкиДокумента.ВестиПартионныйУчетПоСкладам Тогда
СтрокаДвижений.Склад = Неопределено;
КонецЕсли;
СтрокаДвижений.СтатусПартии = Перечисления.СтатусыПартийТоваров.Купленный;
// Установка документа партии
Если ЗначениеЗаполнено(ИнвентаризацияТоваровНаСкладе) Тогда
СтрокаДвижений.ДокументОприходования = ИнвентаризацияТоваровНаСкладе;
Иначе
СтрокаДвижений.ДокументОприходования = Ссылка;
КонецЕсли;
// Проверка партионного учета по сериям
СтрокаТЧ = ТаблицаТЧ.Найти(СтрокаДвижений.НомерСтроки, "НомерСтроки");
Если СтрокаТЧ <> Неопределено И НЕ СтрокаТЧ.ВестиПартионныйУчетПоСериям Тогда
СтрокаДвижений.СерияНоменклатуры = Неопределено;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Проанализируем последствия ручной подмены партионного документа на непроводимый документ инвентаризации:
ПроведениеПоПартиям, расчет партий будет выполняться общими модулями. При перезаполнении таблиц общие механизмы могут затереть нестандартный документ оприходования, если логика не перенесена в соответствующий общий модуль партионного учета.ДокументОприходования. Если документ ИнвентаризацияТоваровНаСкладе оформлен более ранней датой, чем фактическое ОприходованиеТоваров, партия получит приоритет при списании себестоимости, что повлияет на финансовый результат.ДокументОприходования.ИнвентаризацияТоваровНаСкладе. Если требуется выделить товар конкретной инвентаризации, рекомендуется использовать разделение по сериям номенклатуры.