Почему программно созданный документ в УТ 11 не проводится, хотя визуально всё заполнено верно?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

При разработке внешних обработок для автоматического заполнения документов в современных конфигурациях на базе 1С:ERP, УТ 11 или КА 2 программисты часто сталкиваются с ситуацией: документ создается, все видимые поля заполнены корректно, однако при попытке проведения система выдает ошибку. При этом, если зайти в документ и просто перезаполнить любое поле (например, количество), он начинает проводиться. Рассмотрим подробно, почему так происходит и как правильно заполнять табличные части программно.

Разберем основную причину: связка количества и упаковок

В конфигурации 1С:Управление торговлей 11 для каждой строки табличной части Товары существует жесткая математическая зависимость между несколькими реквизитами. Основная ошибка внешних обработок заключается в том, что они заполняют только видимое поле Количество, игнорируя служебные или связанные поля.

Проанализируем структуру реквизитов. В документе "Заказ клиента" (или "Заявка покупателя") одновременно присутствуют поля:

  1. Количество — общее количество товара в базовых единицах измерения.
  2. КоличествоУпаковок — количество товара в выбранных упаковках.
  3. Упаковка — ссылка на справочник упаковок (единиц измерения).

Если во внешней обработке мы заполним Количество и КоличествоУпаковок одинаковыми числами, но при этом в поле Упаковка укажем единицу, имеющую коэффициент, отличный от единицы (например, коробка, в которой 10 штук), документ не проведется. Система при проведении проверяет условие: Количество = КоличествоУпаковок * Коэффициент. При программном заполнении через Объект.Товары.Добавить() типовые механизмы пересчета не срабатывают автоматически, в отличие от интерактивного ввода в форме.

Выясним причину через сравнение объектов

Чтобы точно определить, какой именно реквизит мешает проведению, воспользуемся проверенным методом: сравнением программно созданного документа с тем, который был исправлен вручную. Для этого выполним следующие шаги:

  1. Создадим документ нашей внешней обработкой и запишем его (не проводя).
  2. Создадим копию этого документа или просто исправим одну строку в текущем документе вручную так, чтобы он провелся.
  3. Воспользуемся инструментом Консоль запросов или обработкой Редактирование реквизитов объектов.
  4. Сравним значения всех колонок табличной части Товары для "кривой" и "исправленной" строк.

Особое внимание при анализе стоит уделить скрытым реквизитам, которые не отображаются на форме, но критически важны для бизнес-логики 1С.

Проанализируем скрытый реквизит Ключ связи

В современных конфигурациях 1С активно используется механизм связи строк различных табличных частей через реквизит КлючСвязи (тип Число). Это одна из самых частых причин неявных ошибок.

В документе "Заказ клиента" этот ключ связывает строку основной таблицы Товары с данными в других таблицах:

Если ваша обработка просто добавляет строку в таблицу товаров, но оставляет КлючСвязи равным нулю или не генерирует его, механизмы проведения не смогут сопоставить товар с его обеспечением или скидками, что приведет к отказу в проведении.

Как правильно заполнять данные программно

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


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

// Вызываем типовой пересчет количества через коэффициент упаковки
СтруктураПересчета = Новый Структура("Номенклатура, Упаковка, КоличествоУпаковок, Количество");
ЗаполнитьЗначенияСвойств(СтруктураПересчета, НоваяСтрока);

// Используем программный интерфейс УТ 11 для расчета
НоменклатураКлиентСервер.РассчитатьКоличествоУпаковок(НоваяСтрока);

Также важно заполнять реквизиты обеспечения. Если поле ВариантОбеспечения в строке останется пустым, документ может не сформировать движения по регистру Заказы на отгрузку. Посмотрим на список обязательных для заполнения "логистических" полей в УТ 11:

Использование инструментов разработчика для поиска обработчиков

Если вы столкнулись с тем, что документ проводится только после ручного изменения конкретного поля, изучите код формы этого документа. Найдите событие ПриИзменении для этого реквизита. Рассмотрим алгоритм действий:

  1. Откройте конфигуратор и найдите форму документа "Заказ клиента".
  2. Найдите элемент формы (например, поле "Количество") и перейдите в его обработчик ПриИзменении на клиенте.
  3. Проследите цепочку вызовов — обычно там вызывается серверная процедура, которая заполняет целую пачку скрытых реквизитов (коэффициенты, налоги, ключи связи, наличие серий).
  4. Скопируйте вызов этих процедур (или их логику) в свою внешнюю обработку.

Помните, что в 1С:Управление торговлей 11 многие действия вынесены в общие модули с названиями типа ОбработкаТабличнойЧастиТоварыКлиентСервер или ЗаказыКлиентовСервер. Использование функций из этих модулей гарантирует, что программное заполнение ничем не будет отличаться от ручного ввода пользователя, и документ будет проводиться без ошибок.

Важный совет: всегда проверяйте заполнение реквизита СтатусУказанияСерий. Если для номенклатуры ведется учет по сериям, а ваша обработка не заполнила этот служебный числовой флаг, документ может "молчать" об ошибке, но кнопка проведения не будет давать результата.

← На главную