Почему не устанавливается сумма в табличной части документа при обмене данными и как это исправить

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При работе с инструментом «Конвертация данных 2.0» (КД 2.0) разработчики часто сталкиваются с ситуацией, когда данные, казалось бы, правильно настроенные в правилах обмена, не доходят до базы-приемника или заменяются нулевыми значениями. Особенно часто это происходит с суммами в табличных частях документов. Рассмотрим подробнее, почему это случается и как правильно организовать перенос таких данных.

Выясним причину: почему сумма сбрасывается в ноль?

Проанализируем ситуацию. В 1С документы — это сложные объекты с внутренней логикой. Когда мы загружаем данные через XML, платформа не просто записывает цифры в таблицу, она инициализирует объект документа. Существует несколько основных причин обнуления сумм:

  1. Автоматический пересчет: В типовых конфигурациях (например, БП, УТ или ERP) в модулях документов прописаны процедуры, которые срабатывают ПриЗаписи или при изменении реквизитов. Если вы передали Сумма, но не передали Цена или Количество, стандартный механизм может выполнить расчет по формуле Цена * Количество и перезаписать вашу сумму нулем.
  2. Порядок выполнения обработчиков: В КД 2.0 данные сначала заполняются в свойства объекта, и только потом выполняются скрипты. Если после загрузки свойств вызывается типовой метод заполнения (например, по остаткам или по умолчанию), ваши данные будут затерты.
  3. Контекст ПКГС: При использовании Правил конвертации групп свойств (ПКГС) важно понимать, откуда берутся данные. Если вы пытаетесь присвоить значение из шапки источника в каждую строку табличной части приемника напрямую, это может не сработать без специальной обработки.

Решение 1: Использование обработчика «ПослеЗагрузки» на уровне ПКО

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

Для этого в Правилах конвертации объектов (ПКО) для вашего документа перейдем на закладку «Обработчики событий» и найдем событие ПослеЗагрузки. Здесь переменная Объект уже содержит все загруженные данные. Нам нужно обойти табличную часть циклом и установить нужные значения.

Рассмотрим пример кода:


Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    // Устанавливаем сумму из реквизита шапки документа, если это необходимо
    СтрокаТЧ.Сумма = Объект.СуммаДокумента; 
    
    // Если нужно, чтобы сработали стандартные пересчеты (НДС и прочее)
    // можно вызвать процедуры модуля объекта
    // Объект.РассчитатьСуммуТабличнойЧасти(СтрокаТЧ);
КонецЦикла;

Этот метод хорош тем, что он гарантированно отрабатывает после того, как все свойства из XML были прочитаны. Мы имеем полный контроль над данными перед их окончательным сохранением.

Решение 2: Работа с «Входящими данными» (IncomingData)

Иногда необходимо передать в табличную часть значение, которого нет в источнике в явном виде или которое должно быть вычислено особым образом. Для этого проанализируем механизм ВходящиеДанные.

Посмотрим на алгоритм действий:

  1. В ПКО или ПВД, которые вызывают выгрузку, мы создаем структуру и наполняем её нужными нам значениями.
  2. В ПКС (Правила конвертации свойств) для конкретной колонки табличной части устанавливаем флаг «Получать из входящих данных».

Пример кода в обработчике ПередВыгрузкой для ПКС:


// Если значение передано через структуру ВходящиеДанные
Если ВходящиеДанные <> Неопределено Тогда
    Значение = ВходящиеДанные.НужнаяНамСумма;
КонецЕсли;

Решение 3: Вызов типовых процедур пересчета

Если ваша задача — не просто вставить конкретное число, а сделать так, чтобы документ «правильно» выглядел в базе-приемнике (со всеми налогами, скидками и итогами), лучше не изобретать велосипед, а использовать экспортные методы самой конфигурации-приемника.

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

Пример вызова в 1С v8.3:


// Обращаемся к методу объекта, если он экспортный
Объект.ЗаполнитьСчетаУчета(); // Пример для Бухгалтерии
Объект.РассчитатьДатыОтгрузки(); // Пример для Управления торговлей

Важный момент: если вы меняете суммы вручную, обязательно проверьте реквизит СуммаВключаетНДС. Если он установлен неверно относительно ваших расчетов, при открытии документа пользователем суммы могут «перепрыгнуть» из-за пересчета налога.

Рекомендации по отладке

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

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

← На главную