При переносе данных из 1С 7.7 в 1С 8.3, особенно если планируются регулярные обмены, возникает важная задача — обеспечить надежное сопоставление объектов. Стандартный поиск по коду или наименованию не всегда надежен и может приводить к созданию дублей. Идеальный способ — сопоставлять объекты по их уникальному внутреннему идентификатору из базы-источника (7.7).
Рассмотрим пошагово, как настроить правила в "Конвертации данных 2.1", чтобы выгрузить этот идентификатор, а затем использовать его для поиска и создания соответствий в базе-приемнике (8.3). Мы разберем два подхода: стандартный, с использованием обработчиков событий, и более хитрый "трюк" с подменой полей поиска.
Первым делом нам нужно получить стабильный и уникальный идентификатор для каждого объекта в базе 7.7. Для этого есть несколько проверенных способов:
ЗначениеВСтрокуВнутр(). Это самый простой и надежный штатный метод. Он преобразует любую ссылку на объект (элемент справочника, документ) в уникальную строку. Именно ее мы и будем использовать в качестве идентификатора.ЗначениеВДлиннуюСтрокуБД(). Если в вашей конфигурации 7.7 уже используется компонента 1С++, можно воспользоваться ее функцией. Она возвращает строку из 13 символов, также являющуюся внутренним представлением объекта.ЗначениеВСтрокуВнутр().Для нашей задачи мы остановимся на самом простом и универсальном варианте — функции ЗначениеВСтрокуВнутр().
Теперь нужно добавить полученный ID в файл выгрузки для каждого элемента справочника. Сделаем это через настройку Правил конвертации свойств (ПКС) в "Конвертации данных".
ID77 или ИдентификаторИсточника.Перед выгрузкой напишите следующий код:
// В качестве Источника выступает сам элемент справочника
// ТекущийЭлемент() использовать не обязательно, можно просто Источник
Значение = ЗначениеВСтрокуВнутр(Источник);
После этой настройки при выгрузке данных для каждого элемента справочника в XML-файле появится новый тег, например <ID77>...</ID77>, содержащий уникальный внутренний идентификатор из базы 7.7.
Это самый важный этап. Нам нужно научить "Конвертацию данных" при загрузке данных в 8.3 сначала искать объект по нашему ID77 и только если он не найден — создавать новый. Для хранения соответствий создадим в конфигурации 8.3 регистр сведений.
Подготовка в конфигурации 8.3:
Создайте регистр сведений, например, СоответствияИДОбмена, со следующей структурой:
Строка, неограниченной длины. Здесь будет храниться идентификатор из базы 7.7.Теперь рассмотрим два способа настройки правил загрузки.
Этот метод является наиболее правильным, прозрачным и легко отлаживаемым. Вся логика поиска и создания соответствий будет явно прописана в обработчиках событий ПКО.
Перед загрузкой для всего ПКО. Здесь мы будем искать объект в нашем регистре.
// ВходящиеДанные - это структура, содержащая все свойства объекта из XML-файла
// Проверяем, есть ли в выгрузке наш идентификатор
Если ВходящиеДанные.Свойство("ID77") Тогда
ИдентификаторИз77 = ВходящиеДанные.ID77;
// Выполняем запрос к регистру сведений для поиска соответствия
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СоответствияИДОбмена.Ссылка83
|ИЗ
| РегистрСведений.СоответствияИДОбмена КАК СоответствияИДОбмена
|ГДЕ
| СоответствияИДОбмена.ID77 = &ID77";
Запрос.УстановитьПараметр("ID77", ИдентификаторИз77);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
// Если объект найден, то не нужно создавать новый.
// Присваиваем ссылку на найденный объект и отказываемся от дальнейшей загрузки по этому правилу.
Ссылка = Результат.Ссылка83;
Отказ = Истина;
КонецЕсли;
КонецЕсли;
После загрузки для ПКО.
// Этот код сработает только для НОВЫХ, только что созданных объектов
// Проверяем, что ID из 7.7 у нас есть
Если ВходящиеДанные.Свойство("ID77") Тогда
// Создаем новую запись в регистре соответствий
НоваяЗапись = РегистрыСведений.СоответствияИДОбмена.СоздатьМенеджерЗаписи();
НоваяЗапись.ID77 = ВходящиеДанные.ID77;
НоваяЗапись.Ссылка83 = Объект.Ссылка; // Объект.Ссылка - это ссылка на только что созданный элемент
НоваяЗапись.Записать();
КонецЕсли;
Этот подход обеспечивает надежный и понятный механизм синхронизации. При первой загрузке все объекты будут созданы, и регистр соответствий заполнится. При всех последующих загрузках объекты будут находиться по ID77, а не создаваться заново.
Этот метод был предложен на форуме. Он менее очевиден, но также является рабочим. Его суть — "обмануть" механизм поиска "Конвертации данных", подсунув ему наш идентификатор вместо стандартного поля (например, Наименования), а затем переопределить саму логику поиска.
Перед выгрузкой для этого ПКС напишите код получения ID:
Значение = ЗначениеВСтрокуВнутр(Источник);
Таким образом, для поиска будет использоваться свойство "Наименование", в которое мы записали ID, а для заполнения реквизита — то же свойство, но уже с реальным наименованием.
ПоследовательностьПолейПоиска (название может немного отличаться в зависимости от версии КД и имени ПКО).
Например, если ваше ПКО называется "Контрагенты", то обработчик может называться ПКО_Контрагенты_ПоследовательностьПолейПоиска. В него нужно добавить следующий код:
// В СвойстваПоиска придет структура, где ключ - это имя поля поиска (Наименование),
// а значение - это наш ID из 7.7, который мы туда передали.
Если СвойстваПоиска.Свойство("Наименование") Тогда
ИдентификаторИз77 = СвойстваПоиска.Получить("Наименование");
// Выполняем поиск в нашем регистре
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СоответствияИДОбмена.Ссылка83
|ИЗ
| РегистрСведений.СоответствияИДОбмена КАК СоответствияИДОбмена
|ГДЕ
| СоответствияИДОбмена.ID77 = &ID77";
Запрос.УстановитьПараметр("ID77", ИдентификаторИз77);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
// Если нашли, подменяем поля поиска на поиск по уникальному идентификатору найденного объекта 8.3
// Это стандартный механизм КД для указания найденного объекта
УникальныйИдентификатор = Результат.Ссылка83.УникальныйИдентификатор();
СвойстваПоиска.Очистить();
СвойстваПоиска.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
Иначе
// Если не нашли, то объект будет создан как новый.
// Не забываем в обработчике "После загрузки" добавить запись в регистр, как в Методе 1.
КонецЕсли;
КонецЕсли;
Этот метод работает, но его логика менее очевидна для того, кто будет сопровождать эти правила в будущем. Он требует хорошего понимания внутреннего механизма работы "Конвертации данных".
Мы рассмотрели полный цикл настройки обмена данными из 1С 7.7 в 8.3 с использованием уникальных идентификаторов объектов. Первый метод, основанный на обработчиках Перед загрузкой и После загрузки, является предпочтительным благодаря своей прозрачности, надежности и простоте сопровождения. Он позволяет четко разделить логику поиска существующих объектов и создания записей о соответствии для новых. Второй метод является интересным техническим решением, но его стоит применять с осторожностью.