Как перенести связь номенклатуры и сертификатов из 1С 7.7 в регистр сведений 1С 8.3 с помощью Конвертации данных?

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

При переносе данных из конфигураций на платформе 1С 7.7 (например, «Торговля и Склад 7.7») в современные конфигурации 1С 8.3 («Управление торговлей 11», «Комплексная автоматизация 2», «ERP») часто возникает структурное несовпадение данных. В 1С 7.7 ссылка на сертификат хранится непосредственно в реквизите справочника Номенклатура, тогда как в 1С 8.3 сертификаты вынесены в отдельный справочник СертификатыНоменклатуры, а связь с позициями номенклатуры фиксируется в независимом регистре сведений ОбластиДействияСертификатовНоменклатуры.

Рассмотрим, почему создание записей регистра вручную через поиск по наименованию в обработчике ПослеЗагрузки является грубой ошибкой, и разберем правильные варианты реализации обмена с помощью правил конвертации («Конвертация данных 2.1»).

Почему не стоит создавать записи регистра в обработчике «ПослеЗагрузки»?

Проанализируем типичные проблемы при попытке связать объекты «в лоб» на стороне приемника:

  1. Ненадежность поиска по наименованию: наименования сертификатов в 7.7 могут повторяться, иметь опечатки или лишние пробелы. Поиск по строке часто приводит к привязке неверного элемента или созданию дубликатов.
  2. Проблема порядка загрузки: если номенклатура загружается раньше сертификата, поиск Справочники.СертификатыНоменклатуры.НайтиПоНаименованию() вернет пустую ссылку, и запись в регистр сведений просто не запишется.
  3. Замедление загрузки: создание менеджера записи (СоздатьМенеджерЗаписи()) и проверка каждой строки по отдельности вызывают постоянные блокировки таблиц и существенно снижают скорость загрузки больших массивов номенклатуры.

Один из ключевых принципов «Конвертации данных 2.1» гласит: все объекты базы-приемника должны формироваться на стороне базы-источника (при выгрузке). В итоговый XML-файл должны попадать сразу готовые XML-узлы номенклатуры, сертификатов и наборов записей регистра сведений.

Способ 1. Выгрузка записей регистра через событие «ПослеВыгрузки» номенклатуры (Рекомендуемый)

Разберем по шагам наиболее быстрый и надежный вариант. Мы настроим отдельное правило конвертации объектов (ПКО) для регистра сведений и будем программно вызывать его при выгрузке каждого элемента номенклатуры.

Так как в платформе 1С 7.7 отсутствует тип данных Структура, для передачи параметров во входящие данные используется объект СписокЗначений. Обработка выгрузки для 7.7 штатно разбирает строковые представления элементов списка как имена свойств.

  1. Создаем ПКО для справочника Сертификаты:

    Источник — Справочник.Сертификаты (7.7), Приемник — Справочник.СертификатыНоменклатуры (8.3). Настраиваем синхронизацию по полям поиска.

  2. Создаем ПКО для регистра сведений (например, ОбластиДействияСертификатов):

    Поле «Объект-источник» оставляем пустым, а в качестве приемника выбираем РегистрСведенийЗапись.ОбластиДействияСертификатовНоменклатуры.

    Внутри создаем ПКС для измерений регистра:

    1. Номенклатура — включаем флаг «Получить из входящих данных». Указываем ПКО для номенклатуры.
    2. СертификатНоменклатуры — включаем флаг «Получить из входящих данных». Указываем ПКО для сертификатов.
  3. В ПКО для справочника Номенклатура в обработчике ПослеВыгрузки пишем код:
    
    Если ПустоеЗначение(Источник.Сертификат) = 0 Тогда
        // Сначала выгружаем сам сертификат
        ВыгрузитьПоПравилу(Источник.Сертификат, , , , "Сертификаты");
        
        // Формируем входящие данные для записи регистра сведений
        ВходящиеДанные = СоздатьОбъект("СписокЗначений");
        ВходящиеДанные.Установить("Номенклатура", Источник.ТекущийЭлемент());
        ВходящиеДанные.Установить("СертификатНоменклатуры", Источник.Сертификат);
        
        // Выгружаем запись регистра сведений
        ВыгрузитьПоПравилу(, , ВходящиеДанные, , "ОбластиДействияСертификатов");
    КонецЕсли;
    

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

