Как перенести контактную информацию при переносе данных из 1С:ТиС 7.7 в 1С:УТ 11 через Конвертацию данных 2.1?

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

При переходе с типовой конфигурации «Торговля и Склад 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. Создаем таблицу значений с колонками, соответствующими строению ТЧ КонтактнаяИнформация приемника (Вид, Тип, Представление, ЗначенияПолей, НомерТелефона, АдресЭП).
  2. Для каждого вида контактной информации (телефон, e-mail) добавляем строку в таблицу значений.
  3. Передаем сформированную таблицу в переменную КоллекцияОбъектов.

Посмотрим на пример кода в обработчике «Перед обработкой» ПКГС КонтактнаяИнформация в ПКО «Контакты»:


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

// 1. Добавляем Телефон, если он запущен во входящих данных
ТелефонСтрокой = СокрЛП(Источник.Получить("Телефон"));
Если ПустаяСтрока(ТелефонСтрокой) = 0 Тогда
    КоллекцияОбъектов.НоваяСтрока();
    КоллекцияОбъектов.Вид = "ТелефонКонтактногоЛица"; // Имя вида КИ или ПКО для ВидаКИ
    КоллекцияОбъектов.Тип = "Телефон";
    КоллекцияОбъектов.Представление = ТелефонСтрокой;
    КоллекцияОбъектов.НомерТелефона = ТелефонСтрокой;
    // Формируем строковое значение полей для БСП
    КоллекцияОбъектов.ЗначенияПолей = "НомерТелефона=" + ТелефонСтрокой + Симв(10);
КонецЕсли;

// 2. Добавляем Email
EmailСтрокой = СокрЛП(Источник.Получить("Почта"));
Если ПустаяСтрока(EmailСтрокой) = 0 Тогда
    КоллекцияОбъектов.НоваяСтрока();
    КоллекцияОбъектов.Вид = "EmailКонтактногоЛица";
    КоллекцияОбъектов.Тип = "АдресЭлектроннойПочты";
    КоллекцияОбъектов.Представление = EmailСтрокой;
    КоллекцияОбъектов.АдресЭП = EmailСтрокой;
    КоллекцияОбъектов.ЗначенияПолей = "E-mail=" + EmailСтрокой + Симв(10);
КонецЕсли;

Пример выгрузки контактной информации из 1С 8.х (если источник v8)

Если аналогичная задача решается при выгрузке из источника на платформе 1С 8.3 (где КИ хранится в регистре сведений или ТЧ), запрос к данным и формирование строки ЗначенияПолей выглядит следующим образом:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   КИ.Тип КАК Тип,
    |   КИ.Вид КАК Вид,
    |   КИ.Представление КАК Представление,
    |   КИ.Поле3 КАК НомерТелефона
    |ИЗ
    |   РегистрСведений.КонтактнаяИнформация КАК КИ
    |ГДЕ
    |   КИ.Объект = &Объект";

Запрос.УстановитьПараметр("Объект", Источник);
РезультатЗапроса = Запрос.Выполнить();

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

Альтернативный вариант: формирование КИ на стороне приемника (УТ 11)

Рассмотренный выше подход формирует структуры данных на стороне источника (7.7). Однако в УТ 11 механизм контактной информации управляется подсипремой БСП и требует формата JSON в поле ЗначенияПолей для работы удобных диалогов ввода адресов и телефонов.

Чтобы упростить код выгрузки в 7.7, можно использовать следующий подход:

  1. Передавать простые текстовые строки (номер телефона, адрес электронной почты) из 7.7 через ВходящиеДанные или неиспользуемые доп. свойства.
  2. В целевом ПКО «Контакты» в обработчике «После загрузки» на стороне УТ 11 вызывать стандартные процедуры общего модуля БСП УправлениеКонтактнойИнформацией, чтобы программно заполнить табличную часть загруженного объекта КонтактныеЛицаПартнеров с корректным качеством записи JSON.

Подведем итог: При делении одного элемента источника на несколько элементов приемника вызывать ВыгрузитьПоПравилу() с передачей параметров через СписокЗначений или Структуру является наиболее чистым архитектурным решением. Заполнение табличных частей при этом полностью локализуется в целевом ПКО через параметр КоллекцияОбъектов в ПКГС.

← На главную