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