Как перенести данные из обычных реквизитов УТ 10.3 в дополнительные реквизиты УТ 11.5 при помощи КД 2.1?

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

Переход с классических конфигураций, таких как Управление торговлей 10.3, на современные решения вроде УТ 11.5 часто сопряжен с архитектурными сложностями — для этого есть решение для переноса справочников и документов из УТ 10.3 в УТ 11. Одной из самых частых задач является перенос данных, которые в старой базе хранились как жестко заданные реквизиты справочников, а в новой базе должны стать дополнительными реквизитами. В этой статье мы разберем, как правильно настроить правила конвертации данных (КД 2.1) для реализации этой задачи, используя типовые правила выгрузки данных из УТ 10.3 в УТ 11.5.

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

В конфигурациях на платформе 1С 8.2 (УТ 10.3) дополнительные сведения могли храниться либо в виде явных реквизитов справочника (например, ОсновнойВидДеятельности), либо в регистре сведений ЗначенияСвойствОбъектов. В современных конфигурациях на базе БСП (Библиотека стандартных подсистем), к которым относится УТ 11.5, механизм работы со свойствами изменился. Теперь они хранятся в табличной части ДополнительныеРеквизиты самого объекта (Контрагента, Номенклатуры и т.д.). Часто для упрощения процесса используется технический перенос основных справочников из УТ 10.3 в УТ 11.5, позволяющий сохранить базовую информацию перед глубокой кастомизацией — есть перенос справочников, остатков и документов при переходе на УТ 11.5.

Рассмотрим ситуацию: нам нужно перенести значение реквизита ВидДеятельности из карточки контрагента в УТ 10.3 в одноименный дополнительный реквизит в УТ 11.5.

Способ 1: Использование коллекции объектов в КД 2.1

Этот метод считается классическим для Конвертации данных 2.1. Поскольку в источнике (УТ 10.3) у нас нет табличной части ДополнительныеРеквизиты, нам нужно создать ее виртуально в процессе выгрузки. Проанализируем шаги реализации.

Шаг 1. Создание группы ПКС

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

Шаг 2. Формирование виртуальной таблицы в обработчике «Перед выгрузкой»

В обработчике ПередВыгрузкой созданной группы ПКС нам необходимо инициализировать переменную КоллекцияОбъектов. Это должна быть таблица значений, структура которой повторяет структуру ТЧ ДополнительныеРеквизиты в приемнике. Разберем пример кода:


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

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

// Передаем таблицу в механизм КД
КоллекцияОбъектов = ТаблицаДопРеквизитов;

Шаг 3. Настройка подчиненных ПКС

Внутри группы ПКС создадим два правила для реквизитов Свойство и Значение. Для ПКС Свойство в обработчике ПередВыгрузкой укажем логику поиска нужного элемента ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения в приемнике.

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


Если ТипЗнч(ОбъектКоллекции.Значение) = Тип("СправочникСсылка.ВидыДеятельности") Тогда
    ИмяПКО = "ВидыДеятельности";
ИначеЕсли ТипЗнч(ОбъектКоллекции.Значение) = Тип("Строка") Тогда
    ИмяПКО = ""; // Для примитивных типов ПКО не нужно
КонецЕсли;

Способ 2: Перенос через параметры и использование методов БСП

Рассмотрим более современный подход, который минимизирует риск нарушения целостности кэша дополнительных реквизитов в УТ 11.5. Мы можем передать данные через ПараметрыОбъекта и программно записать их при загрузке. Это особенно удобно для реализации кастомных сценариев переноса данных из старой УТ 10.3 в новые архитектуры.

Настройка выгрузки:

  1. В ПКО контрагента на закладке «Параметры» добавим параметр ДопРеквизит_ВидДеятельности.
  2. В обработчике ПередВыгрузкой ПКО запишем: Параметры.Вставить("ДопРеквизит_ВидДеятельности", Источник.ОсновнойВидДеятельности);

Настройка загрузки (в приемнике):

В обработчике ПослеЗагрузки ПКО нам нужно найти ссылку на дополнительный реквизит и записать значение. Проанализируем ситуацию: в УТ 11.5 для работы со свойствами рекомендуется использовать программный интерфейс БСП.


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

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

Важные технические нюансы

1. Привязка к Наборам свойств

В УТ 11.5 недостаточно просто заполнить табличную часть. Важно, чтобы переносимое свойство было включено в соответствующий НаборДополнительныхРеквизитовИСведений (например, «Справочник "Контрагенты"»). Например, при работе со справочником контрагентов стоит помнить, что структура папок покупателей из УТ 10.3 может быть перенесена в Бизнес-регионы, что также потребует корректной настройки наборов свойств.

2. Особенности поиска свойств

Поиск по наименованию (НайтиПоНаименованию) в обработчиках — это «плохой тон», так как пользователь может изменить имя реквизита. Рассмотрим более надежный способ — использование GUID. Выясним уникальный идентификатор созданного свойства в УТ 11.5 и используем его:

СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолучитьСсылку(Новый УникальныйИдентификатор("ваш-guid-свойства"));

3. Типы данных «Дополнительное значение»

Если в УТ 11.5 ваш дополнительный реквизит имеет тип «Дополнительное значение», это означает, что значениями являются элементы специального подчиненного справочника ЗначенияСвойствОбъектов. Если ваша задача включает не только реквизиты, но и полную выгрузку остатков и документов с учетом характеристик и серий, то правильная типизация доп. реквизитов станет критически важной для корректного отображения данных в отчетах.

Резюме

Мы рассмотрели два основных подхода к переносу дополнительных реквизитов. Первый способ (через КоллекцияОбъектов) более универсален для КД 2.1 и позволяет переносить сразу множество свойств одной таблицей. Второй способ (через ПослеЗагрузки) дает больше контроля и позволяет использовать встроенные механизмы конфигурации-приемника. В сложных случаях, когда требуется, например, выгрузка остатков и цен номенклатуры из УТ 10.3 в УТ 11.5 через COM (поможет обработка выгрузки остатков и цен из УТ 10.3 в УТ 11.5 через COM), данные методы могут комбинироваться для достижения максимальной точности переноса.

← На главную