Перенос данных из устаревших конфигураций на платформе 1С:Предприятие 7.7 в современные решения на платформе 1С:Предприятие 8.x — задача всегда актуальная и технически непростая. Особенно много вопросов возникает при переносе связанных справочников с изменением структуры данных. Типичный пример — перенос номенклатуры, штрихкодов и характеристик.
В этой статье мы подробно разберем, как правильно организовать выгрузку такой структуры с помощью конфигурации «Конвертация данных 2.1» (КД 2.1), проанализируем типичные ошибки разработчиков при работе со встроенным языком 1С 7.7 и рассмотрим два альтернативных подхода к решению задачи: классический (через написание кода в обработчиках) и оптимальный (декларативный, силами самой платформы КД).
Прежде чем перейти к реализации, проанализируем исходную структуру данных в 1С 7.7 и целевую структуру в 1С 8.x:
Номенклатура. Ему подчинен справочник Штрихкоды, в котором есть реквизит Размер (текстовое или ссылочное значение).Номенклатура есть подчиненный справочник ХарактеристикиНоменклатуры. Также существует независимый (или подчиненный номенклатуре) регистр сведений или справочник Штрихкоды, где каждая запись привязывается одновременно к Номенклатуре и к ее Характеристике. При этом характеристикой в базе 8.x должен стать тот самый Размер из базы 7.7.Наша цель — перенести данные так, чтобы при загрузке штрихкода в базе 8.x гарантированно создавались и сама номенклатура, и соответствующая ей характеристика, а штрихкод правильно ссылался на оба эти объекта.
---
При написании обработчиков выгрузки в Конвертации данных для версии 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С 7.7 и принудительно инициируем их выгрузку:
ШК = СоздатьОбъект("Справочник.Штрихкоды");
ШК.ИспользоватьВладельца(Источник); // Источник - это текущая Номенклатура
ШК.ВыбратьЭлементы();
Пока ШК.ПолучитьЭлемент() = 1 Цикл
// Создаем аналог структуры параметров для передачи в ПКО Штрихкода
ПараметрыШК = СоздатьОбъект("СписокЗначений");
ПараметрыШК.Установить("Владелец", Источник;
ПараметрыШК.Установить("Характеристика", ШК.Размер);
ПараметрыШК.Установить("Штрихкод", ШК.Наименование);
// Вызываем выгрузку по правилу конвертации "Штрихкоды"
ВыгрузитьПоПравилу(,, ПараметрыШК,, "Штрихкоды");
КонецЦикла;
Шаг 2. Настройка ПКО «Штрихкоды»
В правиле конвертации объектов (ПКО) «Штрихкоды» в обработчике ПередВыгрузкой мы перенаправляем полученные параметры далее по цепочке:
// ВходящиеДанные, переданные из ПВД, копируем в ИсходящиеДанные ПКО
ИсходящиеДанные = ВходящиеДанные;
В настройках ПКС (правил конвертации свойств) для этого ПКО:
Владелец ставим флаг «Получить из входящих данных».Штрихкод ставим флаг «Получить из входящих данных».Характеристика указываем правило конвертации объектов (ПКО) «ХарактеристикиНоменклатуры». В обработчике ПКС ПередВыгрузкой пишем код передачи контекста:
// Передаем номенклатуру-владельца и размер в ПКО Характеристики
ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
ИсходящиеДанные.Установить("Владелец", ВходящиеДанные.Получить("Владелец"));
ИсходящиеДанные.Установить("Наименование", ВходящиеДанные.Получить("Характеристика"));
Шаг 3. Настройка ПКО «ХарактеристикиНоменклатуры»
В ПКО «ХарактеристикиНоменклатуры» для свойств Владелец и Наименование устанавливаем флаги «Получить из входящих данных». Теперь при загрузке характеристики система автоматически свяжет ее с правильной номенклатурой и присвоит нужное имя.
---
Несмотря на то, что программный метод полностью рабочий, опытные специалисты по интеграции 1С стараются избегать ручного написания циклов выгрузки в ПВД. Конвертация данных — это самодостаточный декларативный инструмент. Если правильно настроить связи между ПКО, система сама выгрузит всю цепочку зависимостей по ссылкам!
Выясним, как сделать выгрузку максимально простой и надежной с помощью всего трех правил конвертации объектов (ПКО), без использования тяжелого программного кода в ПВД:
Шаг 1. Создаем три независимых ПКО:
Номенклатура (Источник: Справочник.Номенклатура $\rightarrow$ Приемник: Справочник.Номенклатура)ХарактеристикиНоменклатуры (Источник: Справочник.Размеры или Строка размера $\rightarrow$ Приемник: Справочник.ХарактеристикиНоменклатуры)Штрихкоды (Источник: Справочник.Штрихкоды $\rightarrow$ Приемник: РегистрСведений.Штрихкоды / Справочник.Штрихкоды)Шаг 2. Настраиваем ПКО «Штрихкоды»
Это ключевое правило. Поскольку в источнике (1С 7.7) штрихкод подчинен номенклатуре, он уже содержит ссылку на владельца. Нам не нужно собирать данные вручную. Настраиваем ПКС следующим образом:
Владелец (в базе 8): Источник — Владелец (ссылка на Номенклатуру в 7.7). Правило конвертации — Номенклатура.Штрихкод: Источник — Наименование (или соответствующий реквизит в 7.7).Характеристика: Источник — реквизит Размер. Правило конвертации — ХарактеристикиНоменклатуры.Для того чтобы ПКО характеристики знало, к какой номенклатуре она относится (ведь в 1С 8.x характеристика подчинена номенклатуре, а в 1С 7.7 размер — это просто реквизит штрихкода), передадим владельца через параметры ПКС. В обработчике ПКС Характеристика в событии ПередВыгрузкой пишем:
ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
ИсходящиеДанные.Установить("Владелец", Источник.Владелец);
Шаг 3. Настраиваем ПКО «ХарактеристикиНоменклатуры»
В этом правиле сопоставляем свойства:
Наименование: Источник — ТекущийЭлемент (или Наименование, если размер — это справочник в 7.7).Владелец (в 1С 8 это Номенклатура): Источник оставляем пустым. Устанавливаем флаг «Получить из входящих данных».Шаг 4. Создаем ПВД
В правилах выгрузки данных (ПВД) нам достаточно создать всего одно ПВД для справочника Штрихкоды.
Проанализируем, как это будет работать при выгрузке:
Номенклатура и выгрузит ее в файл обмена.ИсходящиеДанные.ВходящиеДанные, заполнит владельца характеристики в базе 8.x и создаст саму характеристику.Использование декларативного метода с выгрузкой по ссылкам — это наиболее изящное, надежное и быстрое решение для Конвертации данных 2.1. Оно избавляет вас от необходимости писать сложные циклы обхода коллекций в 1С 7.7, минимизирует вероятность ошибок нехватки оперативной памяти при выгрузке больших объемов данных и гарантирует ссылочную целостность объектов в целевой базе 1С 8.x.