Кейс: есть справочник “Контрагенты” с неподчиненным справочником “Контактные лица” в исходной базе (справочники независимы и никак не связаны). Необходимо осуществить перенос данного справочника вместе с контактными лицами в конфигурацию, где справочник “Контактные лица” является подчиненным справочнику “Контрагенты”. При этом в конечной базе есть еще и реквизит “ОсновноеКонтактноеЛицо”. Подобные ситуации могут происходить часто с типовыми конфигурациями, например в УТ и БП 3.0, где в одной базе подчинения нет, а в другой появляется подчинение.
Создаем ПКО для справочник “Контактные лица”:
Обратите внимание, что поле “Владелец” в Источнике отсутствует – по причине того, что в исходной базе данный справочник не имеет подчинения к справочнику “Контрагенты”.
Затем также добавляем ПКО для справочника “Контрагенты”:
Реквизиту “ОсновноеКонтактноеЛицо” в приемнике я сразу установил сопоставление с реквизитом “КонтактноеЛицо” в источнике (последняя строка Конвертации свойств).
Создаем правила выгрузки данных для справочника “Контрагенты”:
Для “Контактных лиц” правило выгрузки создавать не нужно, т.к. переносить мы будем только контрагентов, а с ними уже пойдут необходимые нам контактные лица – нет необходимости переносить справочник “Контактные лица” обособленно.
Получается следующая ситуация, что в источнике у Контрагента есть КонтактноеЛицо, где мы указываем, кто будет контактным лицом у этого контрагента, но связи никакой нету, т.к. справочники не подчинены друг другу. Однако, в приёмнике у контрагента есть Основное контактное лицо, которое мы можем выбрать из общего списка контактных лиц этого контрагента.
Вернемся в ПКО “КонтактныеЛица”. Обратите внимание, что в источнике есть пустое поле, которое сопоставлено полю “Владелец” в приёмнике. Пустое оно как раз потому, что в источнике никакого владельца нет. Им будет именно тот контрагент, которого мы будем переносить. Напомню, что обособленно мы не переносим справочник “Контактные лица”, а при переносе справочника “Контрагенты” он потянет за собой те контактные лица, которые указаны в реквизите “КонтактноеЛицо” в источнике.
Когда мы начнём выгружать контрагентов, конвертация дойдет до реквизита “КонтактноеЛицо”, и чтобы полностью сформировать данные, она провалится в ПКО “КонтактныеЛица”, прихватив с собой ссылку на этого контрагента, где эта ссылка и будет подставлена в поле источника напротив поля “Владелец” приёмника.
Добавим в обработчик “Перед выгрузкой” ПКО “Контрагенты” следующий код:
К сожалению, в окне обработки нельзя пользоваться автоподстановками и проверкой на синтаксис, поэтому если код обработчика получается объемным, то лучше создать внешнюю обработку в конфигурации КД 2.1 и отладить код обработки в ней, после чего перенести в окно обработчика. Подробнее про эти обработчики можно прочитать во встроенной справке по нажатию кнопки “Информация по обработчикам”:
Затем в ПКО “КонтактныеЛица” раскликаем поле “Владелец” и установим галочку “Использовать значение из входящих данных”:
При установленной галочке, ПКС обратится к переменной “ВходящиеДанные” по ключу “Владелец”.
Если мы прямо сейчас сохраним правила выгрузки и совершим выгрузку данных из источника в приемник, то столкнемся с проблемой, что контактное лицо, которое было указано как основное в базе источника для двух разных контрагентов, в базе-приемнике будет привязано только к одному из контрагентов, т.к. владелец может быть только один.
Отроем правило конвертации объекта “КонтактныеЛица” на вкладку “Настройки”:
Обращаем внимание на установленную по умолчанию галочку “Искать объект приемника по внутреннему идентификатору объекта источника”, означающий, что объект будет искаться по ссылке, а если найден по ссылке он не будет, то будет создан еще один объект.
Чтобы создать два разных объекта с разными ссылками, то нужно установить следующие параметры: отключить поиск по ссылке (в этом случае поиск будет производиться по полям поиска), и установить галочку напротив “Автоматически генерировать номер или код, если он не задан”:
Отключаем поле “Код” в окне конвертации свойств:
Собственно, после этих нехитрых манипуляций перенос справочника будет корректным. Если же у вас по-прежнему не работает распараллеливание контактного лица в базе-приёмнике, то установите еще одну галочку “Не запоминать выгруженные объекты” – это особенность работы конфигурации КД 2.1 для оптимизации скорости обработки данных.