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