При объединении информационных баз, например, при слиянии двух компаний, часто возникает задача консолидации данных. Типичный сценарий — перенос всех сотрудников и их учетных данных из одной организации в другую. При этом необходимо, чтобы во всех переносимых документах, справочниках и движениях регистров "старая" организация была корректно заменена на "новую" в базе-приемнике. Рассмотрим, как решить эту задачу с помощью инструмента "Конвертация данных 2.0" наиболее эффективным способом.
Проанализируем исходную ситуацию. Стоит задача объединить две базы "1С:ЗУП 3.1". Все данные одной организации (назовем ее "Организация-Источник") должны быть перенесены в базу данных другой организации ("Организация-Приемник") и "влиться" в нее. То есть, во всех загруженных объектах ссылка на "Организацию-Источник" должна превратиться в ссылку на "Организацию-Приемник".
Первая идея, которая может прийти в голову — это обработать данные после загрузки. Например, для документа "Перенос данных", который содержит движения по множеству регистров, можно попытаться в обработчике события После загрузки перебрать все наборы записей и заменить в них организацию. Посмотрим на пример такого кода:
// Пример нерабочего универсального кода
Для каждого Запись Из ТекущийНабор Цикл
НоваяЗапись = НаборЗаписей.Вставить(ТекущийНабор.Индекс(Запись));
ЗаполнитьЗначенияСвойств(НоваяЗапись, Запись);
// Попытка универсальной проверки наличия измерения "Организация"
Если Метаданные.Менеджер[МетаданныеНабора.Имя].Измерения.Найти("Организация") <> Неопределено Тогда
НоваяЗапись.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "ИНН_Новой_Организации");
КонецЕсли;
КонецЦикла;
Такой подход имеет несколько серьезных недостатков:
Метаданные.Менеджер[...] может не сработать в некоторых контекстах, а проверка наличия измерения не гарантирует его корректное заполнение.Такой код может сработать, если жестко прописать имя регистра, но это превращает правила конвертации в набор "костылей".
// Пример рабочего, но негибкого кода
Если МетаданныеНабора.Имя = "РеестрКадровыхПриказов" Тогда
НоваяЗапись.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН","**********");
КонецЕсли;
Этот путь ведет в тупик. Рассмотрим правильный и системный подход.
Ключ к решению проблемы лежит не в обработке каждого документа или регистра, а в настройке единого правила для самого объекта Организация. "Конвертация данных" при загрузке любого объекта (документа, записи регистра) встречает ссылку на организацию и обращается к ее собственному ПКО, чтобы понять, что с этой ссылкой делать. Наша задача — настроить это ПКО так, чтобы оно автоматически находило нужную нам организацию в базе-приемнике.
Разберем по шагам, как это сделать.
Организации.
Почему это важно? По умолчанию "Конвертация данных" ищет объект в базе-приемнике по его внутреннему уникальному идентификатору (GUID). Так как базы разные, GUID "Организации-Источника" в базе-приемнике, конечно же, не будет найден. Этот флажок заставляет систему после неудачного поиска по GUID запустить вторую попытку — поиск по тем полям, которые мы указали на предыдущем шаге (по ИНН).
// ПКС для свойства "ИНН" в ПКО "Организации", обработчик "Перед выгрузкой"
// ИНН организации, которую мы хотим заменить
ИНН_Старой_Организации = "1234567890";
// ИНН организации, НА которую мы хотим заменить
ИНН_Новой_Организации = "9876543210";
// Проверяем, является ли выгружаемый объект нашей старой организацией
// Можно проверять по ИНН, Наименованию или ссылке, если она известна
Если Источник.ИНН = ИНН_Старой_Организации Тогда
// Если да, то подменяем выгружаемое значение ИНН
Значение = ИНН_Новой_Организации;
КонецЕсли;
Теперь, когда система будет выгружать "Организацию-Источник", она выгрузит ее со всеми реквизитами, но ИНН у нее будет от "Организации-Приемника".
Как это работает в итоге?
При загрузке любого документа в базу-приемник, система видит ссылку на "Организацию-Источник". Она пытается найти ее по GUID, не находит. Затем, благодаря нашей настройке, она начинает искать по ИНН. Так как мы подменили ИНН при выгрузке, система успешно находит "Организацию-Приемник" по ее реальному ИНН и подставляет ссылку на нее во все поля документов и регистров. Задача решена элегантно и централизованно.
Чтобы не "зашивать" ИНН прямо в код правил, можно использовать параметры. Это делает правила более универсальными.
ИНН_Источник и ИНН_Приемник.
Если Источник.ИНН = Параметры.ИНН_Источник Тогда
Значение = Параметры.ИНН_Приемник;
КонецЕсли;
Более простой, но "ручной" способ, упомянутый на форуме. Он заключается в том, чтобы перед выгрузкой данных из базы-источника временно изменить в ней ИНН у "Организации-Источника" на ИНН "Организации-Приемника". Или же создать в базе-источнике фиктивную организацию с нужными реквизитами. Этот метод работает, но он менее технологичен и неудобен при регулярных обменах.
В заключение, всегда старайтесь использовать встроенные механизмы "Конвертации данных". Правильная настройка полей поиска в ПКО — это мощный инструмент, который позволяет решать задачи по сопоставлению и замене ссылочных объектов без написания лишнего кода и сложных обработчиков событий.