Как программно создать и провести документ «Этап производства» в статусе «Завершен» в 1С:ERP?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

Программное создание документов в 1С:ERP — задача на порядок более сложная, чем в конфигурациях предыдущих поколений. Одной из самых частых проблем, с которой сталкиваются разработчики, является ошибка «Нехватка материала» при проведении документа ЭтапПроизводства в статусе «Завершен», даже если материалы фактически были переданы в производство. В этой статье мы подробно разберем, почему система «не видит» остатки при программном заполнении и как правильно настроить логику кода, чтобы документ проводился корректно.

Анализируем причину ошибки: почему ручной ввод работает, а программный — нет?

Когда мы работаем с документом ЭтапПроизводства в пользовательском режиме, система выполняет огромный объем невидимой работы: генерирует ключи связи, проверяет статусы обеспечения, подтягивает аналитику из заказов и настроек производства. При программном заполнении объекта через СоздатьДокумент() многие из этих механизмов не срабатывают автоматически. Выясним основные причины возникновения ошибки нехватки материалов:

  1. Отсутствие связи между табличными частями: В ERP строки обеспечения и строки фактического расхода связаны через служебные идентификаторы.
  2. Неверные статусы обеспечения: Материалы в таблице обеспечения должны находиться в состоянии, разрешающем отгрузку.
  3. Разрыв аналитики НЗП: Несоответствие складов, статей калькуляции или назначений в документах передачи и потребления.
  4. Проблемы с единицами измерения: Различие между Количество и КоличествоУпаковок.

Шаг 1. Синхронизация табличных частей через КлючСвязи

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

Для связи используется реквизит КлючСвязи (тип Число). Проанализируем алгоритм правильного заполнения:


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

НоваяСтрокаРасхода = ОбъектЭтап.Расход.Добавить();
НоваяСтрокаРасхода.Номенклатура = СсылкаНаМатериал;
НоваяСтрокаРасхода.КлючСвязи = 1; // Должен совпадать с КлючомСвязи в МатериалыИРаботы

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

Шаг 2. Настройка статусов в таблице обеспечения

Выясним еще одну деталь: для успешного завершения этапа материал в табличной части МатериалыИРаботы должен иметь статус, позволяющий списание. Если в колонке СтатусУказанияСерий или в реквизите ВариантОбеспечения стоит значение «К обеспечению» или «Резервировать по мере поступления», документ не проведется в статусе «Завершен».

Проанализируем необходимые действия: перед установкой статуса документа в «Завершен», необходимо убедиться, что для всех потребляемых строк в ТЧ МатериалыИРаботы установлен статус Отгрузить (или К оформлению, в зависимости от версии и настроек системы). Только в этом случае логика контроля остатков позволит списать ТМЦ из незавершенного производства (НЗП).

Шаг 3. Работа с регистром «Материалы и работы в производстве»

Ошибка нехватки часто возникает не из-за отсутствия товара на основном складе, а из-за того, что система не находит его в «Цеховой кладовой» или в регистре НЗП. Посмотрим на аналитику, которую делает документ ПередачаМатериаловВПроизводство. Чтобы этап «увидел» эти материалы, должны совпадать следующие реквизиты:

Шаг 4. Учет упаковок и единиц измерения

Рассмотрим распространенную ошибку новичков, упомянутую опытными коллегами. В документах ERP практически всегда присутствуют два реквизита для количества: Количество и КоличествоУпаковок. При программном заполнении часто заполняют только один из них.

Правило: Всегда заполняйте оба реквизита. Количество — это всегда количество в базовых единицах измерения, а КоличествоУпаковок — в тех единицах, которые выбраны в строке (даже если это та же базовая единица). Также не забывайте про реквизит Коэффициент (или Знаменатель), который связывает эти два показателя.

Шаг 5. Использование типовых механизмов и API

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

Например, можно вызвать метод ЗаполнитьОстаткиПоРаспоряжению(). Проанализируем преимущества этого подхода: система сама обратится к регистрам накопления, проверит, что именно и в каком количестве было передано под данный этап, и корректно заполнит ТЧ Расход, проставив правильные КлючСвязи и аналитики.

Также обратите внимание на структуру ДополнительныеСвойства. Иногда для успешного проведения документа программно требуется установить технические флаги, такие как ПроверитьЗаполнениеЛогически = Истина. Это заставляет систему выполнить все встроенные проверки бизнес-логики перед записью в базу данных.

Шаг 6. Хронология и момент времени

Последний, но не менее важный фактор — время документов. В ERP крайне важна последовательность. Если ПередачаМатериаловВПроизводство и ЭтапПроизводства создаются в одну и ту же секунду, этап может «не увидеть» приход из-за своей позиции в периоде.

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

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

← На главную