При настройке интеграции между современными конфигурациями на базе Библиотеки Стандартных Подсистем (БСП), такими как 1С:Управление торговлей, редакция 11, и устаревшими или полностью самописными конфигурациями на обычных формах (например, с модулями обмена от 1С:Управление торговлей 10.3), разработчики часто сталкиваются с неприятной технической проблемой. В выгружаемом XML-файле обмена внезапно пропадают служебные теги ИмяТипаВИБИсточнике и КлючПоискаВИБИсточнике. Отсутствие этих тегов приводит к тому, что база-приемник не может сделать запись в регистр сведений СоответствиеОбъектовИнформационныхБаз и аварийно завершает чтение файла с ошибками разбора XML-схемы.
В этой статье мы подробно разберем, почему возникает данное поведение механизмов платформы, проанализируем разницу в алгоритмах выгрузки старых и новых конфигураций, а также рассмотрим три практических способа решения проблемы с примерами готового кода.
---
Для начала давайте разберем, зачем вообще нужны теги ИмяТипаВИБИсточнике и КлючПоискаВИБИсточнике. В технологии классического обмена данными через конфигурацию Конвертация данных 2.1 (КД 2.1) эти теги представляют собой виртуальные реквизиты поиска. Они генерируются выгрузчиком автоматически при передаче ссылочных типов данных и выполняют следующие функции:
КлючПоискаВИБИсточнике — это уникальный строковый ключ, идентифицирующий объект в информационной базе источника (чаще всего это строковое представление GUID объекта).ИмяТипаВИБИсточнике — это полное имя метаданных объекта в базе-источнике (например, СправочникСсылка.Организации или ДокументСсылка.РеализацияТоваровУслуг).Когда база-приемник считывает эти теги, она обращается к регистру сведений СоответствиеОбъектовИнформационныхБаз. Механизм проверяет, существует ли уже связь между объектом источника с данным уникальным ключом и каким-либо объектом в текущей базе. Если связь найдена, то данные записываются в существующий объект. Если связи нет, создается новый элемент, а в регистр сведений добавляется запись о соответствии для последующих сессий обмена.
Если эти теги в файле XML отсутствуют, база-приемник теряет ориентиры для сопоставления объектов по сложным полям поиска или через регистр соответствий, что приводит к задвоению данных или к критическим ошибкам выполнения запросов поиска.
---
Проанализируем архитектурные изменения в платформе 1С. В старых конфигурациях (таких как УТ 10.3, БП 2.0, КА 1.1) для выгрузки и загрузки данных использовалась классическая обработка ОбменДаннымиXML. Этот инструмент всегда жестко следовал описанию правил КД 2.1 и выгружал служебные теги соответствия для каждого ссылочного узла по умолчанию.
В современных конфигурациях на управляемых формах (таких как УТ 11, БП 3.0, ERP 2) за обмен данными отвечает встроенный механизм БСП — обработка КонвертацияОбъектовИнформационныхБаз. Логика работы этого механизма существенно оптимизирована:
GUID) и трансляция ключей поиска не требуется, она отключает избыточную генерацию тегов КлючПоискаВИБИсточнике и ИмяТипаВИБИсточнике для экономии дискового пространства и снижения нагрузки на процессор при парсинге файлов.УникальныйИдентификатор объекта.В результате мы получаем ситуацию: правила обмена написаны корректно, но при их выполнении внутри БСП на стороне УТ 11 теги сопоставления в XML-файл просто не записываются.
---
Когда самописная база-приемник, использующая устаревшие алгоритмы загрузки из УТ 10.3, пытается прочитать файл без этих тегов, выполнение программы прерывается. Давайте разберем, почему это происходит.
В коде модуля загрузки (обработки ОбменДаннымиXML) присутствует функция НайтиЭлементЗапросом(). Она динамически формирует текст SQL-запроса для поиска существующей записи в базе по переданным параметрам. Ожидая увидеть в XML-структуре теги КлючПоискаВИБИсточнике, загрузчик пытается подставить их значения в условия запроса.
Поскольку тегов в файле нет, переменные поиска инициализируются как Неопределено или пустые строки. В результате формируется некорректный текст запроса к базе данных, например:
ВЫБРАТЬ Ссылка ИЗ Справочник.Организации ГДЕ = &ПараметрПоиска
Отсутствие имени поля в левой части оператора сравнения вызывает ошибку СУБД:
«Синтаксическая ошибка "=" ВЫБРАТЬ Ссылка ИЗ...», и процесс обмена полностью блокируется.
---
Давайте рассмотрим три практических варианта обхода и решения данной проблемы, от доработки базы-приемника до модификации правил обмена.
Если база-приемник является самописной конфигурацией, наиболее правильным и системным подходом будет научить ее загрузчик корректно обрабатывать XML-файлы, в которых отсутствуют теги сопоставления. Это избавит вас от необходимости постоянно модифицировать правила обмена при их обновлении.
Для реализации этого решения выполним следующие шаги:
ОбменДаннымиXML или специализированный общий модуль интеграции).НайтиЭлементЗапросом() или метод, отвечающий за поиск по идентификаторам источника.Рассмотрим пример реализации такой проверки в коде:
Функция НайтиЭлементЗапросом(СвойстваПоиска, ИмяМетаданных)
// Проверяем наличие ключевых параметров во входящей структуре свойств
КлючИсточника = "";
Если СвойстваПоиска.Свойство("{КлючПоискаВИБИсточнике}", КлючИсточника) И ЗначениеЗаполнено(КлючИсточника) Тогда
// Выполняем стандартный поиск через регистр соответствий
Возврат ПоискПоРегиструСоответствий(КлючИсточника, ИмяМетаданных);
Иначе
// Если теги отсутствуют в файле, пробуем найти объект по чистому UID
UIDСтрока = "";
Если СвойстваПоиска.Свойство("{УникальныйИдентификатор}", UIDСтрока) И ЗначениеЗаполнено(UIDСтрока) Тогда
Попытка
UIDОбъект = Новый УникальныйИдентификатор(UIDСтрока);
СсылкаНаОбъект = Справочники[ИмяМетаданных].ПолучитьСсылку(UIDОбъект);
// Проверяем реальное существование объекта в базе данных
Если ОбщегоНазначения.СсылкаСуществует(СсылкаНаОбъект) Тогда
Возврат СсылкаНаОбъект;
КонецЕсли;
Исключение
// Обработка некорректного формата GUID
ЗаписатьЛогОшибок("Некорректный формат уникального идентификатора: " + UIDСтрока);
КонецПопытки;
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Такой подход делает загрузчик гибким: он сохраняет совместимость как со старыми выгрузками (где теги присутствуют), так и с новыми оптимизированными файлами из конфигураций на БСП.
Если вносить изменения в код конфигурации-приемника по каким-то причинам нельзя (например, конфигурация находится на жесткой поддержке или закрыта для редактирования), мы можем заставить выгрузчик УТ 11 принудительно добавлять эти теги в файл обмена XML.
Для этого нам потребуется открыть наши правила обмена в конфигурации Конвертация данных 2.1 и настроить передачу этих реквизитов как виртуальных свойств в Правилах конвертации свойств (ПКС) для необходимых справочников:
Организации).{КлючПоискаВИБИсточнике}{ИмяТипаВИБИсточнике}{КлючПоискаВИБИсточнике} в обработчике события «Перед выгрузкой» напишем следующий код:
// Получаем уникальный идентификатор объекта источника в виде строки
Значение = Строка(Источник.Ссылка.УникальныйИдентификатор());
{ИмяТипаВИБИсточнике} в обработчике события «Перед выгрузкой» пропишем определение метаданных:
// Определяем строковый тип объекта источника
Значение = "СправочникСсылка." + Источник.Метаданные().Имя;
После сохранения правил и загрузки их в УТ 11, выгрузчик БСП, обрабатывая данные правила конвертации свойств, запишет эти параметры непосредственно в XML-узел выгружаемого объекта. База-приемник гарантированно считает их при загрузке.
Если ваш обмен не автоматизирован полностью (например, выполняется вручную администратором по мере необходимости), можно отказаться от использования встроенного в БСП механизма выгрузки в УТ 11.
Вместо этого воспользуемся стандартной внешней обработкой выгрузки V8Exchan83.epf (ее можно найти в каталоге установки шаблонов конфигурации «Конвертация данных»).
Давайте проанализируем преимущества этого способа:
V8Exchan83.epf использует классическое ядро выгрузки, аналогичное старым конфигурациям.ИмяТипаВИБИсточнике, КлючПоискаВИБИсточнике) всегда выгружаются в полном объеме.Важное ограничение: данный способ не подходит для регламентных автоматических обменов по расписанию, выполняющихся в фоновом режиме на сервере «1С:Предприятие».
---
Для того чтобы успешно завершить настройку обмена и избежать дальнейших сбоев в промышленной эксплуатации, рекомендуем выполнить следующие действия:
Синхронизировать по идентификатору. Это базовая настройка, влияющая на поведение выгрузчика.УТ 11 в файл. Откройте его любым текстовым редактором (например, Notepad++) и найдите узел выгруженного элемента справочника. Проверьте физическое наличие строк с атрибутами {КлючПоискаВИБИсточнике}.Применяя данные подходы, мы обеспечим стабильную и бесперебойную синхронизацию данных между разнородными информационными системами на платформе «1С:Предприятие».