При разработке правил обмена в конфигурации «Конвертация данных 2.1» (КД 2.1) разработчики часто сталкиваются с нетипичным поведением выгрузки. Например, при попытке отфильтровать строки табличной части в результирующем файле появляются пустые узлы <Запись/>, ломающие структуру документа в приемнике, либо возникают непредвиденные ошибки коллизий при загрузке. Разберем по шагам, как корректно настроить правила конвертации свойств, отфильтровать коллекцию строк и избежать типовых ошибок при переносе данных.
Рассмотрим ситуацию, когда в базе-приемнике требуется принудительно переопределить реквизит документа (например, поле Ответственный) значением из справочника. Типичной ошибкой является ручной вызов метода записи объекта внутри обработчика ПКО.
Проанализируем пример кода в обработчике ПКО «После загрузки»:
// Поиск пользователя в базе-приемнике
НайденныйОтветственный = Справочники.Пользователи.НайтиПоНаименованию("админ");
Если ЗначениеЗаполнено(НайденныйОтветственный) Тогда
Объект.Ответственный = НайденныйОтветственный;
КонецЕсли;
Обратите внимание на важные особенности работы данного обработчика:
Объект.Записать() вручную. Механизм загрузки КД 2.1 автоматически выполняет запись созданного или обновленного объекта после отработки всех постобработчиков. Принудительный вызов метода записи приводит к избыточной нагрузке на транзакцию и повторному срабатыванию платформенных подписок на события.ПередЗаписью или ПриУстановкеНовогоНомера) реквизит Ответственный может принудительно перезаполняться текущим пользователем сеанса, под которым запущен процесс загрузки.Выясним причину появления некорректных узлов в XML. Если попытаться исключить ненужные строки табличной части в обработчике «Перед выгрузкой» конкретного правила конвертации свойства (ПКС) с помощью директивы Отказ = Истина;, движок КД 2.1 отменит выгрузку только реквизитов строки, но сам узел строки уже будет сформирован в XML-пакете. В итоге файл выгрузки засоряется пустыми тегами <Запись/>, а документ-приемник получает пустые строки.
Также важно помнить о синтаксисе условий: для платформы «1С:Предприятие 8» необходимо присваивать булево значение Истина, а не числовую единицу 1 (которая использовалась в версии 7.7), чтобы избежать неявного приведения типов.
Чтобы пустые записи не попадали в результирующий XML-файл, фильтрацию необходимо выполнять до момента обхода свойств строк. Для этого используется группа правил конвертации свойств (ПКГС) соответствующей табличной части.
Разберем по шагам алгоритм фильтрации в обработчике «Перед обработкой правила» для ПКГС табличной части (например, ВидыЦен):
ТаблицаЗначений или массив.НайтиСтроки().КоллекцияОбъектов.Посмотрим на пример реализации кода в обработчике ПКГС «Перед обработкой правила»:
// Создаем копию исходной табличной части для фильтрации
ТаблицаВидовЦен = Источник.ВидыЦен.Выгрузить();
// Удаляем строки, не соответствующие требуемому виду цены
Индекс = ТаблицаВидовЦен.Количество() - 1;
Пока Индекс >= 0 Цикл
СтрокаТЧ = ТаблицаВидовЦен[Индекс];
Если СтрокаТЧ.ВидЦены.Наименование <> "Розничная" Тогда
ТаблицаВидовЦен.Удалить(СтрокаТЧ);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
// Передаем отфильтрованную таблицу в движок конвертации
КоллекцияОбъектов = ТаблицаВидовЦен;
При таком подходе движок выгрузки КД 2.1 будет обходить исключительно элементы сформированной таблицы, и в XML-файл попадут только валидные строки без пустых структурных узлов.
При повторной загрузке документов в конфигурации на базе БСП (например, «1С:Розница 2.2») может возникнуть системная коллизия со следующей диагностикой: «Возник конфликт изменений объектов. Объект этой информационной базы был заменен версией объекта из второй информационной базы» с ошибкой сериализации Недостаточно памяти для записи файла формата Base64 в модуле ВерсионированиеОбъектов.
Проанализируем механизм возникновения проблемы:
ЗаписатьXML с типом назначения НазначениеТипаXML.Явное в 32-разрядном рабочем процессе 1С (клиенте или сервере) может произойти переполнение непрерывного адресного пространства памяти при преобразовании объемных структур в строку Base64.Для устранения подобного сбоя выполните следующие действия:
ВерсииОбъектов.