Как перенести номенклатуру, характеристики и штрихкоды из 1С 7.7 в 1С 8 через Конвертацию данных?

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

Перенос данных из устаревших конфигураций на платформе 1С:Предприятие 7.7 в современные решения на платформе 1С:Предприятие 8.x — задача всегда актуальная и технически непростая. Особенно много вопросов возникает при переносе связанных справочников с изменением структуры данных. Типичный пример — перенос номенклатуры, штрихкодов и характеристик.

В этой статье мы подробно разберем, как правильно организовать выгрузку такой структуры с помощью конфигурации «Конвертация данных 2.1» (КД 2.1), проанализируем типичные ошибки разработчиков при работе со встроенным языком 1С 7.7 и рассмотрим два альтернативных подхода к решению задачи: классический (через написание кода в обработчиках) и оптимальный (декларативный, силами самой платформы КД).

Постановка технической задачи

Прежде чем перейти к реализации, проанализируем исходную структуру данных в 1С 7.7 и целевую структуру в 1С 8.x:

  1. В базе-источнике (1С 7.7) имеется справочник Номенклатура. Ему подчинен справочник Штрихкоды, в котором есть реквизит Размер (текстовое или ссылочное значение).
  2. В базе-приемнике (1С 8.x) структура иная. У справочника Номенклатура есть подчиненный справочник ХарактеристикиНоменклатуры. Также существует независимый (или подчиненный номенклатуре) регистр сведений или справочник Штрихкоды, где каждая запись привязывается одновременно к Номенклатуре и к ее Характеристике. При этом характеристикой в базе 8.x должен стать тот самый Размер из базы 7.7.

Наша цель — перенести данные так, чтобы при загрузке штрихкода в базе 8.x гарантированно создавались и сама номенклатура, и соответствующая ей характеристика, а штрихкод правильно ссылался на оба эти объекта.

---

Почему не работает обращение «через точку» в 1С 7.7? Разбор частых ошибок

При написании обработчиков выгрузки в Конвертации данных для версии 7.7 программисты часто пытаются использовать конструкции, привычные для платформы 1С 8.x. Это приводит к синтаксическим и логическим ошибкам. Рассмотрим наиболее популярные из них.

Ошибка №1. Использование точки для получения свойств структуры

В 1С 8.x для передачи параметров между правилами используется объект Структура, к свойствам которой можно обращаться напрямую: ВходящиеДанные.ИмяПараметра. Однако в платформе 1С 7.7 объекта Структура не существует! Вместо него Конвертация данных использует объект типа СписокЗначений.

Попытка написать код:


// Ошибка! СписокЗначений в 7.7 не поддерживает обращение через точку
ЗначениеВладельца = ВходящиеДанные.Владелец;

приведет к ошибке выполнения. В 1С 7.7 работать со СписокЗначений в качестве структуры параметров нужно исключительно через специальные методы:


// Правильная установка значения по ключу
ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
ИсходящиеДанные.Установить("Владелец", ТекущийВладелец);
ИсходящиеДанные.Установить("Наименование", СтрокаРазмера);

// Правильное получение значения по ключу
ЗначениеВладельца = ВходящиеДанные.Получить("Владелец");

Ошибка №2. Обращение к элементам списка значений по индексу

Пытаться получить параметры с помощью метода ПолучитьЗначение(Индекс) крайне не рекомендуется. Порядок добавления элементов в список значений внутри механизмов КД 2.1 может измениться. Использование индексов (например, 1 или 2) вместо строковых ключей делает код хрупким и приводит к тому, что в правила передаются совершенно не те данные, которые ожидал разработчик. Используйте метод Получить("ИмяПараметра").

Ошибка №3. Путаница между Входящими и Исходящими данными в обработчиках ПКС

Схема передачи параметров в КД 2.1 строго регламентирована. Чтобы передать параметры из текущего правила конвертации свойств (ПКС) в подчиненное правило конвертации объектов (ПКО), необходимо использовать именно переменную ИсходящиеДанные. Написание кода вида ВходящиеДанные = СоздатьОбъект("СписокЗначений") внутри ПКС «Перед выгрузкой» является ошибкой — подчиненное правило не увидит эти параметры.

---

Вариант решения №1. Программный метод (через обработчик в ПВД)

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

Рассмотрим по шагам, как настроить этот процесс:

Шаг 1. Настройка ПВД для Номенклатуры
В ПВД для номенклатуры в обработчике ПослеВыгрузки мы пишем код перебора подчиненного справочника штрихкодов из 1С 7.7 и принудительно инициируем их выгрузку:


ШК = СоздатьОбъект("Справочник.Штрихкоды");
ШК.ИспользоватьВладельца(Источник); // Источник - это текущая Номенклатура
ШК.ВыбратьЭлементы();

