Как перенести данные из 1С 7.7 в 8.3 по внутреннему ID объекта с помощью "Конвертации данных 2.1"?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При переносе данных из 1С 7.7 в 1С 8.3, особенно если планируются регулярные обмены, возникает важная задача — обеспечить надежное сопоставление объектов. Стандартный поиск по коду или наименованию не всегда надежен и может приводить к созданию дублей. Идеальный способ — сопоставлять объекты по их уникальному внутреннему идентификатору из базы-источника (7.7).

Рассмотрим пошагово, как настроить правила в "Конвертации данных 2.1", чтобы выгрузить этот идентификатор, а затем использовать его для поиска и создания соответствий в базе-приемнике (8.3). Мы разберем два подхода: стандартный, с использованием обработчиков событий, и более хитрый "трюк" с подменой полей поиска.

Шаг 1. Получение уникального идентификатора в 1С 7.7

Первым делом нам нужно получить стабильный и уникальный идентификатор для каждого объекта в базе 7.7. Для этого есть несколько проверенных способов:

  1. Стандартная функция ЗначениеВСтрокуВнутр(). Это самый простой и надежный штатный метод. Он преобразует любую ссылку на объект (элемент справочника, документ) в уникальную строку. Именно ее мы и будем использовать в качестве идентификатора.
  2. Компонента 1С++ и функция ЗначениеВДлиннуюСтрокуБД(). Если в вашей конфигурации 7.7 уже используется компонента 1С++, можно воспользоваться ее функцией. Она возвращает строку из 13 символов, также являющуюся внутренним представлением объекта.
  3. "Псевдо-GUID". Можно самостоятельно сформировать уникальную строку, объединив информацию о типе метаданных, виде объекта и его внутреннем ID. По сути, это будет структурированное представление того же идентификатора, который возвращает ЗначениеВСтрокуВнутр().

Для нашей задачи мы остановимся на самом простом и универсальном варианте — функции ЗначениеВСтрокуВнутр().

Шаг 2. Выгрузка идентификатора из 7.7 в XML-файл

Теперь нужно добавить полученный ID в файл выгрузки для каждого элемента справочника. Сделаем это через настройку Правил конвертации свойств (ПКС) в "Конвертации данных".

  1. Откройте ваше правило конвертации объекта (ПКО), например, для справочника "Контрагенты".
  2. Перейдите на вкладку "Конвертация свойств".
  3. Создайте новое правило конвертации свойства (ПКС).
  4. В качестве "Приемника" укажите понятное имя, под которым этот идентификатор будет виден в XML-файле. Например, ID77 или ИдентификаторИсточника.
  5. Поле "Источник" оставьте пустым, так как мы будем получать значение программно.
  6. В строке созданного ПКС нажмите на кнопку с лупой в колонке "Перед выгрузкой", чтобы открыть окно редактирования кода.
  7. В обработчике события Перед выгрузкой напишите следующий код:

// В качестве Источника выступает сам элемент справочника
// ТекущийЭлемент() использовать не обязательно, можно просто Источник
Значение = ЗначениеВСтрокуВнутр(Источник);

После этой настройки при выгрузке данных для каждого элемента справочника в XML-файле появится новый тег, например <ID77>...</ID77>, содержащий уникальный внутренний идентификатор из базы 7.7.

Шаг 3. Настройка поиска по идентификатору в 1С 8.3

Это самый важный этап. Нам нужно научить "Конвертацию данных" при загрузке данных в 8.3 сначала искать объект по нашему ID77 и только если он не найден — создавать новый. Для хранения соответствий создадим в конфигурации 8.3 регистр сведений.

Подготовка в конфигурации 8.3:

Создайте регистр сведений, например, СоответствияИДОбмена, со следующей структурой:

Теперь рассмотрим два способа настройки правил загрузки.

Метод 1: Стандартный подход через обработчики "Перед загрузкой" и "После загрузки" (Рекомендуемый)

Этот метод является наиболее правильным, прозрачным и легко отлаживаемым. Вся логика поиска и создания соответствий будет явно прописана в обработчиках событий ПКО.

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

Этот подход обеспечивает надежный и понятный механизм синхронизации. При первой загрузке все объекты будут созданы, и регистр соответствий заполнится. При всех последующих загрузках объекты будут находиться по ID77, а не создаваться заново.

Метод 2: "Трюк" с переопределением полей поиска

Этот метод был предложен на форуме. Он менее очевиден, но также является рабочим. Его суть — "обмануть" механизм поиска "Конвертации данных", подсунув ему наш идентификатор вместо стандартного поля (например, Наименования), а затем переопределить саму логику поиска.

  1. Настройка ПКС в "Конвертации данных".
    • Создайте ПКС для свойства "Наименование", которое будет отвечать за реальную передачу наименования. Флажок "Поиск по полю" для него не ставьте.
    • Создайте второе ПКС. В качестве "Приемника" также укажите "Наименование", но для этого правила установите флажок "Поиск по полю". В обработчике Перед выгрузкой для этого ПКС напишите код получения ID:
    
    Значение = ЗначениеВСтрокуВнутр(Источник);
    

    Таким образом, для поиска будет использоваться свойство "Наименование", в которое мы записали ID, а для заполнения реквизита — то же свойство, но уже с реальным наименованием.

  2. Переопределение поиска в 8.3. Теперь нужно перехватить значение, переданное для поиска, и выполнить правильный поиск. Для этого используется обработчик ПоследовательностьПолейПоиска (название может немного отличаться в зависимости от версии КД и имени ПКО).

    Например, если ваше ПКО называется "Контрагенты", то обработчик может называться ПКО_Контрагенты_ПоследовательностьПолейПоиска. В него нужно добавить следующий код:

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

Этот метод работает, но его логика менее очевидна для того, кто будет сопровождать эти правила в будущем. Он требует хорошего понимания внутреннего механизма работы "Конвертации данных".

Заключение

Мы рассмотрели полный цикл настройки обмена данными из 1С 7.7 в 8.3 с использованием уникальных идентификаторов объектов. Первый метод, основанный на обработчиках Перед загрузкой и После загрузки, является предпочтительным благодаря своей прозрачности, надежности и простоте сопровождения. Он позволяет четко разделить логику поиска существующих объектов и создания записей о соответствии для новых. Второй метод является интересным техническим решением, но его стоит применять с осторожностью.

← На главную