Как перенести значение из подчиненного справочника 1С 7.7 в реквизит объекта 1С 8.3 (УТ 11) в Конвертации данных?

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

При переходе с конфигураций на платформе 1С 7.7 на современные решения 1С 8.3 (например, 1С:Управление торговлей 11) часто возникает задача переноса данных, структура которых различается между системами. Распространен случай, когда в 1С 7.7 наименование или свойство хранится в отдельном подчиненном справочнике (например, НоменклатураГос), а в 1С 8.3 его необходимо записать в реквизит номенклатуры (НаименованиеГос).

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

Разбор ошибки синтаксиса при выгрузке из 1С 7.7

Частая ошибка при переносе из 7.7 — применение обращений к свойствам в стиле платформы 1С 8.3. Если написать в обработчике ПКС СпрНГ.ИспользоватьВладельца(Источник.Ссылка);, платформа 7.7 выдаст ошибку:

Поле агрегатного объекта не обнаружено (Ссылка)

Выясним причину: в платформе 1С 7.7 у объектов справочников нет свойства Ссылка. Переменная Источник в контексте обработчиков КД для 7.7 уже сама по себе является объектом или ссылкой на выгружаемый элемент.

Настройка ПКС и обработчика «ПередВыгрузкой»

Разберем по шагам алгоритм настройки правила конвертации свойства:

  1. В правиле конвертации объектов (ПКО) для номенклатуры создаем новое ПКС.
  2. Поле Источник оставляем пустым, так как в шапке номенклатуры источника этого реквизита нет.
  3. В поле Приемник указываем целевой реквизит (НаименованиеГос).
  4. В событии ПередВыгрузкой данного ПКС добавляем алгоритм поиска подчиненного элемента.

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


Если Источник.ЭтоГруппа() = 0 Тогда
    СпрНГ = СоздатьОбъект("Справочник.НоменклатураГос");
    СпрНГ.ИспользоватьВладельца(Источник); 
    Если СпрНГ.ПолучитьЭлемент() = 1 Тогда 
        Значение = СпрНГ.Наименование; 
    Иначе
        Значение = "";
    КонецЕсли;
Иначе
    Отказ = 1;
КонецЕсли;

Проанализируем особенности работы этого кода:

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

Рекомендации по оптимизации и обработке краевых случаев

При выгрузке данных из 1С 7.7 стоит учитывать следующие технические нюансы:

  1. Помеченные на удаление элементы: Метод ПолучитьЭлемент() позиционируется в том числе и на удаленных элементах. Если их переносить не нужно, следует добавить условие Если (СпрНГ.ПолучитьЭлемент() = 1) И (СпрНГ.ПометкаУдаления() = 0) Тогда.
  2. Явная очистка переменной: Если подчиненный элемент не найден, всегда присваивайте переменной Значение пустую строку (""). Это предотвратит передачу предыдущего или неинициализированного значения при формировании XML.
  3. Повышение производительности: Поочередный вызов СоздатьОбъект и выборка элементов для каждой номенклатуры при большом объеме базы 7.7 снижает скорость выгрузки. Для ускорения процесса рекомендуются предварительная выборка данных в ТаблицуЗначений в событии ПередОбработкой и быстрый поиск по ней в памяти.
← На главную