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