Синхронизация данных между современными конфигурациями 1С (такими как ERP, УТ 11 и БП 3.0) чаще всего строится на базе Универсального формата (EnterpriseData). Это мощный механизм, однако стандартные правила не всегда соответствуют специфическим требованиям бизнеса. Часто возникают задачи либо по подмене данных «на лету» (например, замена всех статей движения денежных средств на одну общую), либо по исправлению технических ошибок, связанных с различием версий XDTO-пакетов в разных базах.
В этой статье мы подробно разберем, как вмешаться в процесс обмена, если конфигурации стоят на поддержке, и что делать, когда обмен выдает ошибку о недостающих свойствах в пакете данных.
Рассмотрим ситуацию: нам необходимо, чтобы при передаче банковских документов из ERP в Бухгалтерию предприятия статья ДДС не переносилась «как есть», а принудительно заменялась на значение «Прочее» в базе-приемнике. Проанализируем, где именно происходит формирование данных для отправки.
В механизме EnterpriseData за логику формирования сообщения отвечает общий модуль МенеджерОбменаЧерезУниверсальныйФормат. Если мы работаем с ERP, нам нужно найти этот модуль (их может быть несколько для разных версий формата, выбираем актуальный, например, МенеджерОбменаЧерезУниверсальныйФормат_1_13).
Шаг 1. Поиск нужной процедуры ПОД
Аббревиатура ПОД означает «Правила Обработки Данных». Для каждого типа документа существует своя процедура. Если мы правим выгрузку списания безналичных денежных средств, нам интересна процедура ПОД_Документ_СписаниеБезналичныхДенежныхСредств_ПриОбработке. Разберем, как она работает.
Шаг 2. Модификация данных выгрузки
В этой процедуре доступны параметры ДанныеИБ (структура или объект с данными из текущей базы) и ДанныеXDTO (структура, которая будет сериализована в XML). Чтобы подменить статью, мы можем либо очистить её в источнике, либо сформировать правильную ссылку для приемника.
Проанализируем пример кода, который позволяет очистить значение или подготовить его к замене:
Процедура ПОД_Документ_СписаниеБезналичныхДенежныхСредств_ПриОбработке(ДанныеИБ, ДанныеXDTO, КомпонентыОбмена, СтекВыгрузки)
// Если нужно просто очистить статью, чтобы БП подставила значение по умолчанию
ДанныеИБ.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.ПустаяСсылка();
// Но правильнее работать напрямую со структурой XDTO, которая уходит в файл
Если ДанныеXDTO.Свойство("СтатьяДвиженияДенежныхСредств") Тогда
// Здесь мы можем сформировать структуру поиска для БП
КлючевыеСвойстваСтатьи = Новый Структура;
КлючевыеСвойстваСтатьи.Вставить("Наименование", "Прочее");
ДанныеXDTO.СтатьяДвиженияДенежныхСредств = КлючевыеСвойстваСтатьи;
КонецЕсли;
КонецПроцедуры
Обратите внимание: так как конфигурация типовая, крайне рекомендуется выполнять эти изменения через Расширение конфигурации. Для этого мы заимствуем общий модуль в расширение и используем аннотацию &После или &Вместо для нужной процедуры.
Проанализируем вторую проблему: при обмене между УТ 11 и БП 3.0 (часто встречается в локальных релизах, например, для Узбекистана) возникает ошибка десериализации. БП ожидает в объекте Подразделение свойство КодВПрограмме, а УТ его не отправляет, так как в её пакете XDTO этого поля нет.
Это классическая ситуация рассинхронизации версий формата EnterpriseData. Если нельзя обновить конфигурации до полностью совместимых релизов, придется исправлять ошибку программно.
Вариант 1. Понижение версии формата
Самый простой способ — зайти в настройки синхронизации в обеих базах и попробовать установить более старую версию состава данных (например, 1.8 вместо 1.10). В старых версиях проверки менее жесткие, и отсутствующее поле может не вызвать критической ошибки.
Вариант 2. Использование расширения на стороне Приемника (БП)
Если понижение версии не помогает, нужно «научить» БП игнорировать отсутствие этого поля. Поскольку ошибка возникает при чтении данных, нам нужно вмешаться в процесс загрузки. Рассмотрим, как это сделать через расширение в БП 3.0.
МенеджерОбменаЧерезУниверсальныйФормат.ПКО_Справочник_ПодразделенияОрганизаций_ПриЧтенииДанныхXDTO).Пример программного обхода ошибки:
&Вместо("ПКО_Справочник_ПодразделенияОрганизаций_ПриЧтенииДанныхXDTO")
Процедура Расш_ПКО_Справочник_ПодразделенияОрганизаций_ПриЧтенииДанныхXDTO(ДанныеXDTO, ПолученныеДанные, КомпонентыОбмена)
// Вызываем стандартную обработку, но оборачиваем потенциально опасные места
// Или полностью переопределяем логику поиска
Попытка
ПродолжитьВызов(ДанныеXDTO, ПолученныеДанные, КомпонентыОбмена);
Исключение
// Если ошибка именно в отсутствии "КодВПрограмме", подавляем её
ТекстОшибки = ИнформацияОбОшибке().Описание;
Если Найти(ТекстОшибки, "КодВПрограмме") > 0 Тогда
// Логика заполнения объекта без использования этого свойства
// Например, поиск только по Наименованию
ПолученныеДанные.Наименование = ДанныеXDTO.Наименование;
Иначе
ВызватьИсключение; // Если ошибка другая - пробрасываем дальше
КонецЕсли;
КонецПопытки;
КонецПроцедуры
Выясним причину, почему нельзя просто добавить свойство в пакет XDTO через расширение. Как показывает практика, 1С жестко контролирует соответствие имен и пространств имен (URI) в пакетах. Если вы добавите свойство в расширяемый пакет EnterpriseData, система может выдать ошибку контроля метаданных (Значение контролируемого свойства Пакет не совпадает).
Поэтому правильный путь — это не правка структуры пакета, а правка кода модулей, которые этот пакет используют. Рассмотрим основные рекомендации:
/РежимОтладки и установите остановку по ошибке.Подводя итог, можно сказать, что механизм EnterpriseData достаточно гибок для модификаций. Главное — помнить, что вся логика трансформации данных сосредоточена в менеджерах обмена, а использование расширений позволяет сохранять конфигурации на поддержке, реализуя при этом самые сложные требования к синхронизации данных.