Почему правила КД 2 работают в стандартном обмене, но выдают ошибки в универсальном обмене данными XML?

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

Разработчики, занимающиеся интеграцией систем на платформе «1С:Предприятие», часто сталкиваются со следующей проблемой: правила обмена, разработанные в конфигурации «Конвертация данных 2.1» (КД 2), прекрасно выполняются в рамках типового регламентного обмена (например, при синхронизации УТ 10.3 и БП 3.0), но при попытке запустить их через стандартную внешнюю обработку УниверсальныйОбменДаннымиXML («Универсальный обмен») система выдает лавину ошибок.

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

Выясняем причину: Разница в «движках» выполнения правил

Для того чтобы понять суть проблемы, нам необходимо заглянуть под капот платформы 1С и проанализировать, какие именно механизмы интерпретируют XML-файл правил в обоих случаях.

При использовании типового обмена (синхронизации данных), задействующего Библиотеку стандартных подсистем (БСП), выполнение конвертации берет на себя специализированная обработка КонвертацияОбъектовИнформационныхБаз. Этот механизм глубоко интегрирован в инфраструктуру конфигурации. Он имеет прямой доступ к планам обмена, настройкам узлов, служебным регистрам сведений и глобальному контексту сеанса.

При запуске выгрузки через обработку УниверсальныйОбменДаннымиXML правила выполняются автономно. Обработка ничего не знает о контексте текущего узла плана обмена БСП, настройках регламентных заданий или специфических константах конкретной синхронизации. Именно это различие контекстов и порождает ошибки выполнения кода в обработчиках событий КД 2.

Главные виновники ошибок: неинициализированные параметры

Проанализируем конкретные технические причины, из-за которых универсальный обмен спотыкается на правилах, предназначенных для типовой синхронизации:

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

Как адаптировать правила обмена в Конвертации Данных 2.1 (без блокнота)

На форумах часто советуют открыть XML-файл правил в блокноте и вручную закомментировать все строки с упоминанием УзелОбмена. Мы настоятельно рекомендуем не делать этого вручную. Ручная правка XML-кода часто приводит к нарушению его структуры и делает правила непригодными для обратной загрузки в Конвертацию данных. Правильный путь — выполнить доработку в самой конфигурации КД 2.1.

Разберем по шагам, как сделать правила универсальными.

Шаг 1. Безопасное обращение к параметрам

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

Вместо прямого обращения:

ОрганизацияУзла = Параметры.УзелОбмена.Организация;

Используем безопасный вариант:


ОрганизацияУзла = Неопределено;
Если Параметры.Свойство("УзелОбмена") И ЗначениеЗаполнено(Параметры.УзелОбмена) Тогда
    ОрганизацияУзла = Параметры.УзелОбмена.Организация;
Иначе
    // Резервный вариант: пытаемся найти организацию по умолчанию
    ОрганизацияУзла = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700000000");
КонецЕсли;

Шаг 2. Адаптация ПВД под выборку по периоду

Если в правилах выгрузки данных используется произвольный алгоритм выборки объектов, завязанный на узел обмена БСП, его нужно адаптировать так, чтобы при отсутствии узла система делала выборку по датам начала и окончания периода.

Рассмотрим пример адаптации кода в обработчике ПВД «Перед обработкой»:


Если Параметры.Свойство("УзелОбмена") И ЗначениеЗаполнено(Параметры.УзелОбмена) Тогда
    // Используем стандартный механизм выборки БСП по плану обмена
    ВыборкаДанных = ВыбратьИзменения(Параметры.УзелОбмена, ВыборкаДляВыгрузки);
Иначе
    // Если узел не задан, выполняем обычный запрос за период
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   РеализацияТоваровУслуг.Ссылка КАК Ссылка
        |ИЗ
        |   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        |ГДЕ
        |   РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаКонца";
        
    // ДатаНачала и ДатаКонца автоматически передаются из реквизитов обработки Универсальный обмен
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
    Запрос.УстановитьПараметр("ДатаКонца",  КонецДня(ДатаКонца));
    
    ВыборкаДанных = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецЕсли;

Шаг 3. Инициализация параметров по умолчанию в КД 2.1

Откроем наши правила в конфигурации «Конвертация данных 2.1» и перейдем на вкладку «Параметры».

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


Если Не Параметры.Свойство("РежимЗаписиДокументов") Тогда
    Параметры.Вставить("РежимЗаписиДокументов", "Записывать");
КонецЕсли;

Шаг 4. Локализация ошибок с помощью режима отладки

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

Проанализируем этот процесс по шагам:

  1. В конфигурации «Конвертация данных 2.1» при выгрузке правил установите флаг «Выгрузить обработчики событий в отдельный текстовый файл» или выгрузите их в модуль внешней обработки отладки.
  2. Откройте обработку УниверсальныйОбменДаннымиXML в режиме «1С:Предприятие».
  3. Перейдите на вкладку «Дополнительные настройки».
  4. Установите флаг «Режим отладки обработчиков выгрузки».
  5. Укажите путь к файлу выгруженных обработчиков и выберите вариант подключения алгоритмов (например, через генерацию временного модуля).

Теперь при возникновении ошибки платформа укажет точную строку кода во временном модуле обработки отладки, и вы сможете моментально определить, в каком именно ПКО или ПВД происходит попытка обращения к несуществующему параметру узла.

← На главную