Способ 2. Выгрузка данных через отдельное ПВД с произвольным алгоритмом

Рассмотрим альтернативный вариант, который отлично подходит, если требуется выгрузить все связи одним пакетом, собрав их предварительно в базе-источнике.

Разберем порядок настройки:

  1. Создаем ПКО для регистра сведений с пустым источником и полями, получаемыми из входящих данных (аналогично первому способу).
  2. Создаем отдельное Правило выгрузки данных (ПВД) для регистра сведений.
  3. В свойствах ПВД выбираем способ выгрузки «Произвольный алгоритм».
  4. В обработчике ПередОбработкой собираем таблицу значений со всеми связями базы 7.7 и передаем её в предопределенную переменную ВыборкаДанных:
    
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("Номенклатура");
    ТЗ.НоваяКолонка("СертификатНоменклатуры");
    
    СпрНом = СоздатьОбъект("Справочник.Номенклатура");
    СпрНом.ВыбратьЭлементы();
    Пока СпрНом.ПолучитьЭлемент() = 1 Цикл
        Если СпрНом.ЭтоГруппа() = 0 Тогда
            Если ПустоеЗначение(СпрНом.Сертификат) = 0 Тогда
                ТЗ.НоваяСтрока();
                ТЗ.Номенклатура = СпрНом.ТекущийЭлемент();
                ТЗ.СертификатНоменклатуры = СпрНом.Сертификат;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    ВыборкаДанных = ТЗ;
    
  5. В ПВД указываем созданное ПКО регистра сведений. Обработка выгрузки автоматически обойдет каждую строку сформированной таблицы значений и выгрузит запись регистра.

Способ 3. Передача ссылки через коллекцию «ПараметрыОбъекта»

Если по каким-то причинам требуется обработать привязку именно в момент загрузки элемента номенклатуры в 1С 8.3, нельзя сохранять ссылку на сертификат во временные строковые реквизиты (например, в Описание или Комментарий). Для этого предназначен стандартный механизм параметров объекта.

Посмотрим на пример реализации:

  1. В 1С 7.7 в обработчике ПослеВыгрузки номенклатуры помещаем сертификат в коллекцию параметров:
    
    Если ПустоеЗначение(Источник.Сертификат) = 0 Тогда
        ПараметрыОбъекта.Установить("Сертификат", Источник.Сертификат);
    КонецЕсли;
    
  2. В 1С 8.3 в обработчике ПослеЗагрузки номенклатуры получаем готовый сертификат из переданных параметров:
    
    Если ПараметрыОбъекта <> Неопределено Тогда
        СертификатСсылка = Неопределено;
        Если ПараметрыОбъекта.Свойство("Сертификат", СертификатСсылка) И ЗначениеЗаполнено(СертификатСсылка) Тогда
            Менеджер = РегистрыСведений.ОбластиДействияСертификатовНоменклатуры.СоздатьМенеджерЗаписи();
            Менеджер.Номенклатура = Ссылка;
            Менеджер.СертификатНоменклатуры = СертификатСсылка;
            Менеджер.Записать(Истина);
        КонецЕсли;
    КонецЕсли;
    

    В данном случае в переменной СертификатСсылка уже будет находиться корректная ссылка базы 1С 8.3, так как КД автоматически конвертирует переданный в параметрах объект по его правилу.

Важные особенности регистра «ОбластиДействияСертификатовНоменклатуры» в 1С 8.3

Обратим внимание на типовую логику конфигураций УТ 11, КА 2 и ERP. В регистре ОбластиДействияСертификатовНоменклатуры реализована модульная область действия:

Одновременное принудительное заполнение обоих измерений нарушает типовые запросы проверки сертификатов в документах отгрузки 1С 8.3, поэтому заполняйте только те измерения, которые фактически соответствуют области действия.

← На главную