При переносе данных между конфигурациями 1С, такими как Зарплата и Управление Персоналом (ЗУП) и Управление производственным предприятием (УПП), программисты часто сталкиваются с ситуациями, когда стандартного поиска по коду или наименованию недостаточно. Типичный пример — необходимость сопоставить подразделения организации по специально созданному дополнительному свойству или корректно перенести периодические сведения о физических лицах. В рамках данной статьи мы подробно разберем, как решать эти задачи с помощью инструментов «Конвертации данных 2.1».
Рассмотрим ситуацию: в базе-источнике (ЗУП) у подразделения создано свойство КодВУПП, значение которого соответствует коду этого же подразделения в базе-приемнике (УПП). Нам необходимо прописать логику в правилах обмена так, чтобы поиск в приемнике шел именно по этому значению. Проанализируем два основных способа реализации этой задачи.
Способ 1. Прямой запрос в обработчике ПКС
Этот метод подходит, если данных немного. Мы создаем правило конвертации свойств (ПКС), где источником является пустое поле, а приемником — Код подразделения в УПП. В обработчике «Перед выгрузкой» мы пишем запрос к регистру сведений ЗначенияСвойствОбъектов.
Разберем пример кода, который необходимо разместить в обработчике «Перед выгрузкой» для ПКС Код:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗначенияСвойствОбъектов.Значение КАК ЗначениеКода
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|ГДЕ
| ЗначенияСвойствОбъектов.Объект = &Объект
| И ЗначенияСвойствОбъектов.Свойство = &Свойство";
Запрос.УстановитьПараметр("Объект", Источник.Ссылка);
// Важно правильно найти само свойство как объект Плана видов характеристик
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("КодВУПП"));
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
Значение = Выборка.ЗначениеКода;
Иначе
// Если свойство не заполнено, можно либо пропустить выгрузку, либо назначить дефолтный код
Отказ = Истина;
КонецЕсли;
Способ 2. Оптимизированный поиск через кэширование в параметрах
Если подразделений тысячи, выполнение запроса для каждого объекта существенно замедлит выгрузку. Проанализируем более эффективный подход: получение всей таблицы соответствий один раз при начале конвертации.
Параметры.Пример инициализации таблицы в «Перед конвертацией данных»:
Запрос = Новый Запрос("ВЫБРАТЬ Объект, Значение ПОМЕСТИТЬ ВТ_Коды ИЗ РегистрСведений.ЗначенияСвойствОбъектов ГДЕ Свойство.Наименование = 'КодВУПП'; ВЫБРАТЬ * ИЗ ВТ_Коды");
Параметры.Вставить("ТаблицаКодов", Запрос.Выполнить().Выгрузить());
Параметры.ТаблицаКодов.Индексы.Добавить("Объект");
В конфигурациях 1С данные о фамилии, имени и отчестве физических лиц часто хранятся в отдельном периодическом регистре сведений ФИОФизЛиц. При переносе справочника ФизическиеЛица эти данные могут не заполниться автоматически, если они не являются реквизитами самого справочника в приемнике. Выясним, как программно создать запись в регистре при загрузке объекта.
Посмотрим на алгоритм действий в обработчике «После загрузки» правила конвертации объекта (ПКО) ФизическиеЛица:
// Проверяем, что мы работаем именно с объектом справочника
Если ТипЗнч(Объект) = Тип("СправочникОбъект.ФизическиеЛица") Тогда
// Если объект новый, его нужно записать, чтобы получить ссылку
Если Объект.ЭтоНовый() Тогда
Объект.Записать();
КонецЕсли;
// Создаем менеджер записи регистра сведений
Запись = РегистрыСведений.ФИОФизЛиц.СоздатьМенеджерЗаписи();
Запись.ФизЛицо = Объект.Ссылка;
Запись.Период = ТекущаяДата(); // Или дата из источника
// Используем функции общего модуля для разбиения наименования на составляющие
// В разных конфигурациях имена модулей могут отличаться (например, ОбщегоНазначенияЗК или ФизическиеЛица)
МассивФИО = ОбщегоНазначенияЗК.ПолучитьМассивФИО(Объект.Наименование);
Запись.Фамилия = МассивФИО[0];
Запись.Имя = МассивФИО[1];
Запись.Отчество = МассивФИО[2];
// Записываем данные в регистр
Запись.Записать();
КонецЕсли;
Важно помнить: при проверке типа объекта в обработчиках загрузки следует использовать СправочникОбъект.ИмяСправочника, так как данные передаются в процедуру именно как объект, подготовленный к записи.
При переносе кадровой истории (например, регистра РаботникиОрганизаций) без переноса самих документов-регистраторов (приказов), необходимо использовать технический документ ПереносДанных. Основная сложность заключается в том, чтобы при повторных выгрузках или выгрузках по частям (например, по подразделениям) не «затирать» уже существующие строки в документе-приемнике.
Рассмотрим рекомендации по настройке этого процесса:
ПереносДанных, можно генерировать уникальный номер или ключ поиска, включающий название подразделения или дату выгрузки.ОбъектКоллекции.Регистратор в правилах обмена ведет на несколько типов документов, но вы их не переносите, обязательно укажите в правилах конвертации (ПКО) регистратора программное создание документа ПереносДанных.Проанализируем пример кода для поиска регистратора в ПКО:
// В обработчике "Поля поиска" для документа ПереносДанных
// Можно искать документ по специфическому комментарию или номеру
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.ПереносДанных ГДЕ Номер = &Номер";
Запрос.УстановитьПараметр("Номер", "ПЕР_" + ПодразделениеКод);
// ... логика поиска ...
Таким образом, сочетание правильного использования обработчиков событий, оптимизированных запросов и механизмов работы с регистрами позволяет гибко настраивать обмен данными любой сложности между типовыми конфигурациями 1С.