При работе с инструментом «Конвертация данных 2.0» (КД 2.0) разработчики часто сталкиваются с ситуацией, когда данные, казалось бы, правильно настроенные в правилах обмена, не доходят до базы-приемника или заменяются нулевыми значениями. Особенно часто это происходит с суммами в табличных частях документов. Рассмотрим подробнее, почему это случается и как правильно организовать перенос таких данных.
Проанализируем ситуацию. В 1С документы — это сложные объекты с внутренней логикой. Когда мы загружаем данные через XML, платформа не просто записывает цифры в таблицу, она инициализирует объект документа. Существует несколько основных причин обнуления сумм:
ПриЗаписи или при изменении реквизитов. Если вы передали Сумма, но не передали Цена или Количество, стандартный механизм может выполнить расчет по формуле Цена * Количество и перезаписать вашу сумму нулем.Разберем самый надежный и популярный способ решения проблемы. Вместо того чтобы полагаться на автоматическое сопоставление полей в табличной части, мы выполним установку значений принудительно, когда объект уже полностью сформирован в оперативной памяти, но еще не записан в базу данных.
Для этого в Правилах конвертации объектов (ПКО) для вашего документа перейдем на закладку «Обработчики событий» и найдем событие ПослеЗагрузки. Здесь переменная Объект уже содержит все загруженные данные. Нам нужно обойти табличную часть циклом и установить нужные значения.
Рассмотрим пример кода:
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
// Устанавливаем сумму из реквизита шапки документа, если это необходимо
СтрокаТЧ.Сумма = Объект.СуммаДокумента;
// Если нужно, чтобы сработали стандартные пересчеты (НДС и прочее)
// можно вызвать процедуры модуля объекта
// Объект.РассчитатьСуммуТабличнойЧасти(СтрокаТЧ);
КонецЦикла;
Этот метод хорош тем, что он гарантированно отрабатывает после того, как все свойства из XML были прочитаны. Мы имеем полный контроль над данными перед их окончательным сохранением.
Иногда необходимо передать в табличную часть значение, которого нет в источнике в явном виде или которое должно быть вычислено особым образом. Для этого проанализируем механизм ВходящиеДанные.
Посмотрим на алгоритм действий:
Пример кода в обработчике ПередВыгрузкой для ПКС:
// Если значение передано через структуру ВходящиеДанные
Если ВходящиеДанные <> Неопределено Тогда
Значение = ВходящиеДанные.НужнаяНамСумма;
КонецЕсли;
Если ваша задача — не просто вставить конкретное число, а сделать так, чтобы документ «правильно» выглядел в базе-приемнике (со всеми налогами, скидками и итогами), лучше не изобретать велосипед, а использовать экспортные методы самой конфигурации-приемника.
Рассмотрим ситуацию: вы загрузили Количество и Цена, но Сумма остается нулевой. В обработчике ПослеЗагрузки можно вызвать метод пересчета, который заложен разработчиками конфигурации. Это обеспечит транзитивность и целостность данных.
Пример вызова в 1С v8.3:
// Обращаемся к методу объекта, если он экспортный
Объект.ЗаполнитьСчетаУчета(); // Пример для Бухгалтерии
Объект.РассчитатьДатыОтгрузки(); // Пример для Управления торговлей
Важный момент: если вы меняете суммы вручную, обязательно проверьте реквизит СуммаВключаетНДС. Если он установлен неверно относительно ваших расчетов, при открытии документа пользователем суммы могут «перепрыгнуть» из-за пересчета налога.
Если вышеописанные методы не помогают, проанализируем ситуацию с помощью отладки. Выясним причину обнуления следующим образом:
СтрокаТЧ.Сумма превращается в 0.Таким образом, правильная установка суммы в табличную часть требует понимания жизненного цикла объекта при загрузке. Использование обработчика ПослеЗагрузки в сочетании с прямым обходом коллекции строк является наиболее стабильным решением, позволяющим избежать влияния типовой логики конфигурации, которая может затирать данные.