Как реализовать сопоставление объектов по свойствам и перенос данных в регистры при конвертации данных

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

При переносе данных между конфигурациями 1С, такими как Зарплата и Управление Персоналом (ЗУП) и Управление производственным предприятием (УПП), программисты часто сталкиваются с ситуациями, когда стандартного поиска по коду или наименованию недостаточно. Типичный пример — необходимость сопоставить подразделения организации по специально созданному дополнительному свойству или корректно перенести периодические сведения о физических лицах. В рамках данной статьи мы подробно разберем, как решать эти задачи с помощью инструментов «Конвертации данных 2.1».

Решение задачи 1: Сопоставление объектов по дополнительному свойству

Рассмотрим ситуацию: в базе-источнике (ЗУП) у подразделения создано свойство КодВУПП, значение которого соответствует коду этого же подразделения в базе-приемнике (УПП). Нам необходимо прописать логику в правилах обмена так, чтобы поиск в приемнике шел именно по этому значению. Проанализируем два основных способа реализации этой задачи.

Способ 1. Прямой запрос в обработчике ПКС

Этот метод подходит, если данных немного. Мы создаем правило конвертации свойств (ПКС), где источником является пустое поле, а приемником — Код подразделения в УПП. В обработчике «Перед выгрузкой» мы пишем запрос к регистру сведений ЗначенияСвойствОбъектов.

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    ЗначенияСвойствОбъектов.Значение КАК ЗначениеКода
    |ИЗ
    |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |    ЗначенияСвойствОбъектов.Объект = &Объект
    |    И ЗначенияСвойствОбъектов.Свойство = &Свойство";

Запрос.УстановитьПараметр("Объект", Источник.Ссылка);
// Важно правильно найти само свойство как объект Плана видов характеристик
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("КодВУПП"));

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

Способ 2. Оптимизированный поиск через кэширование в параметрах

Если подразделений тысячи, выполнение запроса для каждого объекта существенно замедлит выгрузку. Проанализируем более эффективный подход: получение всей таблицы соответствий один раз при начале конвертации.

  1. В обработчике «Перед конвертацией данных» создаем таблицу значений и помещаем ее в структуру Параметры.
  2. В ПКС (или в ПВД) обращаемся к этой таблице по индексу.

Пример инициализации таблицы в «Перед конвертацией данных»:


Запрос = Новый Запрос("ВЫБРАТЬ Объект, Значение ПОМЕСТИТЬ ВТ_Коды ИЗ РегистрСведений.ЗначенияСвойствОбъектов ГДЕ Свойство.Наименование = 'КодВУПП'; ВЫБРАТЬ * ИЗ ВТ_Коды");
Параметры.Вставить("ТаблицаКодов", Запрос.Выполнить().Выгрузить());
Параметры.ТаблицаКодов.Индексы.Добавить("Объект");

Решение задачи 2: Заполнение ФИО физических лиц и работа с регистрами

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

Посмотрим на алгоритм действий в обработчике «После загрузки» правила конвертации объекта (ПКО) ФизическиеЛица:


// Проверяем, что мы работаем именно с объектом справочника
Если ТипЗнч(Объект) = Тип("СправочникОбъект.ФизическиеЛица") Тогда 

    // Если объект новый, его нужно записать, чтобы получить ссылку
    Если Объект.ЭтоНовый() Тогда
        Объект.Записать();
    КонецЕсли;

    // Создаем менеджер записи регистра сведений
    Запись = РегистрыСведений.ФИОФизЛиц.СоздатьМенеджерЗаписи();
    Запись.ФизЛицо = Объект.Ссылка;
    Запись.Период = ТекущаяДата(); // Или дата из источника

    // Используем функции общего модуля для разбиения наименования на составляющие
    // В разных конфигурациях имена модулей могут отличаться (например, ОбщегоНазначенияЗК или ФизическиеЛица)
    МассивФИО = ОбщегоНазначенияЗК.ПолучитьМассивФИО(Объект.Наименование);
    
    Запись.Фамилия  = МассивФИО[0];
    Запись.Имя      = МассивФИО[1];
    Запись.Отчество = МассивФИО[2];
    
    // Записываем данные в регистр
    Запись.Записать();
КонецЕсли;

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

Решение задачи 3: Перенос движений регистров через «Перенос данных»

При переносе кадровой истории (например, регистра РаботникиОрганизаций) без переноса самих документов-регистраторов (приказов), необходимо использовать технический документ ПереносДанных. Основная сложность заключается в том, чтобы при повторных выгрузках или выгрузках по частям (например, по подразделениям) не «затирать» уже существующие строки в документе-приемнике.

Рассмотрим рекомендации по настройке этого процесса:

  1. Создание уникальных регистраторов: Чтобы избежать перезаписи одного и того же документа ПереносДанных, можно генерировать уникальный номер или ключ поиска, включающий название подразделения или дату выгрузки.
  2. Режим дополнения: В обработчике «При загрузке» документа можно прописать алгоритм поиска существующего документа. Если документ найден, мы не заменяем его ТЧ полностью, а добавляем новые строки из ОбъектКоллекции.
  3. Использование регистратора: Помните, что записи большинства регистров в УПП не могут существовать без регистратора. Если ПКС Регистратор в правилах обмена ведет на несколько типов документов, но вы их не переносите, обязательно укажите в правилах конвертации (ПКО) регистратора программное создание документа ПереносДанных.

Проанализируем пример кода для поиска регистратора в ПКО:


// В обработчике "Поля поиска" для документа ПереносДанных
// Можно искать документ по специфическому комментарию или номеру
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.ПереносДанных ГДЕ Номер = &Номер";
Запрос.УстановитьПараметр("Номер", "ПЕР_" + ПодразделениеКод);
// ... логика поиска ...

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

← На главную