Как перенести строковый реквизит Директор из 1С 7.7 в справочник КонтактныеЛица в 1С 8 через Конвертацию данных

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

При переносе данных из конфигураций на платформе 1С:Предприятие 7.7 в 1С:Предприятие 8 часто возникает задача трансформации простых строковых реквизитов в полноценные ссылочные объекты. Типичный пример — реквизит Директор у контрагента в 1С 7.7, который хранится обычной строкой, тогда как в типовых конфигурациях 1С 8 руководитель контрагента представлен элементом справочника КонтактныеЛица, подчиненного контрагенту.

Разберем, как правильно настроить правила конвертации данных (КД 2.1), передать значение перечисления из базы-источника 7.7 и заполнить владельца контактного лица.

Установка значения перечисления в базе-источнике 7.7

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

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

В ПКС ВидКонтактногоЛица в обработчике Перед выгрузкой укажем:

Значение = "КонтактноеЛицоКонтрагента";

При загрузке платформа 1С 8 автоматически сопоставит переданную строку с именем предопределенного значения перечисления базы-приемника.

Передача реквизитов и владельца через ВходящиеДанные

Рассмотрим по шагам организацию переноса контактного лица с установкой ссылки на родительского контрагента в качестве владельца. Так как в платформе 1С 7.7 отсутствует тип Структура, для передачи параметров используется объект СписокЗначений.

  1. Настройка ПКО для контрагентов:

    В ПКО Контрагенты для свойства конвертации (ПКС) Директор -> Руководитель укажем правило конвертации КонтактноеЛицоДиректор. В обработчике события Перед выгрузкой этого ПКС сформируем пакет данных и предотвратим создание пустых ссылок:

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

    Создадим новое правило конвертации объектов (ПКО), в котором поле Источник оставим пустым, а в качестве Приемника укажем СправочникСсылка.КонтактныеЛица.

  3. Настройка ПКС справочника контактных лиц:

    В созданном ПКО настроим два ключевых свойства:

    1. Для ПКС Наименование установим флаг Получить из входящих данных.
    2. Для ПКС ОбъектВладелец также установим флаг Получить из входящих данных и обязательно укажем Правило конвертации — ПКО справочника Контрагенты.

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

    Значение = ВходящиеДанные.Получить("ОбъектВладелец");

Настройка полей поиска и предотвращение дублирования

Обратим особое внимание на настройку полей сопоставления в ПКО КонтактноеЛицоДиректор:

  1. Флаги Поиск необходимо установить одновременно для двух реквизитов: ОбъектВладелец и Наименование. Если выполнять поиск только по наименованию, контакты с одинаковыми ФИО у разных контрагентов некорректно объединятся в один элемент.
  2. Поскольку реквизит ОбъектВладелец в 1С 8 часто имеет составной тип (контрагенты, организации, физические лица), явное указание ПКО Контрагенты в правиле конвертации свойства обязательно для корректной типизации ссылки при загрузке.

Альтернативный вариант: выгрузка через процедуру ВыгрузитьПоПравилу

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


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

Такой вариант позволяет централизованно управлять созданием зависимых объектов в момент завершения выгрузки основного элемента.

← На главную