Как добавить новый справочник в синхронизацию через универсальный формат (EnterpriseData) в 1С:Бухгалтерия 3.0

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

Синхронизация данных через универсальный формат (EnterpriseData) — это современный и гибкий механизм обмена между конфигурациями 1С. Однако при необходимости добавить в обмен объект, который изначально не предусмотрен типовым правилами (например, справочник НомераГТД), разработчики часто сталкиваются с тем, что данные не попадают в файл обмена или не загружаются в базу-приемник. В этой статье мы подробно разберем процесс доработки обмена, исправим типичные ошибки и выясним, как правильно настроить XDTO-пакеты.

Предварительные действия: состав плана обмена

Прежде чем приступать к написанию кода, необходимо убедиться, что новый объект включен в состав плана обмена. Рассмотрим этот этап. В обеих базах (источнике и приемнике) нужно найти используемый план обмена (например, СинхронизацияДанныхЧерезУниверсальныйФормат) и добавить в его состав справочник НомераГТД. Без этого шага система не сможет регистрировать изменения объекта, и он никогда не попадет в очередь на выгрузку. Для проверки состава очереди и ручной фиксации объектов можно применить инструмент для регистрации изменений в плане обмена.

Доработка правил обработки данных (ПОД)

Правила обработки данных определяют, какие объекты и при каких условиях будут выбраны для обмена. Проанализируем процедуру ЗаполнитьПравилаОбработкиДанных в общем модуле МенеджерОбменаЧерезУниверсальныйФормат. Для чистоты разработки рекомендуется использовать расширение конфигурации.

Создадим процедуры для добавления ПОД на отправку и получение:


&После("ЗаполнитьПравилаОбработкиДанных")
Процедура Расш1_ЗаполнитьПравилаОбработкиДанных(НаправлениеОбмена, ПравилаОбработкиДанных)
    Если НаправлениеОбмена = "Отправка" Тогда
        ДобавитьПОД_Справочник_НомераГТД_Отправка(ПравилаОбработкиДанных);
    ИначеЕсли НаправлениеОбмена = "Получение" Тогда
        ДобавитьПОД_Справочник_НомераГТД_Получение(ПравилаОбработкиДанных);
    КонецЕсли;
КонецПроцедуры

Процедура ДобавитьПОД_Справочник_НомераГТД_Отправка(ПравилаОбработкиДанных)
    ПравилоОбработки = ПравилаОбработкиДанных.Добавить;
    ПравилоОбработки.Имя = "Справочник_НомераГТД_Отправка";
    ПравилоОбработки.ОбъектВыборкиМетаданные = Метаданные.Справочники.НомераГТД;
    ПравилоОбработки.ИспользуемыеПКО.Добавить("Справочник_НомераГТД_Отправка");
КонецПроцедуры

Процедура ДобавитьПОД_Справочник_НомераГТД_Получение(ПравилаОбработкиДанных)
    ПравилоОбработки = ПравилаОбработкиДанных.Добавить;
    ПравилоОбработки.Имя = "Справочник_НомераГТД_Получение";
    ПравилоОбработки.ОбъектВыборкиФормат = "Справочник.НомерГТД";
    ПравилоОбработки.ИспользуемыеПКО.Добавить("Справочник_НомераГТД_Получение");
КонецПроцедуры

Важный момент: Обратите внимание на соответствие имен. Имя ПКО, указанное в ИспользуемыеПКО.Добавить(), должно в точности совпадать с тем, которое мы определим в правилах конвертации далее.

Настройка правил конвертации объектов (ПКО)

ПКО описывают соответствие реквизитов объекта метаданных и полей формата XDTO. Рассмотрим, как правильно инициализировать правила конвертации для нашего справочника. Здесь критически важно указать ВариантИдентификации.


&После("ЗаполнитьПравилаКонвертацииОбъектов")
Процедура Расш1_ЗаполнитьПравилаКонвертацииОбъектов(НаправлениеОбмена, ПравилаКонвертации)
    Если НаправлениеОбмена = "Отправка" Тогда
        ДобавитьПКО_Справочник_НомерГТД_Отправка(ПравилаКонвертации);
    ИначеЕсли НаправлениеОбмена = "Получение" Тогда
        ДобавитьПКО_Справочник_НомерГТД_Получение(ПравилаКонвертации);
    КонецЕсли;
КонецПроцедуры

Процедура ДобавитьПКО_Справочник_НомерГТД_Отправка(ПравилаКонвертации)
    ПравилоКонвертации = ОбменДаннымиXDTOСервер.ИнициализироватьПравилоКонвертацииОбъекта(ПравилаКонвертации);
    ПравилоКонвертации.ИмяПКО = "Справочник_НомерГТД_Отправка";
    ПравилоКонвертации.ОбъектДанных = Метаданные.Справочники.НомераГТД;
    ПравилоКонвертации.ОбъектФормата = "Справочник.НомерГТД";
    ПравилоКонвертации.ВариантИдентификации = "ПоУникальномуИдентификатору";
    
    СвойстваШапки = ПравилоКонвертации.Свойства;
    ДобавитьПКС(СвойстваШапки, "Комментарий", "Комментарий");
    ДобавитьПКС(СвойстваШапки, "РегистрационныйНомер", "РегистрационныйНомер");
    ДобавитьПКС(СвойстваШапки, "Наименование", "Наименование");
    ДобавитьПКС(СвойстваШапки, "Код", "Код");
