Как при конвертации данных заменить одну организацию на другую во всех документах и регистрах?

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

При объединении информационных баз, например, при слиянии двух компаний, часто возникает задача консолидации данных. Типичный сценарий — перенос всех сотрудников и их учетных данных из одной организации в другую. При этом необходимо, чтобы во всех переносимых документах, справочниках и движениях регистров "старая" организация была корректно заменена на "новую" в базе-приемнике. Рассмотрим, как решить эту задачу с помощью инструмента "Конвертация данных 2.0" наиболее эффективным способом.

Анализ проблемы и неоптимальный подход

Проанализируем исходную ситуацию. Стоит задача объединить две базы "1С:ЗУП 3.1". Все данные одной организации (назовем ее "Организация-Источник") должны быть перенесены в базу данных другой организации ("Организация-Приемник") и "влиться" в нее. То есть, во всех загруженных объектах ссылка на "Организацию-Источник" должна превратиться в ссылку на "Организацию-Приемник".

Первая идея, которая может прийти в голову — это обработать данные после загрузки. Например, для документа "Перенос данных", который содержит движения по множеству регистров, можно попытаться в обработчике события После загрузки перебрать все наборы записей и заменить в них организацию. Посмотрим на пример такого кода:


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

Такой подход имеет несколько серьезных недостатков:

  1. Ненадежность. Конструкция Метаданные.Менеджер[...] может не сработать в некоторых контекстах, а проверка наличия измерения не гарантирует его корректное заполнение.
  2. Избыточность. Придется писать подобный код для каждого объекта-регистратора или даже для каждого регистра, что трудоемко и сложно в поддержке. Если в будущем появится новый регистр с измерением "Организация", о нем можно легко забыть.
  3. Нарушение идеологии. Инструмент "Конвертация данных" имеет мощный встроенный механизм для работы со ссылочными типами, и ручная обработка ссылок после загрузки — это попытка сделать за него его же работу.

Такой код может сработать, если жестко прописать имя регистра, но это превращает правила конвертации в набор "костылей".


// Пример рабочего, но негибкого кода
Если МетаданныеНабора.Имя = "РеестрКадровыхПриказов" Тогда
    НоваяЗапись.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН","**********");
КонецЕсли;

Этот путь ведет в тупик. Рассмотрим правильный и системный подход.

Решение: Настройка Правила Конвертации Объектов (ПКО) для справочника "Организации"

Ключ к решению проблемы лежит не в обработке каждого документа или регистра, а в настройке единого правила для самого объекта Организация. "Конвертация данных" при загрузке любого объекта (документа, записи регистра) встречает ссылку на организацию и обращается к ее собственному ПКО, чтобы понять, что с этой ссылкой делать. Наша задача — настроить это ПКО так, чтобы оно автоматически находило нужную нам организацию в базе-приемнике.

Разберем по шагам, как это сделать.

  1. Откройте ПКО для справочника "Организации". В конфигурации "Конвертация данных" найдите правило, отвечающее за перенос справочника Организации.
  2. Настройте поля поиска. Перейдите на вкладку "Настройки" в окне ПКО. В секции "Поиск объекта в приемнике при загрузке" укажите поля, по которым система будет искать существующий объект. Самый надежный идентификатор для организации — это ИНН или связка ИНН + КПП. Установите флажок напротив этих полей.
  3. Включите поиск по полям. Это самый важный шаг. Установите флажок "Продолжить поиск по полям поиска, если по идентификатору объект не найден".

    Почему это важно? По умолчанию "Конвертация данных" ищет объект в базе-приемнике по его внутреннему уникальному идентификатору (GUID). Так как базы разные, GUID "Организации-Источника" в базе-приемнике, конечно же, не будет найден. Этот флажок заставляет систему после неудачного поиска по GUID запустить вторую попытку — поиск по тем полям, которые мы указали на предыдущем шаге (по ИНН).

  4. Настройте подмену значения поля поиска. Теперь нам нужно, чтобы при выгрузке "Организация-Источник" имела тот же ИНН, что и "Организация-Приемник". Для этого:
    • В ПКО "Организации" перейдите на вкладку "Правила конвертации свойств".
    • Найдите правило для свойства "ИНН" (если его нет, создайте).
    • Откройте это правило (ПКС) и в обработчике события "Перед выгрузкой" напишите следующий код:
    
    // ПКС для свойства "ИНН" в ПКО "Организации", обработчик "Перед выгрузкой"
    
    // ИНН организации, которую мы хотим заменить
    ИНН_Старой_Организации = "1234567890"; 
    // ИНН организации, НА которую мы хотим заменить
    ИНН_Новой_Организации  = "9876543210"; 
    
    // Проверяем, является ли выгружаемый объект нашей старой организацией
    // Можно проверять по ИНН, Наименованию или ссылке, если она известна
    Если Источник.ИНН = ИНН_Старой_Организации Тогда
        // Если да, то подменяем выгружаемое значение ИНН
        Значение = ИНН_Новой_Организации;
    КонецЕсли;
    

    Теперь, когда система будет выгружать "Организацию-Источник", она выгрузит ее со всеми реквизитами, но ИНН у нее будет от "Организации-Приемника".

Как это работает в итоге?

При загрузке любого документа в базу-приемник, система видит ссылку на "Организацию-Источник". Она пытается найти ее по GUID, не находит. Затем, благодаря нашей настройке, она начинает искать по ИНН. Так как мы подменили ИНН при выгрузке, система успешно находит "Организацию-Приемник" по ее реальному ИНН и подставляет ссылку на нее во все поля документов и регистров. Задача решена элегантно и централизованно.

Альтернативные и дополнительные методы

Использование параметров конвертации

Чтобы не "зашивать" ИНН прямо в код правил, можно использовать параметры. Это делает правила более универсальными.

  1. В правилах конвертации (на вкладке "Параметры") создайте два параметра, например, ИНН_Источник и ИНН_Приемник.
  2. В коде обработчика "Перед выгрузкой" для ИНН используйте эти параметры:
    
    Если Источник.ИНН = Параметры.ИНН_Источник Тогда
        Значение = Параметры.ИНН_Приемник;
    КонецЕсли;
    
  3. Перед запуском выгрузки или загрузки данных (например, через универсальную обработку обмена) вы сможете задать значения этих параметров, не изменяя сами правила.

Предварительное создание данных

Более простой, но "ручной" способ, упомянутый на форуме. Он заключается в том, чтобы перед выгрузкой данных из базы-источника временно изменить в ней ИНН у "Организации-Источника" на ИНН "Организации-Приемника". Или же создать в базе-источнике фиктивную организацию с нужными реквизитами. Этот метод работает, но он менее технологичен и неудобен при регулярных обменах.

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

← На главную