Почему при обмене через план обмена отсутствуют теги ИмяТипаВИБИсточнике и КлючПоискаВИБИсточнике и как это исправить?

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

При настройке интеграции между современными конфигурациями на базе Библиотеки Стандартных Подсистем (БСП), такими как 1С:Управление торговлей, редакция 11, и устаревшими или полностью самописными конфигурациями на обычных формах (например, с модулями обмена от 1С:Управление торговлей 10.3), разработчики часто сталкиваются с неприятной технической проблемой. В выгружаемом XML-файле обмена внезапно пропадают служебные теги ИмяТипаВИБИсточнике и КлючПоискаВИБИсточнике. Отсутствие этих тегов приводит к тому, что база-приемник не может сделать запись в регистр сведений СоответствиеОбъектовИнформационныхБаз и аварийно завершает чтение файла с ошибками разбора XML-схемы.

В этой статье мы подробно разберем, почему возникает данное поведение механизмов платформы, проанализируем разницу в алгоритмах выгрузки старых и новых конфигураций, а также рассмотрим три практических способа решения проблемы с примерами готового кода.

---

1. Роль тегов сопоставления в правилах обмена «Конвертации данных 2.1»

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

Когда база-приемник считывает эти теги, она обращается к регистру сведений СоответствиеОбъектовИнформационныхБаз. Механизм проверяет, существует ли уже связь между объектом источника с данным уникальным ключом и каким-либо объектом в текущей базе. Если связь найдена, то данные записываются в существующий объект. Если связи нет, создается новый элемент, а в регистр сведений добавляется запись о соответствии для последующих сессий обмена.

Если эти теги в файле XML отсутствуют, база-приемник теряет ориентиры для сопоставления объектов по сложным полям поиска или через регистр соответствий, что приводит к задвоению данных или к критическим ошибкам выполнения запросов поиска.

---

2. Почему теги исчезают при выгрузке из «1С:Управление торговлей 11»?

Проанализируем архитектурные изменения в платформе 1С. В старых конфигурациях (таких как УТ 10.3, БП 2.0, КА 1.1) для выгрузки и загрузки данных использовалась классическая обработка ОбменДаннымиXML. Этот инструмент всегда жестко следовал описанию правил КД 2.1 и выгружал служебные теги соответствия для каждого ссылочного узла по умолчанию.

В современных конфигурациях на управляемых формах (таких как УТ 11, БП 3.0, ERP 2) за обмен данными отвечает встроенный механизм БСП — обработка КонвертацияОбъектовИнформационныхБаз. Логика работы этого механизма существенно оптимизирована:

  1. Оптимизация XML-пакета: Если БСП определяет, что обмен настроен напрямую (по уникальным идентификаторам GUID) и трансляция ключей поиска не требуется, она отключает избыточную генерацию тегов КлючПоискаВИБИсточнике и ИмяТипаВИБИсточнике для экономии дискового пространства и снижения нагрузки на процессор при парсинге файлов.
  2. Режим работы плана обмена: В настройках синхронизации БСП анализирует свойства узла плана обмена. Если в кодовой базе интеграции не задекларировано использование регистра соответствий, то выгрузчик переходит в «упрощенный» режим, выгружая только чистый УникальныйИдентификатор объекта.
  3. Настройки ПКО в КД 2.1: Если в правилах конвертации объектов (ПКО) для конкретного справочника снят флаг «Синхронизировать по идентификатору» или логика поиска переопределена сложными обработчиками событий, выгрузчик БСП также может принять решение о пропуске генерации виртуальных свойств.

В результате мы получаем ситуацию: правила обмена написаны корректно, но при их выполнении внутри БСП на стороне УТ 11 теги сопоставления в XML-файл просто не записываются.

---

3. К какой ошибке в базе-приемнике это приводит?

Когда самописная база-приемник, использующая устаревшие алгоритмы загрузки из УТ 10.3, пытается прочитать файл без этих тегов, выполнение программы прерывается. Давайте разберем, почему это происходит.

В коде модуля загрузки (обработки ОбменДаннымиXML) присутствует функция НайтиЭлементЗапросом(). Она динамически формирует текст SQL-запроса для поиска существующей записи в базе по переданным параметрам. Ожидая увидеть в XML-структуре теги КлючПоискаВИБИсточнике, загрузчик пытается подставить их значения в условия запроса.

Поскольку тегов в файле нет, переменные поиска инициализируются как Неопределено или пустые строки. В результате формируется некорректный текст запроса к базе данных, например:

ВЫБРАТЬ Ссылка ИЗ Справочник.Организации ГДЕ = &ПараметрПоиска

Отсутствие имени поля в левой части оператора сравнения вызывает ошибку СУБД:

«Синтаксическая ошибка "=" ВЫБРАТЬ Ссылка ИЗ...», и процесс обмена полностью блокируется.

---

4. Три способа решения проблемы

Давайте рассмотрим три практических варианта обхода и решения данной проблемы, от доработки базы-приемника до модификации правил обмена.

Способ 1. Модернизация алгоритма загрузки в базе-приемнике (Рекомендуемый)

Если база-приемник является самописной конфигурацией, наиболее правильным и системным подходом будет научить ее загрузчик корректно обрабатывать XML-файлы, в которых отсутствуют теги сопоставления. Это избавит вас от необходимости постоянно модифицировать правила обмена при их обновлении.