КонецПроцедуры

Если мы хотим искать объекты не по UUID, а по полям (например, по номеру ГТД), необходимо изменить ВариантИдентификации на "ПоПолямПоиска" и описать процедуру ПКО_Справочник_НомерГТД_Получение_ПриПоиске.

Работа с XDTO-пакетом: расширение формата

Одной из самых частых причин неудач является отсутствие типа объекта в XDTO-пакете. Формат EnterpriseData жестко типизирован. Если вы просто напишете в коде Справочник.НомерГТД, но этого типа нет в пакете EnterpriseData_1_6_X, выгрузка выдаст ошибку или проигнорирует данные.

Разберем алгоритм настройки XDTO в расширении:

  1. Добавьте в расширение пакет XDTO нужной версии (например, EnterpriseData_1_6_20).
  2. Создайте новый Тип объекта с именем Справочник.НомерГТД.
  3. Внутри него создайте свойство КлючевыеСвойства. Тип этого свойства должен быть ссылочным (например, КлючевыеСвойстваНомерГТД).
  4. Создайте тип КлючевыеСвойстваНомерГТД, добавьте в него поля Ссылка, Наименование, Код.
  5. Важно: У свойства Ссылка в типе ключевых свойств должен быть тип СправочникСсылка.НомерГТД. Это позволит системе корректно сопоставлять идентификаторы.

Проанализируем ошибку "Отсутствует обязательное свойство". Она возникает, если в XDTO-пакете у свойств установлены параметры Минимальное количество = 1, но при выгрузке эти поля оказываются пустыми. Для справочников рекомендуется ставить Минимальное количество = 0 для необязательных реквизитов.

Связывание объектов (Номенклатура и НомерГТД)

Чтобы номер ГТД выгружался вместе с номенклатурой, нужно доработать ПКО номенклатуры. Мы не будем полностью переопределять типовое правило, а воспользуемся методом &После.


&После("ДобавитьПКО_Справочник_Номенклатура_Отправка")
Процедура Расш1_ДобавитьПКО_Справочник_Номенклатура_Отправка(ПравилаКонвертации)
    // Находим существующее правило
    ПравилоКонвертации = ПравилаКонвертации.Найти("Справочник_Номенклатура_Отправка", "ИмяПКО");
    Если ПравилоКонвертации = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    СвойстваШапки = ПравилоКонвертации.Свойства;
    // Добавляем ПКС для НомераГТД
    ДобавитьПКС(СвойстваШапки, "НомерГТД", "НомерГТД", , "Справочник_НомерГТД_Отправка");
КонецПроцедуры

Здесь мы указываем, что реквизит НомерГТД должен конвертироваться по правилу Справочник_НомерГТД_Отправка. Обратите внимание, что в XDTO-типе Справочник.Номенклатура также должно быть добавлено свойство НомерГТД с типом ключевых свойств номера ГТД.

Регистрация обработчиков в менеджере

Если вы используете специфические процедуры, такие как ПриОтправкеДанных или ПриПоиске, их недостаточно просто объявить в расширении. Система вызывает их через централизованный хаб ВыполнитьПроцедуруМодуляМенеджера. Вам необходимо расширить эту процедуру:


&После("ВыполнитьПроцедуруМодуляМенеджера")
Процедура Расш1_ВыполнитьПроцедуруМодуляМенеджера(ИмяПроцедуры, Параметры, СтандартнаяОбработка)
    Если ИмяПроцедуры = "ПКО_Справочник_НомерГТД_Отправка_ПриОтправкеДанных" Тогда
        // Ваш код обработки
    КонецЕсли;
КонецПроцедуры

Инструменты для отладки

Если вы выполнили все шаги, но данные по-прежнему "не летят", проанализируем ситуацию с помощью специальных инструментов:

  1. Обработка "Регистрация изменений для обмена": Проверьте, зарегистрированы ли конкретные элементы НомераГТД к отправке. Если нет — проблема в составе плана обмена или правилах регистрации.
  2. Типовая обработка "Выгрузка и загрузка данных EnterpriseData": Это лучший способ проверить корректность ваших ПКО и XDTO. Попробуйте выгрузить один объект вручную. Если есть ошибка в структуре XDTO, обработка сразу её покажет.
  3. Журнал регистрации: При возникновении ошибок XDTO (например, несоответствие типов), 1С записывает детальный лог ошибки в Журнал регистрации. Ищите события с категорией "Обмен данными".

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

← На главную