При переходе с типовой конфигурации «Торговля и Склад 7.7» (ТиС) на «Управление торговлей 11» (УТ 11) часто возникает задача трансформации структуры данных. В 7.7 контактные данные сотрудников контрагента (руководителя, менеджера, бухгалтера) нередко хранятся прямо в строковых реквизитах справочника Контрагенты (например, «ФИО руководителя», «Тел руководителя», «Почта руководителя»). В 1С:УТ 11 эти данные должны стать отдельными элементами справочника КонтактныеЛицаПартнеров, а их телефоны и адреса электронной почты — записями табличной части КонтактнаяИнформация.
Рассмотрим, как правильно реализовать такое расщепление одного элемента источника на несколько элементов приемника с заполнением их контактной информации с помощью программы «1С:Конвертация данных 2.1».
Разберем базовый механизм переноса. Из одного контрагента 7.7 требуется сформировать несколько независимых контактных лиц в 8.3. Для этого в обработчике «После выгрузки» основного ПКО справочника Контрагенты используется процедура ВыгрузитьПоПравилу().
Проанализируем пример кода в 7.7, где формируется список значений СЗ с реквизитами конкретного контактного лица и передается в выгрузку по отдельному правилу конвертации объектов (ПКО «Контакты» с пустым источником и приемником КонтактныеЛицаПартнеров):
СЗ = СоздатьОбъект("СписокЗначений");
// Проверяем заполнение руководителя
Если ПустоеЗначение(Источник.ФИОРуководителя) = 0 Тогда
СЗ.Установить("Наименование", Источник.ФИОРуководителя);
СЗ.Установить("ДолжностьПоВизитке", Источник.ДолжностьРуководителя);
СЗ.Установить("ДатаРождения", Источник.ДатаРуководителя);
СЗ.Установить("Телефон", Источник.Телефон1);
СЗ.Установить("Почта", Источник.ПочтаРуководителя);
СЗ.Установить("Владелец", Источник);
ВыгрузитьПоПравилу(СЗ, , , , "Контакты");
КонецЕсли;
// Проверяем заполнение руководителя продаж
Если ПустоеЗначение(Источник.ФИОРукПродаж) = 0 Тогда
СЗ.Очистить();
СЗ.Установить("Наименование", Источник.ФИОРукПродаж);
СЗ.Установить("ДолжностьПоВизитке", Источник.ДолжностьРукПродаж);
СЗ.Установить("ДатаРождения", Источник.ДатаРукПродаж);
СЗ.Установить("Телефон", Источник.Телефон2);
СЗ.Установить("Почта", Источник.ПочтаРукПродаж);
СЗ.Установить("Владелец", Источник);
ВыгрузитьПоПравилу(СЗ, , , , "Контакты");
КонецЕсли;
В целевом ПКО «Контакты» реквизиты объекта (например, Наименование, ДолжностьПоВизитке) заполняются в обработчиках «Перед выгрузкой» соответствующего ПКС путем получения значений из передаваемого объекта Источник (который в данном случае является списком значений):
Значение = Источник.Получить("ДолжностьПоВизитке");
Основная сложность заключается в заполнении контактной информации (телефонов и email). В конфигурациях на базе БСП (включая УТ 11) контактная информация хранится в табличной части КонтактнаяИнформация объекта.
Чтобы перенести эти данные, в ПКО «Контакты» необходимо настроить Правило конвертации группы свойств (ПКГС) для табличной части КонтактнаяИнформация. Заполнение данных выполняется в обработчике «Перед обработкой» этого ПКГС путем присвоения сформированной таблицы значений специальному параметру КоллекцияОбъектов.
Выясним, как сформировать структуру табличной части КонтактнаяИнформация для передачи в УТ 11:
КонтактнаяИнформация приемника (Вид, Тип, Представление, ЗначенияПолей, НомерТелефона, АдресЭП).КоллекцияОбъектов.Посмотрим на пример кода в обработчике «Перед обработкой» ПКГС КонтактнаяИнформация в ПКО «Контакты»:
// В качестве Источника передается СписокЗначений из процедуры ВыгрузитьПоПравилу
КоллекцияОбъектов = СоздатьОбъект("ТаблицаЗначений");
КоллекцияОбъектов.НоваяКолонка("Вид");
КоллекцияОбъектов.НоваяКолонка("Тип");
КоллекцияОбъектов.НоваяКолонка("Представление");
КоллекцияОбъектов.НоваяКолонка("ЗначенияПолей");
КоллекцияОбъектов.НоваяКолонка("НомерТелефона");
КоллекцияОбъектов.НоваяКолонка("АдресЭП");
// 1. Добавляем Телефон, если он запущен во входящих данных
ТелефонСтрокой = СокрЛП(Источник.Получить("Телефон"));
Если ПустаяСтрока(ТелефонСтрокой) = 0 Тогда
КоллекцияОбъектов.НоваяСтрока();
КоллекцияОбъектов.Вид = "ТелефонКонтактногоЛица"; // Имя вида КИ или ПКО для ВидаКИ
КоллекцияОбъектов.Тип = "Телефон";
КоллекцияОбъектов.Представление = ТелефонСтрокой;
КоллекцияОбъектов.НомерТелефона = ТелефонСтрокой;
// Формируем строковое значение полей для БСП
КоллекцияОбъектов.ЗначенияПолей = "НомерТелефона=" + ТелефонСтрокой + Симв(10);
КонецЕсли;
// 2. Добавляем Email
EmailСтрокой = СокрЛП(Источник.Получить("Почта"));
Если ПустаяСтрока(EmailСтрокой) = 0 Тогда
КоллекцияОбъектов.НоваяСтрока();
КоллекцияОбъектов.Вид = "EmailКонтактногоЛица";
КоллекцияОбъектов.Тип = "АдресЭлектроннойПочты";
КоллекцияОбъектов.Представление = EmailСтрокой;
КоллекцияОбъектов.АдресЭП = EmailСтрокой;
КоллекцияОбъектов.ЗначенияПолей = "E-mail=" + EmailСтрокой + Симв(10);
КонецЕсли;
Если аналогичная задача решается при выгрузке из источника на платформе 1С 8.3 (где КИ хранится в регистре сведений или ТЧ), запрос к данным и формирование строки ЗначенияПолей выглядит следующим образом:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КИ.Тип КАК Тип,
| КИ.Вид КАК Вид,
| КИ.Представление КАК Представление,
| КИ.Поле3 КАК НомерТелефона
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КИ
|ГДЕ
| КИ.Объект = &Объект";
Запрос.УстановитьПараметр("Объект", Источник);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
КоллекцияОбъектов = РезультатЗапроса.Выгрузить();
КоллекцияОбъектов.Колонки.Добавить("ЗначенияПолей", Новый ОписаниеТипов("Строка"));
Для Каждого СтрокаКоллекции Из КоллекцияОбъектов Цикл
Если СтрокаКоллекции.Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда
СтрокаКоллекции.ЗначенияПолей = "НомерТелефона=" + СтрокаКоллекции.НомерТелефона + Символы.ПС;
КонецЕсли;
КонецЦикла;
Иначе
Отказ = Истина;
КонецЕсли;
Рассмотренный выше подход формирует структуры данных на стороне источника (7.7). Однако в УТ 11 механизм контактной информации управляется подсипремой БСП и требует формата JSON в поле ЗначенияПолей для работы удобных диалогов ввода адресов и телефонов.
Чтобы упростить код выгрузки в 7.7, можно использовать следующий подход:
ВходящиеДанные или неиспользуемые доп. свойства.УправлениеКонтактнойИнформацией, чтобы программно заполнить табличную часть загруженного объекта КонтактныеЛицаПартнеров с корректным качеством записи JSON.Подведем итог: При делении одного элемента источника на несколько элементов приемника вызывать ВыгрузитьПоПравилу() с передачей параметров через СписокЗначений или Структуру является наиболее чистым архитектурным решением. Заполнение табличных частей при этом полностью локализуется в целевом ПКО через параметр КоллекцияОбъектов в ПКГС.