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