При перегрузке данных из 1С 7.7 в конфигурацию на платформе 1С 8.х (8.2 / 8.3) часто возникает ситуация, когда структура данных источника и приемника существенно отличается. Например, в источнике 7.7 у справочника есть числовой реквизит (код категории, тип ТС, числовой флаг), а в приемнике 8.х ему соответствует ссылочный реквизит, указывающий на другой справочник (например, предопределенные элементы или классификатор).
Рассмотрим подробнее доступные механизмы в конфигурации Конвертация данных 2.1, которые позволяют установить нужный элемент справочника-приемника в зависимости от числового значения из источника.
Если конфигурация-приемник реализована на платформе 1С 8.х и целевое значение является предопределенным элементом справочника, самым простым и лаконичным решением будет использование специальной служебной переменной Выражение в Правиле конвертации свойств (ПКС).
Разберем по шагам, как это настроить:
Если Источник.РеквизитЧисло = 1 Тогда
Выражение = "Справочники.Справочник2.ПредопределенныйЭлемент1";
ИначеЕсли Источник.РеквизитЧисло = 2 Тогда
Выражение = "Справочники.Справочник2.ПредопределенныйЭлемент2";
КонецЕсли;
Вычисление выражения происходит на стороне базы-приемника при загрузке с помощью системного метода Выполнить(). Обратите внимание: когда переменная Выражение задана в теле обработчика, стандартное вычисление и выгрузка текущего свойства из 7.7 прекращаются, а данные реквизита источника в XML-файл не записываются.
Выполнение логики подстановки на стороне базы-приемника считается наиболее устойчивым и надежным подходом. Если числовое значение из 7.7 также переносится в базу-приемник (или переносится во служебный реквизит объекта), то подстановку ссылочного значения можно выполнить в Правиле конвертации объектов (ПКО) в событии «После загрузки».
Проанализируем пример кода для базы-приемника:
Если Объект.ЧисловойРеквизит = 1 Тогда
Объект.РеквизитСправочник2 = Справочники.Справочник2.ПредопределенныйЭлемент1;
ИначеЕсли Объект.ЧисловойРеквизит = 2 Тогда
Объект.РеквизитСправочник2 = Справочники.Справочник2.ПредопределенныйЭлемент2;
КонецЕсли;
Этот способ гарантирует, что если структура предопределенных элементов или алгоритм поиска в 8.х изменятся, вам не придется пересобирать правила выгрузки на стороне 1С 7.7.
Если числовой реквизит источника не сохраняется в объекте-приемнике, но его значение требуется только для определения нужного элемента Справочник2, можно использовать механизм передачи параметров объекта.
Разберем по шагам работу с этим механизмом:
Параметры.Вставить("КодКатегории", Источник.ЧисловойРеквизит);
ПараметрыОбъекта и устанавливаем нужную ссылку:
КодКатегории = 0;
Если ПараметрыОбъекта.Свойство("КодКатегории", КодКатегории) Тогда
Если КодКатегории = 1 Тогда
Объект.РеквизитСправочник2 = Справочники.Справочник2.НайтиПоНаименованию("Категория 1");
ИначеЕсли КодКатегории = 2 Тогда
Объект.РеквизитСправочник2 = Справочники.Справочник2.НайтиПоКоду("000000002");
КонецЕсли;
КонецЕсли;
Выясним еще один вариант, когда требуется найти или создать элемент Справочник2 по ключам поиска (код или наименование), сгенерированным на этапе выгрузки из 7.7.
Для этого используется обработчик ПКС «Перед выгрузкой» и переключатель «Получить из входящих данных»:
Справочник1, в нем добавляем ПКС для реквизита РеквизитСправочник2. Указываем для этого ПКС отдельное правило ПКО (из 7.7 в Справочник2).Справочник2 у полей поиска (например, Наименование или Код) отмечаем флаг «Получить из входящих данных».РеквизитСправочник2 в событии «Перед выгрузкой» на стороне 7.7 формируем объект СписокЗначений:
ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
Если Источник.ЧисловойРеквизит = 1 Тогда
ИсходящиеДанные.ДобавитьЗначение("Грузовые ТС", "Наименование");
ИначеЕсли Источник.ЧисловойРеквизит = 2 Тогда
ИсходящиеДанные.ДобавитьЗначение("Легковые ТС", "Наименование");
КонецЕсли;
Значение = 1; // Указываем, что свойство заполнено
Важные нюансы при работе с ИсходящиеДанные в 1С 7.7:
ДобавитьЗначение() задает имя свойства. Имена ключей строкозависимы и должны в точности совпадать с наименованием свойств приемника.Значение непустое значение (например, Значение = 1;), чтобы платформа не считала свойство пропущенным и не выдавала ошибку выгрузки.