Как программно заполнить серии номенклатуры в документах 1С:ERP 2.0?

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

Программное создание документов в 1С:ERP 2 (а также в УТ 11 и КА 2) часто преподносит сюрпризы разработчикам. Одной из самых распространенных проблем является заполнение серий номенклатуры. Ситуация выглядит так: вы создаете документ, программно заполняете табличную часть Товары, находите или создаете серию, присваиваете её реквизиту Серия, но при открытии документа или его записи поле остается пустым. Проанализируем, почему это происходит и как правильно реализовать этот механизм.

Разбор типичной ошибки: Ссылка против Объекта

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


&НаСервере
Функция СоздатьСерию(НомерСерии, ВидНоменклатуры)
    НайденнаяСерия = Справочники.СерииНоменклатуры.НайтиПоНаименованию(НомерСерии);
    
    Если НайденнаяСерия.Пустая() Тогда
        НоваяСерия = Справочники.СерииНоменклатуры.СоздатьЭлемент();
        НоваяСерия.Номер = НомерСерии;
        НоваяСерия.ВидНоменклатуры = ВидНоменклатуры;
        НоваяСерия.Записать();
        Возврат НоваяСерия; // ОШИБКА: Возвращается Объект, а не Ссылка
    Иначе
        Возврат НайденнаяСерия; // Здесь возвращается Ссылка
    КонецЕсли;
КонецФункции

В чем заключается коварство этого кода? Если серия уже существует, функция возвращает тип СправочникСсылка. Если же серия создается с нуля, оператор Возврат НоваяСерия возвращает тип СправочникОбъект. При попытке присвоить объект реквизиту табличной части (который ожидает ссылку), платформа 1С может не выдать ошибку сразу, но значение в итоге окажется пустым. Всегда следите за тем, чтобы функция возвращала именно ссылку: Возврат НоваяСерия.Ссылка;.

Магическое число 14: Роль реквизита СтатусУказанияСерий

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

Этот реквизит представляет собой числовой флаг (битовую маску), который сообщает системе, как именно интерпретировать данные в строке:

  1. Если СтатусУказанияСерий равен 0, система игнорирует заполненную колонку Серия, считая, что серия не должна быть указана.
  2. Значение 14 — это внутренняя константа, которая сообщает документу, что серия указана непосредственно в текущей строке табличной части Товары и она полностью заполнена.

Рассмотрим пример правильного заполнения строки документа:


НоваяСтрока = ДокументОбъект.Товары.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ДанныеИсточника);
НоваяСтрока.Серия = ПолучитьСсылкуНаСерию(ДанныеИсточника.НомерСерии);

// Критически важная строка для корректного отображения:
НоваяСтрока.СтатусУказанияСерий = 14; 

Без установки этого статуса визуальное оформление формы (динамические списки, условное оформление) просто скроет серию или очистит её при выполнении типовых серверных проверок.

Влияние политики учета серий на способ заполнения

Важно понимать, что значение 14 не является универсальным решением для всех случаев. Проанализируем ситуацию глубже. В 1С:ERP поведение серий зависит от настроек Политики учета серий, заданной для пары "Склад + Вид номенклатуры":

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

Рассмотрим, как выглядит заполнение через техническую таблицу:


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

// 2. Добавляем информацию в таблицу серий
НоваяСерия = ДокументОбъект.Серии.Добавить();
НоваяСерия.КлючСвязи = 1; // Связываем со строкой товара
НоваяСерия.Серия = СсылкаНаСерию;
НоваяСерия.Количество = 1;

Использование типовых механизмов пересчета

Вместо того чтобы вручную подбирать числа для СтатусУказанияСерий, мы рекомендуем использовать встроенные механизмы конфигурации. В ERP существует серверный модуль, отвечающий за актуализацию этих статусов на основе настроек системы.

Посмотрим на пример вызова типовой процедуры:


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

Эта процедура самостоятельно проанализирует каждый склад в документе, настройки каждого вида номенклатуры и выставит правильные значения (0, 1, 2, 14 и т.д.) во всех строках. Это наиболее "безопасный" способ программного создания документов, минимизирующий риск расхождения данных в базе и их визуального представления на форме.

Подведем итог: При программном заполнении серий в ERP 2 необходимо убедиться в трех вещах:

  1. Функция создания серии возвращает СправочникСсылка.
  2. Реквизит СтатусУказанияСерий заполнен корректно (в простейших случаях — значением 14).
  3. Вызваны типовые процедуры обновления статусов перед записью объекта.

Соблюдение этих правил позволит вам избежать "мистического" исчезновения серий из документов.

← На главную