Разработчики, занимающиеся интеграцией систем на платформе «1С:Предприятие», часто сталкиваются со следующей проблемой: правила обмена, разработанные в конфигурации «Конвертация данных 2.1» (КД 2), прекрасно выполняются в рамках типового регламентного обмена (например, при синхронизации УТ 10.3 и БП 3.0), но при попытке запустить их через стандартную внешнюю обработку УниверсальныйОбменДаннымиXML («Универсальный обмен») система выдает лавину ошибок.
В этой статье мы подробно разберем, почему возникает такая разница в поведении систем, проанализируем внутренние механизмы выполнения правил и рассмотрим пошаговый алгоритм адаптации правил обмена для их корректной работы в любом режиме.
Для того чтобы понять суть проблемы, нам необходимо заглянуть под капот платформы 1С и проанализировать, какие именно механизмы интерпретируют XML-файл правил в обоих случаях.
При использовании типового обмена (синхронизации данных), задействующего Библиотеку стандартных подсистем (БСП), выполнение конвертации берет на себя специализированная обработка КонвертацияОбъектовИнформационныхБаз. Этот механизм глубоко интегрирован в инфраструктуру конфигурации. Он имеет прямой доступ к планам обмена, настройкам узлов, служебным регистрам сведений и глобальному контексту сеанса.
При запуске выгрузки через обработку УниверсальныйОбменДаннымиXML правила выполняются автономно. Обработка ничего не знает о контексте текущего узла плана обмена БСП, настройках регламентных заданий или специфических константах конкретной синхронизации. Именно это различие контекстов и порождает ошибки выполнения кода в обработчиках событий КД 2.
Проанализируем конкретные технические причины, из-за которых универсальный обмен спотыкается на правилах, предназначенных для типовой синхронизации:
УзелОбмена (или УзелДляОбмена). Это наиболее частая причина сбоев. В типовом обмене БСП автоматически передает ссылку на текущий узел плана обмена в структуру Параметры. В правилах (в обработчиках «Перед выгрузкой данных», «При выгрузке» объектов) часто присутствуют проверки настроек узла, например:
Организация = Параметры.УзелОбмена.Организация;
В универсальной обработке параметр УзелОбмена равен Неопределено или вообще отсутствует в структуре. Попытка обратиться к его реквизитам через точку вызывает фатальную ошибку: «Значение не является значением объектного типа».
На форумах часто советуют открыть XML-файл правил в блокноте и вручную закомментировать все строки с упоминанием УзелОбмена. Мы настоятельно рекомендуем не делать этого вручную. Ручная правка XML-кода часто приводит к нарушению его структуры и делает правила непригодными для обратной загрузки в Конвертацию данных. Правильный путь — выполнить доработку в самой конфигурации КД 2.1.
Разберем по шагам, как сделать правила универсальными.
Везде, где в обработчиках событий правил обмена используется обращение к параметрам узла обмена, необходимо добавить проверку на существование и заполненность этого параметра. Перепишем небезопасный код на правильный.
Вместо прямого обращения:
ОрганизацияУзла = Параметры.УзелОбмена.Организация;
Используем безопасный вариант:
ОрганизацияУзла = Неопределено;
Если Параметры.Свойство("УзелОбмена") И ЗначениеЗаполнено(Параметры.УзелОбмена) Тогда
ОрганизацияУзла = Параметры.УзелОбмена.Организация;
Иначе
// Резервный вариант: пытаемся найти организацию по умолчанию
ОрганизацияУзла = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700000000");
КонецЕсли;
Если в правилах выгрузки данных используется произвольный алгоритм выборки объектов, завязанный на узел обмена БСП, его нужно адаптировать так, чтобы при отсутствии узла система делала выборку по датам начала и окончания периода.
Рассмотрим пример адаптации кода в обработчике ПВД «Перед обработкой»:
Если Параметры.Свойство("УзелОбмена") И ЗначениеЗаполнено(Параметры.УзелОбмена) Тогда
// Используем стандартный механизм выборки БСП по плану обмена
ВыборкаДанных = ВыбратьИзменения(Параметры.УзелОбмена, ВыборкаДляВыгрузки);
Иначе
// Если узел не задан, выполняем обычный запрос за период
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка КАК Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНачала И &ДатаКонца";
// ДатаНачала и ДатаКонца автоматически передаются из реквизитов обработки Универсальный обмен
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаКонца", КонецДня(ДатаКонца));
ВыборкаДанных = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецЕсли;
Откроем наши правила в конфигурации «Конвертация данных 2.1» и перейдем на вкладку «Параметры».
Для всех параметров, которые обычно передает БСП, но которых не будет в универсальном обмене (например, настройки проведения документов при загрузке, выгрузка аналитики складов и т.д.), нам нужно:
Истина или Ложь).
Если Не Параметры.Свойство("РежимЗаписиДокументов") Тогда
Параметры.Вставить("РежимЗаписиДокументов", "Записывать");
КонецЕсли;
Если после внесения изменений правила все равно выдают ошибки, не нужно гадать, в каком именно обработчике КД произошел сбой. Воспользуемся встроенным механизмом отладки обработчиков выгрузки.
Проанализируем этот процесс по шагам:
УниверсальныйОбменДаннымиXML в режиме «1С:Предприятие».Теперь при возникновении ошибки платформа укажет точную строку кода во временном модуле обработки отладки, и вы сможете моментально определить, в каком именно ПКО или ПВД происходит попытка обращения к несуществующему параметру узла.