Как заполнить регистр «Соответствие объектов информационных баз» при переходе с БП 2.0 на БП 3.0

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

Переход с «Бухгалтерии предприятия 2.0» на версию 3.0 — это не просто обновление интерфейса, а глубокая смена архитектуры. Одной из серьезных проблем, с которой сталкиваются разработчики, является перенос настроек синхронизации данных. В старых версиях (БП 2.0) использовался регистр сведений СоответствиеОбъектовДляОбмена, в то время как современная БСП (Библиотека стандартных подсистем), на которой построена БП 3.0, использует регистр СоответствиеОбъектовИнформационныхБаз. Если после обновления эти данные не перенеслись автоматически, обмен данными может привести к дублированию объектов.

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

Причина возникновения проблемы

Разберем ситуацию: в старой базе (БП 2.0) активно велся обмен, и регистр СоответствиеОбъектовДляОбмена был заполнен тысячами записей. При переходе на БП 3.0 механизмы обмена меняются на технологию «Синхронизация данных». Новый регистр СоответствиеОбъектовИнформационныхБаз остается пустым, потому что структура хранения идентификаторов объектов в нем принципиально иная. Основная сложность заключается в том, что в старом регистре идентификаторы базы-корреспондента хранятся в так называемом «внутреннем представлении», которое визуально выглядит как нечитаемый набор символов (HEX-строка).

Способ 1: Использование штатной обработки «Конвертация обменов»

Прежде чем приступать к написанию собственного кода, проанализируем возможности стандартных инструментов. Фирма «1С» предусмотрела специальную обработку для решения этой задачи. Она обычно называется «Конвертация обменов с БП 2.0.epf» или КонвертацияОбменовДанными.epf.

Рассмотрим алгоритм действий при использовании этого инструмента:

  1. Найдем в составе дистрибутива обновления или в папке шаблонов БСП указанную обработку.
  2. Запустим её в базе БП 3.0.
  3. Обработка просканирует старые узлы планов обмена и записи в регистре СоответствиеОбъектовДляОбмена.
  4. Она автоматически преобразует старые записи в формат БСП и заполнит новый регистр СоответствиеОбъектовИнформационныхБаз.

Важный момент: Иногда эту обработку нужно запускать на стороне базы-корреспондента (например, в «Управлении торговлей»), если инициация конвертации обмена происходит оттуда. Это позволит корректно сопоставить объекты в обеих базах.

Способ 2: Расшифровка «древнешумерских писем» (HEX-GUID)

Если штатная обработка по каким-то причинам недоступна или не справляется, нам придется разбирать данные вручную. Посмотрим на поле СсылкаВДругойИБ в старом регистре. Оно содержит результат функции ЗначениеВСтрокуВнутр. Пример такой строки:

{"#", 38:abec001eec50dc9311df2504db2f37d6}

Проанализируем структуру этой строки:

Чтобы превратить этот «шумерский текст» в обычный УникальныйИдентификатор, который понимает БП 3.0, мы можем использовать встроенные функции старых обработок обмена или написать свой парсер. Разберем программный способ получения чистого GUID:


Функция ПолучитьUIDИзСтрокиВнутр(СтрокаВнутр)
    // Извлекаем только HEX-часть после двоеточия
    ПозицияДвоеточия = Найти(СтрокаВнутр, ":");
    Если ПозицияДвоеточия = 0 Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    HEX_UID = Сред(СтрокаВнутр, ПозицияДвоеточия + 1, 32);
    
    // Формируем стандартный вид GUID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
    // 1С хранит байты в специфическом порядке, поэтому нужно переставить блоки символов
    Часть1 = Сред(HEX_UID, 25, 8);
    Часть2 = Сред(HEX_UID, 21, 4);
    Часть3 = Сред(HEX_UID, 17, 4);
    Часть4 = Сред(HEX_UID, 1, 4);
    Часть5 = Сред(HEX_UID, 5, 12);
    
    РезультатСтрокой = Часть1 + "-" + Часть2 + "-" + Часть3 + "-" + Часть4 + "-" + Часть5;
    Возврат Новый УникальныйИдентификатор(РезультатСтрокой);
КонецФункции

Этот метод позволяет нам прочитать идентификатор без подключения к другой базе.

Способ 3: Прямой доступ через COM-соединение

Если нам нужно не просто перенести идентификаторы, а убедиться в существовании объектов, самым надежным способом будет использование COM-соединения. Проанализируем ситуацию: у нас есть ссылка в текущей базе и текстовое или внутреннее представление ссылки в другой базе. Мы можем подключиться к базе-корреспонденту и получить актуальный УникальныйИдентификатор напрямую.

Выясним, как реализовать такое подключение:


// Создаем соединение с внешней базой
Попытка
    ВнешняяБаза = Новый COMОбъект("V83.COMConnector");
Исключение
    Сообщить("Не удалось создать COM-объект!");
    Возврат;
КонецПопытки;

СтрокаСоединения = "File=""" + ПутьКБазе + """;Usr=""" + ИмяПользователя + """;Pwd=""" + Пароль + """;";

Попытка
    Соединение = ВнешняяБаза.Connect(СтрокаСоединения);
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Теперь, имея соединение, мы можем искать объекты по их представлению
// и получать их GUID для заполнения нового регистра

После установки соединения мы можем перебирать записи старого регистра, находить объекты в другой базе и записывать их UID в новый регистр СоответствиеОбъектовИнформационныхБаз.

Различия в заполнении нового регистра

При ручном заполнении СоответствиеОбъектовИнформационныхБаз важно учитывать требования БСП. В отличие от старого регистра, здесь появились новые измерения и ресурсы:

Рассмотрим пример создания записи в новом регистре:


Запись = РегистрыСведений.СоответствиеОбъектовИнформационныхБаз.СоздатьМенеджерЗаписи();
Запись.УзелИнформационнойБазы = СсылкаНаУзел;
Запись.СобственнаяСсылка = СсылкаНаОбъект;
Запись.УникальныйИдентификаторИсточника = Строка(СсылкаНаОбъект.УникальныйИдентификатор());
Запись.УникальныйИдентификаторПриемника = Строка(ПолученныйUIDПриемника);
Запись.ТипИсточника = "СправочникСсылка.Номенклатура";
Запись.ТипПриемника = "СправочникСсылка.Номенклатура";
Запись.Записать();

Особенности для обменов через формат EnterpriseData

В самых современных версиях БП 3.0 при использовании универсального формата обмена (EnterpriseData) данные могут храниться также в регистре «Публичные идентификаторы синхронизируемых объектов». Если ваша синхронизация настроена через этот формат, проверьте, не требуется ли заполнение этого регистра вместо (или вместе с) СоответствиеОбъектовИнформационныхБаз. Принцип хранения идентификаторов там схож, но ориентация идет на строковые ключи формата XML.

Заключение

Мы проанализировали проблему перехода со старой технологии обмена на новую. Подведем итоги: наиболее правильным и быстрым способом является использование штатной обработки конвертации обменов. Если же она не помогает, мы всегда можем прибегнуть к программному разбору HEX-строк или прямому получению данных через COM-соединение. Главное — помнить о смене структуры хранения и необходимости приведения типов объектов к строковому формату БСП.

← На главную