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