При переходе со старых конфигураций (например, 1С:Торговля и Склад 7.7) на современные решения на базе БСП (1С:Розница 2.0, 1С:ERP, 1С:УТ 11) часто возникает задача: перенести данные из жестко заданных реквизитов источника в механизм дополнительных реквизитов и сведений приемника. Поскольку дополнительные реквизиты в современных системах хранятся в табличных частях, процесс настройки правил в Конвертации данных 2.1 требует особого подхода.
В этой статье мы подробно разберем, как реализовать такой перенос, учитывая ограничения платформы 7.7 и возможности платформы 8.3. Мы проанализируем ситуацию, когда данные нужно передать через входящие данные, и рассмотрим вариант с использованием параметров объекта и алгоритмов загрузки.
Когда источником выступает 1С 7.7, мы ограничены в использовании параметров объекта, которые привычны для восьмой платформы. В этом случае наиболее эффективным способом будет формирование структуры данных в обработчике Перед выгрузкой и передача её в табличную часть ДополнительныеРеквизиты объекта-приемника.
Рассмотрим по шагам, как настроить этот процесс в ПКО (Правило конвертации объекта):
ПКО номенклатуры (или другого объекта) перейдем к настройке правил конвертации групп свойств (ПКГС) для табличной части ДополнительныеРеквизиты.Перед выгрузкой этого ПКГС нам необходимо сформировать таблицу значений, которая будет содержать колонки, соответствующие реквизитам табличной части приемника (обычно это Свойство, Значение и ТекстоваяСтрока).Посмотрим на пример кода, который подготавливает данные для выгрузки:
// Проверяем наличие структуры ВходящиеДанные
Если ТипЗнч(ВходящиеДанные) <> Тип("Структура") Тогда
ВходящиеДанные = Новый Структура;
КонецЕсли;
// Создаем таблицу значений для дополнительных реквизитов
ДополнительныеРеквизиты = Новый ТаблицаЗначений;
ДополнительныеРеквизиты.Колонки.Добавить("Значение");
ДополнительныеРеквизиты.Колонки.Добавить("Свойство");
ДополнительныеРеквизиты.Колонки.Добавить("ТекстоваяСтрока");
// Добавляем строку для конкретного реквизита, например "Наименование1"
НоваяСтрока = ДополнительныеРеквизиты.Добавить();
НоваяСтрока.Значение = Источник.ПолеНаименования1;
НоваяСтрока.Свойство = "Наименование1"; // Это имя свойства в ПВХ приемника
НоваяСтрока.ТекстоваяСтрока = "";
// Помещаем таблицу во входящие данные
ВходящиеДанные.Вставить("ДополнительныеРеквизиты", ДополнительныеРеквизиты);
После этого в самом ПКГС для табличной части ДополнительныеРеквизиты нужно указать, что источником данных является эта таблица из ВходящиеДанные. Важно также настроить ПКО для плана видов характеристик ДополнительныеРеквизитыИСведения, чтобы поиск свойства осуществлялся, например, по наименованию.
Если обе конфигурации работают на платформе 8.3, мы можем применить более гибкий подход через ПараметрыОбъекта. Этот метод позволяет не перегружать структуру выгрузки лишними таблицами, а обрабатывать данные уже непосредственно в момент загрузки в базу-приемник.
Выясним причину популярности этого метода: он позволяет программно создавать недостающие свойства в ПланеВидовХарактеристик прямо во время загрузки, если они еще не заведены в целевой базе. Разберем по шагам реализацию этого метода:
Шаг 1: Настройка ПКС в ПКО документа или справочника
Создаем правило конвертации свойства (ПКС). В качестве источника выбираем нужный реквизит (например, НомерРеестра). Приемник оставляем пустым, но указываем имя параметра, например НомерРеестра. Это значение попадет в коллекцию ПараметрыОбъекта при загрузке. Для быстрого поиска и анализа созданных правил можно использовать портативный обозреватель правил конвертации свойств.
Шаг 2: Создание алгоритма загрузки
В конфигураторе Конвертации данных создадим алгоритм с именем ЗаполнитьДопРеквизит. Установим флаг Используется при загрузке. Проанализируем пример кода для этого алгоритма:
// Проверяем наличие переданного параметра
Если ПараметрыОбъекта <> Неопределено И ПараметрыОбъекта.Получить("кнт_Активная") <> Неопределено Тогда
НаименованиеСвойства = "кнт_Активная";
// Ищем свойство в ПВХ по внутреннему имени
Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", НаименованиеСвойства);
// Если свойство не найдено, создаем его программно
Если Свойство.Пустая() Тогда
НаименованиеНаборСвойств = "Справочник ""Номенклатура""";
НаборСвойствНоменклатура = Справочники.НаборыДополнительныхРеквизитовИСведений.НайтиПоНаименованию(НаименованиеНаборСвойств, Истина);
НаименованиеСвойстваИНабор = НаименованиеСвойства + " (" + НаименованиеНаборСвойств + ")";
СвойствоОбъект = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
СвойствоОбъект.Заголовок = НаименованиеСвойства;
СвойствоОбъект.Имя = СтрЗаменить(НаименованиеСвойства, " ", "");
СвойствоОбъект.ТипЗначения = Новый ОписаниеТипов("Булево"); // Указываем нужный тип
СвойствоОбъект.Записать();
Свойство = СвойствоОбъект.Ссылка;
КонецЕсли;
// Работаем с табличной частью загружаемого объекта
ПараметрыОтбора = Новый Структура("Свойство", Свойство);
НайденныеСтроки = Объект.ДополнительныеРеквизиты.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() > 0 Тогда
ТекущаяСтрока = НайденныеСтроки[0];
Иначе
ТекущаяСтрока = Объект.ДополнительныеРеквизиты.Добавить();
ТекущаяСтрока.Sвойство = Свойство;
КонецЕсли;
// Устанавливаем значение из параметров
ТекущаяСтрока.Значение = ПараметрыОбъекта.Получить(НаименованиеСвойства);
// Важно: если значение строковое и длинное, заполняем ТекстоваяСтрока
Если ТипЗнч(ТекущаяСтрока.Значение) = Тип("Строка") И СтрДлина(ТекущаяСтрока.Значение) > 1024 Тогда
ТекущаяСтрока.ТекстоваяСтрока = ТекущаяСтрока.Значение;
КонецЕсли;
// Записываем объект, чтобы изменения в ТЧ сохранились
Объект.Записать();
КонецЕсли;
Шаг 3: Вызов алгоритма
В ПКО целевого объекта (например, Номенклатура) в обработчике После загрузки пропишем вызов нашего алгоритма: Выполнить(Алгоритмы.ЗаполнитьДопРеквизит);. Это гарантирует, что после того как основной объект создан в базе, его табличная часть с доп. реквизитами будет корректно дополнена. Для удобного написания кода в обработчиках событий и навигации по объектам подойдёт модифицированная конфигурация Конвертации данных с подсказками.
Рассмотрим подробнее несколько критических моментов, которые часто упускают при настройке правил конвертации:
ДополнительныеРеквизитыИСведения. Чтобы реквизит появился в карточке объекта у пользователя, его нужно добавить в соответствующий набор в справочнике НаборыДополнительныхРеквизитовИСведений. В коде выше мы нашли набор по наименованию, но в идеале стоит привязывать его к метаданным объекта.ОписаниеТипов. Если вы переносите данные в уже существующее свойство типа "Дополнительное значение", то в ТекущаяСтрока.Значение нужно записывать не строку, а ссылку на элемент подчиненного справочника ЗначенияСвойствОбъектов.ТекстоваяСтрока в табличной части используется для хранения очень длинных строк (более 1024 символов) или для быстрого отображения представления значения. Если вы заполняете Значение, не забывайте проверять необходимость заполнения этого поля.Имя или по уникальному идентификатору (GUID), если это возможно.Проанализировав оба метода, можно сделать вывод: метод с ВходящимиДанными проще в визуальной настройке правил, но метод с Алгоритмами и Параметрами гораздо мощнее, так как позволяет автоматизировать создание метаданных в приемнике "на лету". Выбирайте подход исходя из сложности вашей задачи и версии платформы источника.