Как программно добавить серию в табличную часть Приобретение товаров и услуг в УТ 11.5

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

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

Проанализируем архитектуру хранения серий в УТ 11

В отличие от УТ 10.3, где серия была просто измерением или реквизитом строки, в УТ 11.5 механизм реализован более гибко — учесть это помогут правила переноса данных в УТ 11.5. В зависимости от выбранной Политики учета серий, данные могут храниться либо непосредственно в табличной части Товары, либо в отдельной подчиненной табличной части Серии. Рассмотрим основные сценарии:

  1. Справочное указание серий: В этом случае серия указывается для информации. Она записывается в поле Серия табличной части Товары.
  2. Учет остатков, маркировка, FEFO: При таких политиках одна строка товара может содержать несколько разных серий. Для этого используется табличная часть Серии, которая связывается со строкой товаров через техническое поле КлючСвязи.

Если вы пытаетесь записать серию в поле ТекСтрока.Серия, а политика учета подразумевает использование отдельной таблицы, система при записи или открытии формы просто очистит ваши данные, так как они находятся «не на своем месте».

Разберем важность реквизита СтатусУказанияСерий

Реквизит СтатусУказанияСерий — это числовой код (битовая маска), который сообщает интерфейсу и механизмам проведения документа, насколько корректно и где именно заполнены серии. Проанализируем значения, которые принимает этот статус:

Часто в коде можно встретить значение 14 (сумма 2+4+8). Однако установка этого статуса вручную — плохая практика, так как при изменении склада или даты документа типовые механизмы пересчитают статус заново, и ваше значение может быть сброшено в 0, если алгоритм посчитает настройки некорректными.

Пошаговый алгоритм программного заполнения серий

Рассмотрим правильный порядок действий при программном создании документа Приобретение товаров и услуг. Вместо того чтобы гадать, какой статус установить, мы будем использовать возможности типовой конфигурации.

Шаг 1: Подготовка строки в ТЧ Товары

Для каждой строки товара необходимо сгенерировать уникальный КлючСвязи. Это целое число, которое должно быть уникальным в рамках документа.


НоваяСтрока = ДокументОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("001"); // Цены предыдущих поставок
НоваяСтрока.Количество = 10;
// Генерируем ключ связи, если его еще нет
Если НоваяСтрока.КлючСвязи = 0 Тогда
    МаксКлюч = 0;
    Для Каждого Стр Из ДокументОбъект.Товары Цикл
        МаксКлюч = Макс(МаксКлюч, Стр.КлючСвязи);
    КонецЦикла;
    НоваяСтрока.КлючСвязи = МаксКлюч + 1;
КонецЕсли;

Шаг 2: Заполнение серии в зависимости от политики

Выясним, куда именно нужно записывать серию. Самый надежный способ — проверить политику учета серий через метаданные или использовать универсальный подход с заполнением обеих частей (типовой механизм сам выберет нужное при записи).


// Пример заполнения для политики "Учет остатков" (ТЧ Серии)
НоваяСерия = ДокументОбъект.Серии.Добавить();
НоваяСерия.КлючСвязи = НоваяСтрока.КлючСвязи;
НоваяСерия.Серия = НайденнаяСерия;
НоваяСерия.Количество = НоваяСтрока.Количество;

// На всякий случай дублируем в ТЧ Товары (для справочного учета)
НоваяСтрока.Серия = НайденнаяСерия;

Шаг 3: Автоматический расчет статусов

Вместо ручного указания СтатусУказанияСерий = 14, воспользуемся серверным модулем. Это критически важный момент, так как процедура ЗаполнитьСтатусыУказанияСерий учитывает настройки склада (ордерный или нет) и дату документа.


// Перед записью документа вызываем типовой метод
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ДокументОбъект);
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись); // Печать акта приемки

Почему в Реализации товаров и услуг работает, а в Приобретении — нет?

Проанализируем ситуацию, описанную автором темы. В документе Реализация товаров и услуг серии часто указываются «по факту» отгрузки, и статусная модель может быть мягче. В Приобретении товаров и услуг серии часто связаны с планированием поступления. Если склад является ордерным, то серии в финансовом документе (Приобретении) могут быть вообще не предусмотрены политикой учета (они указываются только в Приходном ордере на товары). В этом случае, какие бы статусы вы ни ставили программно, поле будет обнуляться, так как «финансовый документ не должен знать о сериях» по настройкам системы.

Рекомендации по отладке

Если после выполнения кода серии все равно не видны в форме документа, выполните следующие действия:

  1. Проверьте Политику учета серий (поможет расширение для работы с сериями в УТ 11) для Вида номенклатуры вашего товара. Убедитесь, что стоит галочка «Приобретение товаров и услуг» в колонке «Указывать серии».
  2. Посмотрите значение КлючСвязи в обеих табличных частях через консоль запросов. Если они не совпадают, связь не установится.
  3. Проверьте настройки склада. Если склад ордерный, убедитесь, что политика учета предполагает указание серий именно в «Приобретении», а не только в «Приходном ордере».
  4. Вызовите процедуру НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(Объект) непосредственно перед командой Записать(). Это гарантирует, что система применит актуальную логику версии 11.5.

Использование типовых процедур — это залог того, что при обновлении конфигурации на версию 11.6 или выше ваш код продолжит работать корректно, так как логика расчета битовых масок статусов инкапсулирована внутри общих модулей 1С.

← На главную