Как перенести контактную информацию из реквизитов 1С 7.7 в табличную часть 1С 8.3 через Конвертацию данных?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При настройке правил обмена в конфигурации Конвертация данных (КД 2) для переноса справочников из 1С:Предприятия 7.7 в современную платформу 1С:Предприятие 8.3 разработчики часто сталкиваются с несовпадением структур хранения данных. Классический пример — перенос данных из справочника Контрагенты (7.7), где контактная информация хранится в виде простых строковых реквизитов шапки, в справочник Партнеры (8.3), где контакты размещаются в табличной части КонтактнаяИнформация.

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

Причина ошибки: опечатка в имени переменной и конфликт настроек ПКГС

Проанализируем типовой код, который разработчик помещает в обработчик «Перед обработкой» в ПКГС:


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

В приведенном коде допущены сразу две ошибки, которые приводят к сбою выгрузки:

  1. Неверное имя служебной переменной. Механизм выгрузки КД ожидает, что созданная таблица значений или список значений будет передан в строго определенную предопределенную переменную КоллекцияОбъектов (во множественном числе). Переменная КоллекцияОбъект платформой просто игнорируется, из-за чего коллекция остается пустой или неопределенной.
  2. Ошибочно включенный флаг «Получить из входящих данных». Если этот признак установлен, алгоритм выгрузки ожидает готовую коллекцию из родительского ПКО (из структуры ИсходящиеДанные). Если же мы формируем таблицу значений прямо в обработчике «Перед обработкой» текущего ПКГС, данный флаг ставить нельзя, иначе стандартный обработчик пытается прочитать несуществующую структуру.

Шаг 1. Исправление кода обработчика «Перед обработкой» в ПКГС

Рассмотрим корректный вариант заполнения таблицы значений. Снимем флажок «Получить из входящих данных» в свойствах ПКГС и укажем правильное имя переменной КоллекцияОбъектов:


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

// Юридический адрес
Если ПустоеЗначение(Источник.ЮридическийАдрес) = 0 Тогда
    КоллекцияОбъектов.НоваяСтрока();
    КоллекцияОбъектов.Тип = "Адрес";
    КоллекцияОбъектов.Вид = "Юридический адрес";
    КоллекцияОбъектов.Представление = СокрЛП(Источник.ЮридическийАдрес);
КонецЕсли;

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

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

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

Шаг 2. Сопоставление реквизитов «Тип» и «Вид» контактной информации

Выгрузить строки в коллекцию — лишь половина дела. В современных типовых конфигурациях 1С 8.3 реквизиты табличной части КонтактнаяИнформация являются ссылочными:

  1. Реквизит «Тип»: имеет тип ПеречислениеСсылка.ТипыКонтактнойИнформации. Для него необходимо настроить сопоставление строковых значений из источника значениям перечисления приемника. Это можно сделать через отдельное ПКО с таблицей соответствия либо программно в ПККС реквизита «Тип» на стороне приемника в обработчике «При загрузке»:
    Значение = Перечисления.ТипыКонтактнойИнформации[Значение];
  2. Реквизит «Вид»: ссылается на справочник ВидыКонтактнойИнформации. Этот справочник иерархический, и элементы с одинаковыми наименованиями (например, «Почтовый адрес») могут дублироваться в папках «Справочник Партнеры», «Справочник Контактные лица» и других. Поиск только по наименованию часто сопоставляет строку с чужой группой. Поэтому для ПКО ВидыКонтактнойИнформации критически важно настраивать поиск с учетом родителя либо использовать поиск по предопределенному имени.

Альтернативный вариант: загрузка через БСП в обработчике «После загрузки»

В современных конфигурациях 8.3 контактная информация управляется механизмом Библиотеки стандартных подсистем (БСП). Для корректного хранения адресов требуются служебные поля (XML/JSON-десериализация полей адреса в реквизите ЗначенияПолей). Если заполнить только строковое представление, адрес может некорректно открываться в форме ввода.

Чтобы избежать проблем с внутренними форматами БСП, часто применяют более надежный подход: не переносить данные напрямую в табличную часть через ПКГС, а передать строки через параметры или входящие данные, после чего применить штатные методы подсистемы.

Разберем, как это реализовать:

  1. В ПКО Контрагенты_Партнеры в обработчике «При выгрузке» упакуем контактные данные в ИсходящиеДанные:
    
    ИсходящиеДанные = СоздатьОбъект("СписокЗначений");
    ИсходящиеДанные.ДобавитьЗначение(Источник.ЮридическийАдрес, "ЮрАдрес");
    ИсходящиеДанные.ДобавитьЗначение(Источник.Телефоны, "Телефон");
    ИсходящиеДанные.ДобавитьЗначение(Источник.ЭлПочта, "Email");
    
  2. В конфигурации-приемнике 8.3 в обработчике ПКО «После загрузки» запишем контактную информацию через процедуры БСП:
    
    Если Не ПустаяСтрока(ПараметрыОбъекта["ЮрАдрес"]) Тогда
        ВидКИ = Справочники.ВидыКонтактнойИнформации.ЮрАдресПартнера;
        УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(Объект, ПараметрыОбъекта["ЮрАдрес"], ВидКИ, Перечисления.ТипыКонтактнойИнформации.Адрес);
    КонецЕсли;
    

Такой подход гарантирует, что типовые механизмы БСП сформируют все системные структуры и нормализуют записи табличной части без ошибок целостности данных.

Как отлаживать выгрузку из 1С 7.7

Если в процессе выгрузки из 1С 7.7 возникают трудноуловимые ошибки в коде обработчиков, не обязательно гадать или использовать внешние промежуточные файлы. В стандартной обработке V77Exp.ert предусмотрен специальный режим отладки:

  1. В форме обработки выгрузки включаем режим формирования модуля отладки.
  2. Обработка генерирует внешний файл с программным кодом всех настроенных обработчиков КД.
  3. Открываем созданную обработку в конфигураторе 1С 7.7, расставляем стандартные точки останова (F9) и запускаем выгрузку под отладчиком, отслеживая состояние переменных и выполнение алгоритмов в пошаговом режиме.
← На главную