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