Автоматизация заполнения серий в документе Этап производства — это сложная задача, требующая глубокого понимания внутренних механизмов 1С:ERP. Часто возникает ситуация, когда внешняя обработка (например, для взвешивания или сканирования штрихкодов) должна корректно заполнить серии, чтобы пользователь мог перевести этап в статус Завершен. Без правильно указанных серий система заблокирует проведение документа, выдавая ошибки заполнения на вкладках Обеспечение и Расход.
В этой статье мы подробно разберем, как устроена работа с сериями «под капотом», расшифруем загадочные числовые статусы и определим алгоритм автоматического подбора серий по остаткам или правилам FEFO.
Прежде всего, разберем механизм, который кажется наиболее «бесчеловечным» — числовые идентификаторы в поле СтатусУказанияСерий. Эти числа определяют, как система визуализирует состояние строки (иконки) и какие проверки она применяет. Проанализируем расшифровку этих статусов, чтобы понимать логику системы:
Важное правило: если значение статуса четное (2, 4, 6...), это означает, что серии заполнены корректно и их количество совпадает с количеством товара в строке. Если значение нечетное — требуется внимание пользователя (серии не указаны или указаны не полностью).
Перед тем как пытаться заполнить серию, мы должны выяснить, а нужно ли это для конкретной номенклатуры в данном контексте (склад, подразделение, операция). Разберем, как это сделать программно. Не стоит писать свои запросы к настройкам политики серий, лучше воспользоваться типовым программным интерфейсом.
Рассмотрим использование функции НоменклатураСервер.УказыватьСерии. Она возвращает структуру, которая скажет нам, включен ли серийный учет. Пример логики проверки:
ПараметрыУказания = НоменклатураСервер.ПараметрыУказанияСерий(СтрокаДокумента.Номенклатура, СкладИлиПодразделение);
НужноУказывать = НоменклатураСервер.УказыватьСерии(ПараметрыУказания, СценарийРаботы);
Если НужноУказывать Тогда
// Переходим к алгоритму подбора серий
КонецЕсли;
В документе Этап производства важно разделять две ситуации: расход материалов (где серии должны быть на складе) и выпуск продукции (где серии могут генерироваться новые).
Для вкладки Обеспечение (когда материалы отгружаются со склада) нам необходимо найти свободные остатки серий. Проанализируем, как использовать типовой механизм 1С:ERP для автоматического распределения.
В системе существует общий модуль ЗаполнениеСерийВызовСервера, методы которого позволяют инициировать подбор. Однако для «тихого» заполнения без открытия форм выбора мы рекомендуем следующий алгоритм:
ТоварыНаСкладах с учетом склада, указанного в этапе.Серии.КлючСвязи.Рассмотрим пример кода, который подготавливает данные для заполнения:
// Пример заполнения связи между ТЧ "Обеспечение" и ТЧ "Серии"
НоваяСерия = Объект.Серии.Добавить();
НоваяСерия.КлючСвязи = СтрокаМатериал.КлючСвязи;
НоваяСерия.Серия = НайденнаяСерияИзОстатков;
НоваяСерия.Количество = СтрокаМатериал.Количество;
Как заметили участники обсуждения, существует типовая форма ПодборСерийВДокументы. Если ваша задача позволяет показать окно пользователю, то это самый надежный путь, так как форма учитывает все отборы, сроки годности и политики. Вызвать её можно через НоменклатураКлиент.ОткрытьФормуВыбораСерий.
Однако, если мы реализуем полностью автоматический режим (например, при сканировании штрихкода на весах), нам нужно эмулировать работу этой формы. Для этого изучим модуль менеджера документа ЭтапПроизводства2_2. В нем содержатся процедуры проверки статусов. Обратите внимание, что при записи документа система вызывает проверку заполнения серий, основываясь на тех самых числовых статусах.
Проанализируем ситуацию с выпуском (вкладка Выходные изделия). В отличие от материалов, здесь серии часто создаются впервые. Если политика учета подразумевает справочное указание, мы можем генерировать номер серии программно:
Функция СгенерироватьНовуюСерию(Номенклатура)
НоваяСерияОбъект = Справочники.СерииНоменклатуры.СоздатьЭлемент();
НоваяСерияОбъект.Владелец = Номенклатура;
НоваяСерияОбъект.Номер = ПолучитьСледующийНомерПоШаблону();
НоваяСерияОбъект.Записать();
Возврат НоваяСерияОбъект.Ссылка;
КонецФункции
Важно помнить, что если в политике указано Учет себестоимости, то просто создать серию недостаточно — она должна пройти по всей цепочке партионного учета.
Подведем итог нашего исследования. Для успешной автоматизации заполнения серий в Этапе производства придерживайтесь следующих шагов:
НоменклатураСервер.УказыватьСерии(), чтобы не делать лишнюю работу там, где серийный учет отключен.КлючСвязи. В 1С:ERP данные о сериях хранятся в отдельной табличной части, и связь с материалами идет по этому идентификатору.ЗаполнитьСтатусыУказанияСерий(). Это позволит иконкам в документе сразу стать «зелеными».Изучение модулей НоменклатураКлиентСервер и ЗаполнениеСерийВызовСервера позволит вам избежать написания избыточного кода и использовать надежные механизмы, заложенные разработчиками фирмы 1С.