Как правильно заполнить партионный документ в регистре ПартииТоваровНаСкладах при оприходовании товаров в УТ 10.3?

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

При доработке механизмов проведения документов в конфигурации «Управление торговлей 10.3» разработчики нередко сталкиваются с необходимостью связать партию оприходованного товара с документом-основанием, например, с документом ИнвентаризацияТоваровНаСкладе. Попытка напрямую изменить поле Регистратор в коллекции движений приводит к ошибкам платформы. Разберем, почему возникает эта проблема, как устроена работа регистраторов в 1С:Предприятии и где именно в типовой архитектуре УТ 10.3 следует переопределять партионный документ.

Анализ типичных ошибок: почему нельзя изменить Регистратор через коллекцию Движения

Рассмотрим код, с которого часто начинаются неудачные попытки переопределения партий:


Движения.ПартииТоваровНаСкладах.Отбор.Регистратор = Движения.ПартииТоваровНаСкладах.Регистратор.Значение.ИнвентаризацияТоваровНаСкладе;

В этом случае платформа выдает ошибку о том, что поле Регистратор не доступно для записи, либо сообщает, что метод объекта не обнаружен при вызове метода Установить().

Выясним причину такого поведения платформы 1С:Предприятие:

  1. Жесткая привязка контекста: Свойство Движения в модуле объекта документа содержит коллекцию наборов записей, изначально привязанных к ссылке текущего проводимого документа (ЭтотОбъект.Ссылка). Платформа на уровне ядра запрещает изменять отбор по регистратору внутри штатной коллекции Движения, чтобы исключить повреждение структуры данных.
  2. Назначение поля Регистратор: Поле Регистратор указывает на документ, который физически сформировал запись в базе данных. Если движение создает документ ОприходованиеТоваров, то именно он является регистратором. Документ ИнвентаризацияТоваровНаСкладе в типовой конфигурации является непроводимым (выполняет роль сличительной ведомости), не входит в список регистраторов регистра накопления и не может формировать движения.
  3. Коллекция, а не одна запись: Объект Движения.ПартииТоваровНаСкладах представляет собой коллекцию строк (набор записей), а не отдельную строку. Нельзя обратиться к реквизитам или измерениям напрямую через точку от коллекции.

Различие между Регистратором и Документом оприходования в УТ 10.3

В конфигурациях на базе классического партионного учета (УТ 10.3, УПП 1.3, КА 1.1) сущность «партия» определяется не системным полем Регистратор, а специальным измерением регистра накопления ПартииТоваровНаСкладах — измерением ДокументОприходования. Именно это измерение хранит ссылку на документ, сформировавший себестоимость и определивший дату образования партии для списания по алгоритмам FIFO или LIFO.

Следовательно, для привязки партии к инвентаризации необходимо передавать ссылку именно в измерение ДокументОприходования, а не подменять системный Регистратор.

Пошаговое решение: переопределение партии в модуле документа

Разберем по шагам, как правильно реализовать заполнение партии при проведении документа ОприходованиеТоваров.

  1. Проверка состава типов измерения: Откроем дерево метаданных конфигуратора, найдем регистр накопления ПартииТоваровНаСкладах (а также ПартииТоваровНаСкладахБухгалтерскийУчет и ПартииТоваровНаСкладахНалоговыйУчет, если они используются). В свойствах измерения ДокументОприходования проверим тип данных. Если типа ДокументСсылка.ИнвентаризацияТоваровНаСкладе в списке нет, его необходимо добавить, иначе платформа запишет в измерение пустое значение.
  2. Поиск точки формирования движений: В типовой конфигурации УТ 10.3 движения по партиям формируются не простым заполнением набора в процедуре ОбработкаПроведения, а через специализированные процедуры подготовки таблиц движений. Найдем в модуле объекта документа процедуру ЗаполнитьПоляПартииТоваровНаСкладах.
  3. Модификация кода заполнения строк движений: В цикле обхода строк сформированной таблицы движений переопределим заполнение поля ДокументОприходования в зависимости от заполненности реквизита шапки:

Процедура ЗаполнитьПоляПартииТоваровНаСкладах(ТаблицаТЧ, ТаблицаДвижений, СтруктураШапкиДокумента)
    ТаблицаТЧ.Индексы.Добавить("НомерСтроки");
    
    Для Каждого СтрокаДвижений Из ТаблицаДвижений Цикл
        // Проверка ведения партионного учета по складам
        Если НЕ СтруктураШапкиДокумента.ВестиПартионныйУчетПоСкладам Тогда
            СтрокаДвижений.Склад = Неопределено;
        КонецЕсли;
        
        СтрокаДвижений.СтатусПартии = Перечисления.СтатусыПартийТоваров.Купленный;
        
        // Установка документа партии
        Если ЗначениеЗаполнено(ИнвентаризацияТоваровНаСкладе) Тогда
            СтрокаДвижений.ДокументОприходования = ИнвентаризацияТоваровНаСкладе;
        Иначе
            СтрокаДвижений.ДокументОприходования = Ссылка;
        КонецЕсли;
        
        // Проверка партионного учета по сериям
        СтрокаТЧ = ТаблицаТЧ.Найти(СтрокаДвижений.НомерСтроки, "НомерСтроки");
        Если СтрокаТЧ <> Неопределено И НЕ СтрокаТЧ.ВестиПартионныйУчетПоСериям Тогда
            СтрокаДвижений.СерияНоменклатуры = Неопределено;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Архитектурные риски и методологические последствия

Проанализируем последствия ручной подмены партионного документа на непроводимый документ инвентаризации:

  1. Регламентное списание партий: Если в информационной базе выключено оперативное проведение по партиям и используется регламентная обработка ПроведениеПоПартиям, расчет партий будет выполняться общими модулями. При перезаполнении таблиц общие механизмы могут затереть нестандартный документ оприходования, если логика не перенесена в соответствующий общий модуль партионного учета.
  2. Хронология FIFO: Дата партии при списании себестоимости определяется по дате документа из измерения ДокументОприходования. Если документ ИнвентаризацияТоваровНаСкладе оформлен более ранней датой, чем фактическое ОприходованиеТоваров, партия получит приоритет при списании себестоимости, что повлияет на финансовый результат.
  3. Альтернативное типовое решение: В типовой методологии 1С нет необходимости заменять партию на инвентаризацию, так как в отчетах по валовой прибыли и партиям доступен реквизит-владелец через точку: ДокументОприходования.ИнвентаризацияТоваровНаСкладе. Если требуется выделить товар конкретной инвентаризации, рекомендуется использовать разделение по сериям номенклатуры.
← На главную