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