При автоматизированной загрузке данных в документы 1С:Управление торговлей 11 или 1С:ERP (например, при переносе остатков или интеграции со сторонними системами) разработчики часто сталкиваются с проблемой некорректного отображения серий — для исправления таких ошибок есть обработка для очистки и отключения серий. Типичная ситуация: в табличной части документа серии указаны, но иконка статуса горит красным, а при проведении документа возникают "двойные" остатки или ошибки в регистре Товары на складах. Давайте подробно разберем, как устроена внутренняя логика статусов серий, что означают их числовые коды и как правильно программно заполнять эти данные, чтобы избежать ошибок в учете.
Прежде чем переходить к коду, проанализируем, почему простое присвоение числа в поле СтатусУказанияСерий часто не работает. В современных конфигурациях на базе УТ 11 и ERP статус — это не просто визуальная картинка, а сложный индикатор, который зависит от настроенной Политики учета серий для конкретного склада и вида номенклатуры. Для расширения возможностей системы есть расширение учета и маркировки серий 1С.
Разберем основные причины возникновения проблем при программной записи:
КлючСвязиСерий. Если в основной ТЧ Товары и в ТЧ Серии эти ключи не совпадают, система "не видит" связи между товаром и его серией, даже если визуально всё заполнено.Рассмотрим систему кодирования статусов. В 1С используется математическая логика четности и нечетности для визуализации состояния строки. Это помогает быстро определить, корректно ли заполнены данные.
Общая логика:
Подробная таблица кодов:
0 — Серии указывать не требуется (индикация отсутствует).1, 2, 21 — Серии указываются справочно.3, 4, 23 — По сериям учитываются остатки, серии указываются по факту отбора (самый частый вариант для складов) — для этого процесса подойдёт автоматизация создания серий при складских операциях.5, 6, 25 — По сериям учитываются остатки, заполнение по FEFO (используется в документах отгрузки).7, 8, 27 — Учет остатков, серии указываются при планировании отбора.9, 10, 11 — Серии влияют на регистр СвободныеОстатки (планирование отгрузки).13, 14, 15 — По сериям учитывается себестоимость (наиболее строгий вариант учета).Проанализируем ситуацию, когда при вводе остатков возникают "двойные движения". Это происходит потому, что в регистре Товары на складах серия является измерением. Если вы программно установили статус 4 (зеленый), но не заполнили движения по сериям или не синхронизировали КлючСвязиСерий, документ при проведении может создать запись с пустой серией. В дальнейшем, когда вы попытаетесь списать этот товар с указанием серии, система увидит, что по "пустой" серии остаток есть, а по конкретной "новой" серии — нет. В итоге в регистре зависнут две строки: "плюс" по одной серии и "минус" по другой (или пустой).
Вместо того чтобы вручную присваивать числа, мы воспользуемся встроенными механизмами серверного модуля НоменклатураСервер. Это гарантирует, что система сама определит нужный статус на основании учетной политики, даты документа и склада.
Рассмотрим пример кода для документа ПеремещениеТоваров:
// 1. Подготавливаем параметры указания серий для конкретного типа документа
ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(НовыйДокумент, Документы.ПеремещениеТоваров);
// 2. Вызываем типовую процедуру заполнения статусов
// Она проверит заполнение ТЧ "Серии", сравнит количество и проставит верные коды (2, 4, 6 и т.д.)
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(НовыйДокумент, ПараметрыУказанияСерий);
Этот метод хорош тем, что он автоматически обрабатывает все строки табличной части Товары и сопоставляет их с данными из ТЧ Серии.
Если нам нужно обновить статус только для одной конкретной строки (например, в обработчике изменения количества), разберем следующий подход, актуальный для УТ 11:
// Получаем структуру параметров для контекста документа
ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ОбъектДокумент, Документы.ЧекККМ);
// Рассчитываем статус для конкретной строки (стр - текущая строка ТЧ Товары)
СтруктураВозврата = НоменклатураСервер.ПроверитьСериюРассчитатьСтатусПриИзмененииРеквизитаВТЧ(стр, ОбъектДокумент.Склад, ПараметрыУказанияСерий);
// Присваиваем полученный статус
стр.СтатусУказанияСерий = СтруктураВозврата.СтатусУказанияСерий;
Важный нюанс: Перед вызовом этих функций убедитесь, что в ТЧ Товары и ТЧ Серии заполнен реквизит КлючСвязи. В типовых конфигурациях обычно используется КлючСвязиСерий (тип Число). Каждая уникальная строка в Товары должна иметь свой уникальный номер ключа, и этот же номер должен стоять в строках ТЧ Серии, относящихся к этому товару.
Для более тяжелых решений, таких как ERP, структура вызова может быть аналогичной, но важно помнить про контекст. Посмотрим на пример вызова для документа РеализацияТоваровУслуг:
// ДокОбъект - ссылка или объект документа реализации
ПараметрыУказанияСерий = НоменклатураСервер.ПараметрыУказанияСерий(ДокОбъект, Документы.РеализацияТоваровУслуг);
// Заполнение статусов для всего документа
НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий(ДокОбъект, ПараметрыУказанияСерий);
Для корректной работы с сериями при программном создании документов необходимо соблюдать следующую последовательность действий:
Товары.КлючСвязиСерий для каждой строки.Серии, указав там те же ключи связи, соответствующие товарам.НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий().Помните, что актуальное описание всех возможных статусов всегда можно найти непосредственно в коде вашей конфигурации, открыв процедуру НоменклатураСервер.ЗаполнитьСтатусыУказанияСерий. Разработчики 1С часто добавляют новые коды при обновлении механизмов FEFO или учета себестоимости, поэтому использование типовых функций — самый надежный способ сохранить работоспособность ваших доработок.