Как в Конвертации данных 2.1 перенести значение из дополнительного реквизита в основной реквизит объекта

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Постановка задачи и анализ структуры данных

Рассмотрим классическую ситуацию: в справочнике Номенклатура источника есть дополнительный реквизит «Производитель» (хранится в ТЧ), а в базе-приемнике это полноценный реквизит объекта с типом СправочникСсылка.Производители. Нам необходимо при выгрузке «вытащить» значение из табличной части и передать его в правило конвертации свойства (ПКС) основного реквизита.

Для начала проанализируем, как хранятся дополнительные реквизиты. Обычно это табличная часть, где есть колонки Свойство (план видов характеристик) и Значение. Наша цель — найти строку с нужным свойством и передать его значение в приемник.

Настройка правила конвертации свойства (ПКС)

Разберем по шагам создание правила для реквизита Производитель внутри ПКО (Правила конвертации объектов) Номенклатура:

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

Реализация программного извлечения значения

Для получения значения дополнительного реквизита воспользуемся обработчиком «Перед выгрузкой» в созданном ПКС. Рассмотрим два способа реализации.

Способ 1: Использование механизмов БСП

Если конфигурация-источник построена на БСП, мы можем вызвать стандартную функцию общего модуля. Это наиболее элегантный метод, однако он требует, чтобы объект был записан в базе данных.


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

Обратите внимание: в первом параметре функции УправлениеСвойствами.ЗначениеСвойства крайне желательно передавать именно Источник.Ссылка. Использование просто переменной Источник (которая может содержать объект в памяти) часто приводит к ошибкам в запросах внутри БСП, особенно если объект еще не был зафиксирован в транзакции.

Способ 2: Прямой перебор табличной части (универсальный)

Если использование функций БСП вызывает ошибки или конфигурация сильно изменена, мы можем проанализировать табличную часть ДополнительныеРеквизиты напрямую. Этот способ надежнее, так как работает с данными объекта в памяти.


// В обработчике ПКС "Перед выгрузкой"
Для Каждого СтрокаДопРеквизитов Из Источник.ДополнительныеРеквизиты Цикл
    Если СтрокаДопРеквизитов.Свойство.Наименование = "Производитель" Тогда
        Значение = СтрокаДопРеквизитов.Значение;
        Прервать;
    КонецЕсли;
КонецЦикла;

Проанализируем этот код: мы итерируем строки, ищем совпадение по наименованию свойства и, как только находим, присваиваем результат переменной Значение. КД 2.1 автоматически подхватит это содержимое и отправит его на обработку правилу конвертации объекта, указанному в ПКС.

Настройка ПКО для ссылочного реквизита (Производители)

Часто возникает проблема: данные выгружаются, но в приемнике реквизит заполняется «первым попавшимся» элементом справочника или вовсе остается пустым. Выясним причину: это происходит из-за некорректной настройки поиска в ПКО, которое отвечает за создание/сопоставление Производителя.

Рассмотрим правильную настройку ПКО Производители:

  1. В ПКО Источник должен соответствовать типу данных, который мы передаем в переменную Значение (например, СправочникСсылка.ЗначенияСвойствОбъектов или просто Строка, если в доп. реквизитах хранится текст).
  2. В списке ПКС этого правила обязательно выберите реквизит (например, Наименование) и установите галочку «Поиск».
  3. Убедитесь, что в свойствах самого ПКО установлена настройка «Продолжить поиск по полям поиска, если поиск по идентификатору не удался».

Если в источнике дополнительный реквизит имеет тип «Дополнительное значение» (специальный справочник БСП), то при передаче его в ПКО справочника Производители, система возьмет его строковое представление (наименование) и попытается найти производителя с таким же именем в базе-приемнике.

Оптимизация выгрузки нескольких реквизитов

Если вам нужно перенести сразу 10-15 дополнительных реквизитов в разные основные поля объекта, постоянный перебор табличной части в каждом ПКС замедлит выгрузку. Рассмотрим способ оптимизации через ИсходящиеДанные.

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


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

Теперь в каждом ПКС (например, для производителя, цвета, веса) достаточно написать в обработчике «Перед выгрузкой» одну строку:


Значение = ВходящиеДанные.Производитель;

Таким образом, мы проходим по табличной части источника всего один раз, что значительно повышает производительность обмена при больших объемах данных.

Заключение

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

← На главную