Синхронизация данных через универсальный формат (EnterpriseData) — это современный и гибкий механизм обмена между конфигурациями 1С. Однако при необходимости добавить в обмен объект, который изначально не предусмотрен типовым правилами (например, справочник НомераГТД), разработчики часто сталкиваются с тем, что данные не попадают в файл обмена или не загружаются в базу-приемник. В этой статье мы подробно разберем процесс доработки обмена, исправим типичные ошибки и выясним, как правильно настроить XDTO-пакеты.
Прежде чем приступать к написанию кода, необходимо убедиться, что новый объект включен в состав плана обмена. Рассмотрим этот этап. В обеих базах (источнике и приемнике) нужно найти используемый план обмена (например, СинхронизацияДанныхЧерезУниверсальныйФормат) и добавить в его состав справочник НомераГТД. Без этого шага система не сможет регистрировать изменения объекта, и он никогда не попадет в очередь на выгрузку. Для проверки состава очереди и ручной фиксации объектов можно применить инструмент для регистрации изменений в плане обмена.
Правила обработки данных определяют, какие объекты и при каких условиях будут выбраны для обмена. Проанализируем процедуру ЗаполнитьПравилаОбработкиДанных в общем модуле МенеджерОбменаЧерезУниверсальныйФормат. Для чистоты разработки рекомендуется использовать расширение конфигурации.
Создадим процедуры для добавления ПОД на отправку и получение:
&После("ЗаполнитьПравилаОбработкиДанных")
Процедура Расш1_ЗаполнитьПравилаОбработкиДанных(НаправлениеОбмена, ПравилаОбработкиДанных)
Если НаправлениеОбмена = "Отправка" Тогда
ДобавитьПОД_Справочник_НомераГТД_Отправка(ПравилаОбработкиДанных);
ИначеЕсли НаправлениеОбмена = "Получение" Тогда
ДобавитьПОД_Справочник_НомераГТД_Получение(ПравилаОбработкиДанных);
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьПОД_Справочник_НомераГТД_Отправка(ПравилаОбработкиДанных)
ПравилоОбработки = ПравилаОбработкиДанных.Добавить;
ПравилоОбработки.Имя = "Справочник_НомераГТД_Отправка";
ПравилоОбработки.ОбъектВыборкиМетаданные = Метаданные.Справочники.НомераГТД;
ПравилоОбработки.ИспользуемыеПКО.Добавить("Справочник_НомераГТД_Отправка");
КонецПроцедуры
Процедура ДобавитьПОД_Справочник_НомераГТД_Получение(ПравилаОбработкиДанных)
ПравилоОбработки = ПравилаОбработкиДанных.Добавить;
ПравилоОбработки.Имя = "Справочник_НомераГТД_Получение";
ПравилоОбработки.ОбъектВыборкиФормат = "Справочник.НомерГТД";
ПравилоОбработки.ИспользуемыеПКО.Добавить("Справочник_НомераГТД_Получение");
КонецПроцедуры
Важный момент: Обратите внимание на соответствие имен. Имя ПКО, указанное в ИспользуемыеПКО.Добавить(), должно в точности совпадать с тем, которое мы определим в правилах конвертации далее.
ПКО описывают соответствие реквизитов объекта метаданных и полей формата XDTO. Рассмотрим, как правильно инициализировать правила конвертации для нашего справочника. Здесь критически важно указать ВариантИдентификации.
&После("ЗаполнитьПравилаКонвертацииОбъектов")
Процедура Расш1_ЗаполнитьПравилаКонвертацииОбъектов(НаправлениеОбмена, ПравилаКонвертации)
Если НаправлениеОбмена = "Отправка" Тогда
ДобавитьПКО_Справочник_НомерГТД_Отправка(ПравилаКонвертации);
ИначеЕсли НаправлениеОбмена = "Получение" Тогда
ДобавитьПКО_Справочник_НомерГТД_Получение(ПравилаКонвертации);
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьПКО_Справочник_НомерГТД_Отправка(ПравилаКонвертации)
ПравилоКонвертации = ОбменДаннымиXDTOСервер.ИнициализироватьПравилоКонвертацииОбъекта(ПравилаКонвертации);
ПравилоКонвертации.ИмяПКО = "Справочник_НомерГТД_Отправка";
ПравилоКонвертации.ОбъектДанных = Метаданные.Справочники.НомераГТД;
ПравилоКонвертации.ОбъектФормата = "Справочник.НомерГТД";
ПравилоКонвертации.ВариантИдентификации = "ПоУникальномуИдентификатору";
СвойстваШапки = ПравилоКонвертации.Свойства;
ДобавитьПКС(СвойстваШапки, "Комментарий", "Комментарий");
ДобавитьПКС(СвойстваШапки, "РегистрационныйНомер", "РегистрационныйНомер");
ДобавитьПКС(СвойстваШапки, "Наименование", "Наименование");
ДобавитьПКС(СвойстваШапки, "Код", "Код");
КонецПроцедуры
Если мы хотим искать объекты не по UUID, а по полям (например, по номеру ГТД), необходимо изменить ВариантИдентификации на "ПоПолямПоиска" и описать процедуру ПКО_Справочник_НомерГТД_Получение_ПриПоиске.
Одной из самых частых причин неудач является отсутствие типа объекта в XDTO-пакете. Формат EnterpriseData жестко типизирован. Если вы просто напишете в коде Справочник.НомерГТД, но этого типа нет в пакете EnterpriseData_1_6_X, выгрузка выдаст ошибку или проигнорирует данные.
Разберем алгоритм настройки XDTO в расширении:
EnterpriseData_1_6_20).Справочник.НомерГТД.КлючевыеСвойства. Тип этого свойства должен быть ссылочным (например, КлючевыеСвойстваНомерГТД).КлючевыеСвойстваНомерГТД, добавьте в него поля Ссылка, Наименование, Код.Ссылка в типе ключевых свойств должен быть тип СправочникСсылка.НомерГТД. Это позволит системе корректно сопоставлять идентификаторы.Проанализируем ошибку "Отсутствует обязательное свойство". Она возникает, если в XDTO-пакете у свойств установлены параметры Минимальное количество = 1, но при выгрузке эти поля оказываются пустыми. Для справочников рекомендуется ставить Минимальное количество = 0 для необязательных реквизитов.
Чтобы номер ГТД выгружался вместе с номенклатурой, нужно доработать ПКО номенклатуры. Мы не будем полностью переопределять типовое правило, а воспользуемся методом &После.
&После("ДобавитьПКО_Справочник_Номенклатура_Отправка")
Процедура Расш1_ДобавитьПКО_Справочник_Номенклатура_Отправка(ПравилаКонвертации)
// Находим существующее правило
ПравилоКонвертации = ПравилаКонвертации.Найти("Справочник_Номенклатура_Отправка", "ИмяПКО");
Если ПравилоКонвертации = Неопределено Тогда
Возврат;
КонецЕсли;
СвойстваШапки = ПравилоКонвертации.Свойства;
// Добавляем ПКС для НомераГТД
ДобавитьПКС(СвойстваШапки, "НомерГТД", "НомерГТД", , "Справочник_НомерГТД_Отправка");
КонецПроцедуры
Здесь мы указываем, что реквизит НомерГТД должен конвертироваться по правилу Справочник_НомерГТД_Отправка. Обратите внимание, что в XDTO-типе Справочник.Номенклатура также должно быть добавлено свойство НомерГТД с типом ключевых свойств номера ГТД.
Если вы используете специфические процедуры, такие как ПриОтправкеДанных или ПриПоиске, их недостаточно просто объявить в расширении. Система вызывает их через централизованный хаб ВыполнитьПроцедуруМодуляМенеджера. Вам необходимо расширить эту процедуру:
&После("ВыполнитьПроцедуруМодуляМенеджера")
Процедура Расш1_ВыполнитьПроцедуруМодуляМенеджера(ИмяПроцедуры, Параметры, СтандартнаяОбработка)
Если ИмяПроцедуры = "ПКО_Справочник_НомерГТД_Отправка_ПриОтправкеДанных" Тогда
// Ваш код обработки
КонецЕсли;
КонецПроцедуры
Если вы выполнили все шаги, но данные по-прежнему "не летят", проанализируем ситуацию с помощью специальных инструментов:
НомераГТД к отправке. Если нет — проблема в составе плана обмена или правилах регистрации.Таким образом, доработка обмена через универсальный формат требует комплексного подхода: настройки метаданных, написания правил в модуле менеджера и строгого соответствия этих правил структуре XDTO-пакета в расширении. Следуя этой методике, вы сможете успешно синхронизировать любые дополнительные данные между базами 1С. Для пошаговой проверки созданных правил и поиска ошибок можно использовать расширение для отладки обмена через универсальный формат.