Как правильно фильтровать строки табличной части и заполнять реквизиты в Конвертации данных 2.1

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

При разработке правил обмена в конфигурации «Конвертация данных 2.1» (КД 2.1) разработчики часто сталкиваются с нетипичным поведением выгрузки. Например, при попытке отфильтровать строки табличной части в результирующем файле появляются пустые узлы <Запись/>, ломающие структуру документа в приемнике, либо возникают непредвиденные ошибки коллизий при загрузке. Разберем по шагам, как корректно настроить правила конвертации свойств, отфильтровать коллекцию строк и избежать типовых ошибок при переносе данных.

Установка реквизитов объекта в обработчике «После загрузки»

Рассмотрим ситуацию, когда в базе-приемнике требуется принудительно переопределить реквизит документа (например, поле Ответственный) значением из справочника. Типичной ошибкой является ручной вызов метода записи объекта внутри обработчика ПКО.

Проанализируем пример кода в обработчике ПКО «После загрузки»:


// Поиск пользователя в базе-приемнике
НайденныйОтветственный = Справочники.Пользователи.НайтиПоНаименованию("админ");
Если ЗначениеЗаполнено(НайденныйОтветственный) Тогда
    Объект.Ответственный = НайденныйОтветственный;
КонецЕсли;

Обратите внимание на важные особенности работы данного обработчика:

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

Почему при установке «Отказ = Истина» в ПКС появляются пустые узлы <Запись/>

Выясним причину появления некорректных узлов в XML. Если попытаться исключить ненужные строки табличной части в обработчике «Перед выгрузкой» конкретного правила конвертации свойства (ПКС) с помощью директивы Отказ = Истина;, движок КД 2.1 отменит выгрузку только реквизитов строки, но сам узел строки уже будет сформирован в XML-пакете. В итоге файл выгрузки засоряется пустыми тегами <Запись/>, а документ-приемник получает пустые строки.

Также важно помнить о синтаксисе условий: для платформы «1С:Предприятие 8» необходимо присваивать булево значение Истина, а не числовую единицу 1 (которая использовалась в версии 7.7), чтобы избежать неявного приведения типов.

Правильная фильтрация строк табличной части через ПКГС

Чтобы пустые записи не попадали в результирующий XML-файл, фильтрацию необходимо выполнять до момента обхода свойств строк. Для этого используется группа правил конвертации свойств (ПКГС) соответствующей табличной части.

Разберем по шагам алгоритм фильтрации в обработчике «Перед обработкой правила» для ПКГС табличной части (например, ВидыЦен):

  1. Выгружаем строки табличной части источника в отдельную ТаблицаЗначений или массив.
  2. Удаляем строки, не удовлетворяющие условию отбора, либо отбираем нужные с помощью метода НайтиСтроки().
  3. Переопределяем предопределенную переменную КоллекцияОбъектов.

Посмотрим на пример реализации кода в обработчике ПКГС «Перед обработкой правила»:


// Создаем копию исходной табличной части для фильтрации
ТаблицаВидовЦен = Источник.ВидыЦен.Выгрузить();

// Удаляем строки, не соответствующие требуемому виду цены
Индекс = ТаблицаВидовЦен.Количество() - 1;
Пока Индекс >= 0 Цикл
    СтрокаТЧ = ТаблицаВидовЦен[Индекс];
    Если СтрокаТЧ.ВидЦены.Наименование <> "Розничная" Тогда
        ТаблицаВидовЦен.Удалить(СтрокаТЧ);
    КонецЕсли;
    Индекс = Индекс - 1;
КонецЦикла;

// Передаем отфильтрованную таблицу в движок конвертации
КоллекцияОбъектов = ТаблицаВидовЦен;

При таком подходе движок выгрузки КД 2.1 будет обходить исключительно элементы сформированной таблицы, и в XML-файл попадут только валидные строки без пустых структурных узлов.

Диагностика конфликтов версионирования и ошибки «Недостаточно памяти Base64»

При повторной загрузке документов в конфигурации на базе БСП (например, «1С:Розница 2.2») может возникнуть системная коллизия со следующей диагностикой: «Возник конфликт изменений объектов. Объект этой информационной базы был заменен версией объекта из второй информационной базы» с ошибкой сериализации Недостаточно памяти для записи файла формата Base64 в модуле ВерсионированиеОбъектов.

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

  1. Служебное версионирование коллизий: даже если общее версионирование объектов в информационной базе отключено в настройках, типовая подсистема обмена данными БСП принудительно сохраняет предыдущее состояние измененного или помеченного на удаление объекта для регистрации в журнале коллизий.
  2. Лимиты адресного пространства: при сериализации больших документов через метод ЗаписатьXML с типом назначения НазначениеТипаXML.Явное в 32-разрядном рабочем процессе 1С (клиенте или сервере) может произойти переполнение непрерывного адресного пространства памяти при преобразовании объемных структур в строку Base64.

Для устранения подобного сбоя выполните следующие действия:

  1. Окончательное удаление: перед повторным обменом выполните полное удаление помеченных на удаление объектов через стандартную обработку информационной базы, чтобы исключить фиксацию конфликта версий.
  2. Очистка служебных регистров: удалите устаревшие записи по проблемным документам в регистре сведений ВерсииОбъектов.
  3. Использование 64-разрядного клиента/сервера: выполняйте ресурсоемкую загрузку больших пакетов данных в 64-разрядном окружении для снятия ограничений на размер непрерывного блока оперативной памяти.
← На главную