Почему при программном создании заказа клиента в 1С не отображается количество?

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

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

Причина проблемы: архитектура учета единиц измерения и упаковок

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

  1. КоличествоУпаковок — количество товара в выбранных единицах измерения или упаковках (именно этот реквизит выведен на управляемую форму документа и отображается пользователю в колонке «Количество»).
  2. Количество — количество товара в базовых (хранения) единицах измерения (используется для проведения по регистрам и внутренних расчетов).

Когда мы программно присваиваем значение только реквизиту ТЧ.Количество, в базе данных реквизит ТЧ.КоличествоУпаковок остается равным нулю. Так как при прямом заполнении объекта обработчики формы не выполняются, на экране колонка количества остается незаполненной.

Пошаговое исправление кода

Для корректного отображения и проведения документа необходимо явно инициализировать как базовое количество, так и количество упаковок. Рассмотрим по шагам, как исправить алгоритм заполнения строки.

В исходном коде заполнение выглядело следующим образом:


ТЧ = ДокЗаказ.Товары.Добавить();
ТЧ.Номенклатура = ПоискНоменклатуры(СтрокаТЧЗаказа.product_id);
ТЧ.Цена = Число(СтрокаТЧЗаказа.price);
ТЧ.Количество = 1;
ТЧ.Сумма = ТЧ.Цена * ТЧ.Количество;

Чтобы значение появилось в форме, обязательно добавляем заполнение реквизита КоличествоУпаковок:


ТЧ = ДокЗаказ.Товары.Добавить();
ТЧ.Номенклатура = ПоискНоменклатуры(СтрокаТЧЗаказа.product_id);
ТЧ.Цена = Число(СтрокаТЧЗаказа.price);

// Заполняем оба реквизита количества
ТЧ.КоличествоУпаковок = Число(СтрокаТЧЗаказа.amount);
ТЧ.Количество = ТЧ.КоличествоУпаковок; // Если упаковка не используется или коэффициент равен 1

ТЧ.Сумма = ТЧ.Цена * ТЧ.Количество;
ТЧ.Склад = ПоискСклада(СтрокаТЧЗаказа.store_id);
ТЧ.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;

Дополнительные обязательные реквизиты табличной части

Посмотрим на другие важные реквизиты, отсутствие которых может привести к ошибкам при проведении документа Заказ клиента или нарушению целостности данных:

  1. КлючСвязи — уникальный числовой идентификатор строки внутри табличной части. В типовых конфигурациях строки товаров связываются с этапами оплаты, автоматическими скидками и распределением по складам именно через КлючСвязи. Для каждой добавленной строки рекомендуется генерировать новое уникальное число (например, порядковый номер строки).
  2. ВариантОбеспечения — реквизит перечисления ВариантыОбеспечения (например, Перечисления.ВариантыОбеспечения.Отгрузить или Перечисления.ВариантыОбеспечения.КОбеспечению). Без его заполнения документ не сформирует нужные движения по резервам.
  3. ЕдиницаИзмерения и Упаковка — если для номенклатуры не используются индивидуальные упаковки, реквизит Упаковка оставляют пустым (Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка()), а в реквизит ЕдиницаИзмерения подставляют базовую единицу хранения из карточки номенклатуры.

Итоговый пример корректного программного заполнения

Объединим все правила и рассмотрим итоговый фрагмент кода для создания строк заказа:


НомерСтрокиТЧ = 0;
Для Каждого СтрокаТЧЗаказа Из Заказ.order.order_items.item Цикл
    НомерСтрокиТЧ = НомерСтрокиТЧ + 1;
    
    ТЧ = ДокЗаказ.Товары.Добавить();
    ТЧ.КлючСвязи = НомерСтрокиТЧ;
    ТЧ.Номенклатура = ПоискНоменклатуры(СтрокаТЧЗаказа.product_id);
    
    // Заполнение количественных показателей
    ТЧ.КоличествоУпаковок = Число(СтрокаТЧЗаказа.amount);
    ТЧ.Количество = ТЧ.КоличествоУпаковок;
    
    // Заполнение ценовых показателей
    ТЧ.Цена = Число(СтрокаТЧЗаказа.price);
    ТЧ.Сумма = ТЧ.Цена * ТЧ.Количество;
    
    // Заполнение аналитики и обеспечения
    ТЧ.Склад = ПоискСклада(СтрокаТЧЗаказа.store_id);
    ТЧ.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
    ТЧ.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.Отгрузить;
КонецЦикла;

Таким образом, синхронное заполнение реквизитов КоличествоУпаковок и Количество гарантирует правильное отображение данных на форме документа и корректный расчет суммовых итогов.

← На главную