При настройке синхронизации между современными конфигурациями 1С, такими как Бухгалтерия предприятия 3.0 и ERP Управление предприятием 2.4, разработчики часто сталкиваются с ситуацией, когда правила, созданные в Конвертации данных 2.1, успешно отрабатывают в ручном режиме через универсальную обработку, но вызывают критические ошибки при попытке запустить их через штатный план обмена. Рассмотрим причины этого явления и разберем способы решения проблемы.
Первым делом проанализируем версии используемых библиотек. В современных конфигурациях вся логика обмена сосредоточена в Библиотеке стандартных подсистем (БСП). В рассматриваемом примере БП 3.0 базируется на БСП версии 3.1.2, в то время как старая ERP 2.4 использует БСП версии 2.4.4.
Выясним причину конфликта: за годы развития БСП механизмы транспорта данных претерпели радикальные изменения. БСП 3.0+ полностью переориентирована на использование формата EnterpriseData (КД 3.0). Хотя поддержка правил КД 2.1 формально сохраняется для обратной совместимости, программные интерфейсы (API) модулей обмена в версии 3.1 сильно отличаются от версии 2.4. Когда ОбменДаннымиСервер в новой БП пытается сформировать пакет для старой ERP, структура заголовков или методов вызова может быть не распознана приемником, что ведет к ошибкам десериализации данных.
Проанализируем текст ошибки из журнала регистрации: КСообщенияОбОшибках = 26. В коде встроенной обработки КонвертацияОбъектовИнформационныхБаз этот код напрямую указывает на отказ системы при вызове метода Записать() для конкретного объекта (в нашем случае — Авансовый отчет).
Посмотрим на ситуацию глубже: почему универсальная обработка УниверсальныйОбменДаннымиXML записывает объект, а план обмена — нет? Рассмотрим основные отличия:
ОбменДанными.Загрузка = Истина. Это отключает почти все проверки бизнес-логики в модулях объекта и подписках на события.АвансовыйОтчет требует заполнения специфических реквизитов (например, подразделение, статья ДДС или данные по НДС), которые не были переданы из БП 3.0 из-за упрощенных правил КД 2.1, платформа просто не даст записать объект, возвращая ошибку записи.Выделим три основных стратегии решения задачи в зависимости от возможности обновления систем и квалификации разработчика.
Это самый правильный путь. Если ERP версии 2.4.2 (выпуска 2017 года) работает в паре с БП 3.0 выпуска 2020 года, количество ошибок в типовых правилах будет только расти. Разберем, что дает обновление:
МенеджерОбменаЧерезУниверсальныйФормат.Рассмотрим переход на современную технологию обмена. В отличие от КД 2.1, где правила жестко привязаны к структуре метаданных конкретных версий, EnterpriseData использует промежуточный формат XSD-схемы. Это позволяет базам обмениваться данными, даже если их внутренняя структура различается.
Для реализации этого подхода выполним следующие шаги:
МенеджерОбменаЧерезУниверсальныйФормат (или аналогичном в вашей версии ERP).Если обновление невозможно, проанализируем ситуацию с помощью отладки. Чтобы "поймать" конкретную причину отказа в записи объекта в приемнике, выполним следующие действия:
КонвертацияОбъектовИнформационныхБаз (модуль объекта) процедуру записи.Объект.Записать();.ОписаниеОшибки() или перейдем внутрь процедуры ПередЗаписью модуля документа в ERP.Скорее всего, вы обнаружите незаполненный обязательный реквизит. Пример кода, который можно добавить в обработчик "После загрузки" в КД 2.1 для устранения таких проблем:
// Пример заполнения обязательных реквизитов для ERP в правилах КД 2.1
Если Не ЗначениеЗаполнено(Объект.Подразделение) Тогда
Объект.Подразделение = Справочники.СтруктураПредприятия.НайтиПоНаименованию("Основное подразделение");
КонецЕсли;
Если Не ЗначениеЗаполнено(Объект.СтатьяДвиженияДенежныхСредств) Тогда
Объект.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.ОплатаПоставщику;
КонецЕсли;
Если штатные планы обмена БСП 3.1 отказываются работать с заголовками файлов КД 2.1, можно обойти механизм синхронизации. Проанализируем возможность использования регламентного задания:
Обработка.УниверсальныйОбменДаннымиXML программно.Пример программного вызова выгрузки:
ОбработкаОбмена = Обработки.УниверсальныйОбменДаннымиXML.Создать();
ОбработкаОбмена.ИмяФайлаПравилОбмена = "C:\Exchange\Rules.xml";
ОбработкаОбмена.ИмяФайлаДанных = "C:\Exchange\Data.xml";
ОбработкаОбмена.РежимОбмена = "Выгрузка";
ОбработкаОбмена.ЗагрузитьПравилаОбмена();
ОбработкаОбмена.ВыполнитьВыгрузку();
Важный итог: Основная причина ваших ошибок — это попытка внедрить старую технологию (КД 2.1) в новый транспортный каркас БСП 3.1, который ожидает иного поведения от объектов. Для стабильной работы рекомендуется либо актуализировать ERP, либо перевести специфические узлы обмена на формат EnterpriseData.