Для реализации этого решения выполним следующие шаги:

  1. Откроем модуль объекта обработки загрузки данных (обычно это ОбменДаннымиXML или специализированный общий модуль интеграции).
  2. Найдем функцию НайтиЭлементЗапросом() или метод, отвечающий за поиск по идентификаторам источника.
  3. Добавим проверку заполнения параметров поиска. Если теги не были переданы, мы должны перенаправить логику поиска на стандартный поиск по уникальному идентификатору (GUID).

Рассмотрим пример реализации такой проверки в коде:


Функция НайтиЭлементЗапросом(СвойстваПоиска, ИмяМетаданных)
    
    // Проверяем наличие ключевых параметров во входящей структуре свойств
    КлючИсточника = "";
    Если СвойстваПоиска.Свойство("{КлючПоискаВИБИсточнике}", КлючИсточника) И ЗначениеЗаполнено(КлючИсточника) Тогда
        // Выполняем стандартный поиск через регистр соответствий
        Возврат ПоискПоРегиструСоответствий(КлючИсточника, ИмяМетаданных);
    Иначе
        // Если теги отсутствуют в файле, пробуем найти объект по чистому UID
        UIDСтрока = "";
        Если СвойстваПоиска.Свойство("{УникальныйИдентификатор}", UIDСтрока) И ЗначениеЗаполнено(UIDСтрока) Тогда
            Попытка
                UIDОбъект = Новый УникальныйИдентификатор(UIDСтрока);
                СсылкаНаОбъект = Справочники[ИмяМетаданных].ПолучитьСсылку(UIDОбъект);
                
                // Проверяем реальное существование объекта в базе данных
                Если ОбщегоНазначения.СсылкаСуществует(СсылкаНаОбъект) Тогда
                    Возврат СсылкаНаОбъект;
                КонецЕсли;
            Исключение
                // Обработка некорректного формата GUID
                ЗаписатьЛогОшибок("Некорректный формат уникального идентификатора: " + UIDСтрока);
            КонецПопытки;
        КонецЕсли;
    КонецЕсли;
    
    Возврат Неопределено;
КонецФункции

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

Способ 2. Принудительная генерация тегов в правилах обмена (на стороне УТ 11)

Если вносить изменения в код конфигурации-приемника по каким-то причинам нельзя (например, конфигурация находится на жесткой поддержке или закрыта для редактирования), мы можем заставить выгрузчик УТ 11 принудительно добавлять эти теги в файл обмена XML.

Для этого нам потребуется открыть наши правила обмена в конфигурации Конвертация данных 2.1 и настроить передачу этих реквизитов как виртуальных свойств в Правилах конвертации свойств (ПКС) для необходимых справочников:

  1. Откроем нужное ПКО (например, ПКО справочника Организации).
  2. На вкладке «Конвертация свойств» добавим две новые строки (без указания источника в метаданных):
    • Имя свойства приемника: {КлючПоискаВИБИсточнике}
    • Имя свойства приемника: {ИмяТипаВИБИсточнике}
  3. Для свойства {КлючПоискаВИБИсточнике} в обработчике события «Перед выгрузкой» напишем следующий код:

// Получаем уникальный идентификатор объекта источника в виде строки
Значение = Строка(Источник.Ссылка.УникальныйИдентификатор());
  1. Для свойства {ИмяТипаВИБИсточнике} в обработчике события «Перед выгрузкой» пропишем определение метаданных:

// Определяем строковый тип объекта источника
Значение = "СправочникСсылка." + Источник.Метаданные().Имя;

После сохранения правил и загрузки их в УТ 11, выгрузчик БСП, обрабатывая данные правила конвертации свойств, запишет эти параметры непосредственно в XML-узел выгружаемого объекта. База-приемник гарантированно считает их при загрузке.

Способ 3. Использование внешней обработки выгрузки V8Exchan83.epf

Если ваш обмен не автоматизирован полностью (например, выполняется вручную администратором по мере необходимости), можно отказаться от использования встроенного в БСП механизма выгрузки в УТ 11.

Вместо этого воспользуемся стандартной внешней обработкой выгрузки V8Exchan83.epf (ее можно найти в каталоге установки шаблонов конфигурации «Конвертация данных»).

Давайте проанализируем преимущества этого способа:

Важное ограничение: данный способ не подходит для регламентных автоматических обменов по расписанию, выполняющихся в фоновом режиме на сервере «1С:Предприятие».

---

5. Рекомендации по отладке и тестированию обмена

Для того чтобы успешно завершить настройку обмена и избежать дальнейших сбоев в промышленной эксплуатации, рекомендуем выполнить следующие действия:

  1. Проверьте флаг синхронизации: В правилах обмена (КД 2.1) для ПКО ключевых справочников убедитесь, что включена опция Синхронизировать по идентификатору. Это базовая настройка, влияющая на поведение выгрузчика.
  2. Проанализируйте XML-файл вручную: Выполните тестовую выгрузку небольшого объема данных из УТ 11 в файл. Откройте его любым текстовым редактором (например, Notepad++) и найдите узел выгруженного элемента справочника. Проверьте физическое наличие строк с атрибутами {КлючПоискаВИБИсточнике}.
  3. Логируйте ошибки сопоставления: При доработке кода приемника обязательно организуйте запись ошибок в Журнал регистрации. Если объект не удается сопоставить ни по регистру, ни по UID, система должна информировать об этом администратора для предотвращения появления «битых» ссылок.

Применяя данные подходы, мы обеспечим стабильную и бесперебойную синхронизацию данных между разнородными информационными системами на платформе «1С:Предприятие».

← На главную