Почему не выполняется код в обработчике ПослеЗагрузкиОбъекта в Конвертации данных

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

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

Основная причина: включенный режим совместимости с БСП

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

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

  1. При установленной опции «Режим совместимости с БСП» (например, БСП 2.0) конфигурация «Конвертация данных 2.1» меняет внутреннюю структуру выгружаемого XML-файла правил. Код обработчиков загрузки упаковывается в специальные блоки, предназначенные исключительно для подсистемы «Обмен данными» современных конфигураций на базе БСП.
  2. Если перенос данных выполняется между конфигурациями на обычных формах (такими как УТП 1.2, УПП 1.3, КА 1.1, УТ 10.3) с использованием внешней или встроенной обработки «Универсальный обмен данными XML», эта обработка не распознает формат секций БСП и просто пропускает исполнение кода загрузки.
  3. Для исправления проблемы необходимо открыть свойства правил обмена в конфигурации «Конвертация данных», снять флаг «Режим совместимости с БСП» и повторно выгрузить файл правил обмена.

Особенности выполнения обработчиков загрузки данных

Проанализируем специфику работы событий загрузки объектов в оперативной памяти, чтобы избежать логических ошибок при заполнении реквизитов:

  1. Момент исполнения: Обработчики После загрузки (в конкретном ПКО) и ПослеЗагрузкиОбъекта (глобальный) вызываются платформой тогда, когда поля объекта уже прочитаны из XML-файла и сопоставлены, но до момента физической записи объекта в информационную базу.
  2. Обращение к ссылкам новых объектов: Если создается новый элемент справочника или документ, свойство Объект.Ссылка еще не инициализировано в базе данных. Если для заполнения связанных структур или создания подчиненных записей регистров требуется реальная ссылка, необходимо выполнить явную промежуточную запись объекта:
    
    // Пример записи нового объекта для получения ссылки
    Если Объект.ЭтоНовый() Тогда
        Объект.Записать();
    КонецЕсли;
    
  3. Влияние флага Отказ: Если в событиях ПередЗагрузкойОбъекта, ПередЗагрузкой или ПриЗагрузке переменной Отказ было присвоено значение Истина, чтение текущего объекта прекращается и последующие обработчики для него не вызываются.
  4. Опция «Не замещать существующие объекты»: Если для ПКО включен этот признак и объект был успешно найден в базе-приемнике, стандартные поля не перезаписываются. Изменения, внесенные в реквизиты в обработчике, могут не сохраниться без явного вызова метода Объект.Записать().

Рекомендации по диагностике и правильной отладке правил

Рассмотрим, как правильно контролировать ход загрузки данных, если стандартные методы вывода не дают результата:

  1. Ограничения метода Сообщить(): При выполнении обмена на стороне сервера, через регламентное фоновое задание или через COM-соединение, диалоговые окна и метод Сообщить() блокируются платформой. Для надежной фиксации факта срабатывания обработчика используйте запись в журнал регистрации:
    
    ЗаписьЖурналаРегистрации(
        "ОбменДанными.ПослеЗагрузки",
        УровеньЖурналаРегистрации.Информация,
        ,
        Объект.Ссылка,
        "Обработчик успешно отработал для объекта: " + Строка(Объект)
    );
    
  2. Использование штатного режима отладки КД 2.1: Чтобы отлаживать код обработчиков с точками останова в стандартном конфигураторе 1С, перейдите в меню Сервис -> Настройка выгрузки/загрузки модуля отладки в «Конвертации данных». Сформируйте модуль отладки выгрузки/загрузки, сохраните его во внешнюю обработку и подключите в обработке «Универсальный обмен данными XML» на вкладке «Отладка».
  3. Перенос логики в финальные обработчики: Если заполняемый реквизит требует наличия уже загруженных взаимосвязанных документов или итоговых таблиц, перенесите логику в глобальный обработчик ПослеЗагрузкиДанных, накапливая ссылки на нужные объекты в глобальной структуре Параметры.
← На главную