Пока ШК.ПолучитьЭлемент() = 1 Цикл
    // Создаем аналог структуры параметров для передачи в ПКО Штрихкода
    ПараметрыШК = СоздатьОбъект("СписокЗначений");
    ПараметрыШК.Установить("Владелец", Источник;
    ПараметрыШК.Установить("Характеристика", ШК.Размер);
    ПараметрыШК.Установить("Штрихкод", ШК.Наименование);
    
    // Вызываем выгрузку по правилу конвертации "Штрихкоды"
    ВыгрузитьПоПравилу(,, ПараметрыШК,, "Штрихкоды");
КонецЦикла;

Шаг 2. Настройка ПКО «Штрихкоды»
В правиле конвертации объектов (ПКО) «Штрихкоды» в обработчике ПередВыгрузкой мы перенаправляем полученные параметры далее по цепочке:


// ВходящиеДанные, переданные из ПВД, копируем в ИсходящиеДанные ПКО
ИсходящиеДанные = ВходящиеДанные;

В настройках ПКС (правил конвертации свойств) для этого ПКО:


// Передаем номенклатуру-владельца и размер в ПКО Характеристики
ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
ИсходящиеДанные.Установить("Владелец", ВходящиеДанные.Получить("Владелец"));
ИсходящиеДанные.Установить("Наименование", ВходящиеДанные.Получить("Характеристика"));

Шаг 3. Настройка ПКО «ХарактеристикиНоменклатуры»
В ПКО «ХарактеристикиНоменклатуры» для свойств Владелец и Наименование устанавливаем флаги «Получить из входящих данных». Теперь при загрузке характеристики система автоматически свяжет ее с правильной номенклатурой и присвоит нужное имя.

---

Вариант решения №2. Декларативный метод (Рекомендуемый)

Несмотря на то, что программный метод полностью рабочий, опытные специалисты по интеграции 1С стараются избегать ручного написания циклов выгрузки в ПВД. Конвертация данных — это самодостаточный декларативный инструмент. Если правильно настроить связи между ПКО, система сама выгрузит всю цепочку зависимостей по ссылкам!

Выясним, как сделать выгрузку максимально простой и надежной с помощью всего трех правил конвертации объектов (ПКО), без использования тяжелого программного кода в ПВД:

Шаг 1. Создаем три независимых ПКО:

  1. Номенклатура (Источник: Справочник.Номенклатура $\rightarrow$ Приемник: Справочник.Номенклатура)
  2. ХарактеристикиНоменклатуры (Источник: Справочник.Размеры или Строка размера $\rightarrow$ Приемник: Справочник.ХарактеристикиНоменклатуры)
  3. Штрихкоды (Источник: Справочник.Штрихкоды $\rightarrow$ Приемник: РегистрСведений.Штрихкоды / Справочник.Штрихкоды)

Шаг 2. Настраиваем ПКО «Штрихкоды»
Это ключевое правило. Поскольку в источнике (1С 7.7) штрихкод подчинен номенклатуре, он уже содержит ссылку на владельца. Нам не нужно собирать данные вручную. Настраиваем ПКС следующим образом:

Для того чтобы ПКО характеристики знало, к какой номенклатуре она относится (ведь в 1С 8.x характеристика подчинена номенклатуре, а в 1С 7.7 размер — это просто реквизит штрихкода), передадим владельца через параметры ПКС. В обработчике ПКС Характеристика в событии ПередВыгрузкой пишем:


ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
ИсходящиеДанные.Установить("Владелец", Источник.Владелец);

Шаг 3. Настраиваем ПКО «ХарактеристикиНоменклатуры»
В этом правиле сопоставляем свойства:

Шаг 4. Создаем ПВД
В правилах выгрузки данных (ПВД) нам достаточно создать всего одно ПВД для справочника Штрихкоды.

Проанализируем, как это будет работать при выгрузке:

  1. Платформа начнет выгружать штрихкод.
  2. Увидев ссылку на номенклатуру-владельца, КД автоматически вызовет правило Номенклатура и выгрузит ее в файл обмена.
  3. Далее КД перейдет к выгрузке характеристики. Она передаст ссылку на номенклатуру через ИсходящиеДанные.
  4. Правило характеристики примет этот параметр во ВходящиеДанные, заполнит владельца характеристики в базе 8.x и создаст саму характеристику.
  5. В итоге в базу-приемник запишутся все три объекта в правильной последовательности, а связи между ними гарантированно не нарушатся.

Резюме

Использование декларативного метода с выгрузкой по ссылкам — это наиболее изящное, надежное и быстрое решение для Конвертации данных 2.1. Оно избавляет вас от необходимости писать сложные циклы обхода коллекций в 1С 7.7, минимизирует вероятность ошибок нехватки оперативной памяти при выгрузке больших объемов данных и гарантирует ссылочную целостность объектов в целевой базе 1С 8.x.

← На главную