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