Как связать пользователей и физических лиц для адресации задач в 1С:УПП?

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

При доработке механизмов постановки задач, согласования или маршрутизации документов разработчики часто сталкиваются с требованием бизнеса: в интерфейсе необходимо выбирать не учетную запись пользователя базы, а человека из справочника Физические лица. При этом типовые механизмы платформы и конфигурации «Управление производственным предприятием» (УПП) оперируют объектами СправочникСсылка.Пользователи. Разберем, как устроена взаимосвязь этих объектов, какие подводные камни существуют при сопоставлении данных и как правильно реализовать алгоритм программного поиска учетной записи.

Структура связи справочников в 1С:УПП

Проанализируем типовую метаструктуру конфигурации. Прямого подчинения по владельцу между справочниками Пользователи и ФизическиеЛица нет. Связь организована через реквизит:

В справочнике Пользователи присутствует реквизит ФизЛицо с типом СправочникСсылка.ФизическиеЛица.

Обратите внимание на ключевые особенности этого архитектурного решения:

  1. Связь не является строго взаимооднозначной: одному физическому лицу может не соответствовать ни одного пользователя (например, уволенный работник или сторонний контрагент), либо может соответствовать несколько учетных записей (основная рабочая запись, технологическая, служебная или администраторская учетная запись).
  2. Реквизит не гарантирует уникальность: на уровне метаданных платформа не проверяет уникальность заполнения реквизита ФизЛицо в справочнике Пользователи.
  3. Учетная запись может быть неактивна: пользователь может быть помечен на удаление или заблокирован администратором.

Разграничение понятий: физлица и сотрудники

Перед реализацией интерфейса выясним важную методологическую деталь: кого именно должен выбирать пользователь. В конфигурации 1С:УПП разделены сущности:

  1. Справочник.ФизическиеЛица — содержит анкетные паспортные данные человека как личности.
  2. Справочник.СотрудникиОрганизаций — отражает человека в контексте конкретного трудового договора, подразделения и должности.
  3. Справочник.Пользователи — представляет учетную запись для авторизации в информационной базе.

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

Реализация программного поиска пользователя по физическому лицу

Рассмотрим, как правильно получить пользователя, зная выбранную ссылку на физическое лицо. Использовать метод Справочники.Пользователи.НайтиПоРеквизиту("ФизЛицо", ВыбФизЛицо) не рекомендуется по двум причинам: во-первых, реквизит может быть не проиндексирован, что вызовет полное сканирование таблицы, а во-вторых, этот метод возвратит первую попавшуюся запись, которая может оказаться помеченной на удаление или недействующей.

Для надежного сопоставления напишем специализированную функцию на языке запросов:


Функция ПолучитьПользователяПоФизЛицу(ВыбФизЛицо) Экспорт

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |   Пользователи.Ссылка КАК Пользователь
        |ИЗ
        |   Справочник.Пользователи КАК Пользователи
        |ГДЕ
        |   Пользователи.ФизЛицо = &ФизЛицо
        |   И Пользователи.ПометкаУдаления = ЛОЖЬ";

    Запрос.УстановитьПараметр("ФизЛицо", ВыбФизЛицо);

    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        Возврат Справочники.Пользователи.ПустаяСсылка();
    КонецЕсли;

    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    
    // Если найдена одна запись - возвращаем ее
    Если Выборка.Количество() = 1 Тогда
        Возврат Выборка.Пользователь;
    Иначе
        // Обработка коллизии: одному человеку назначено несколько активных аккаунтов
        ВызватьИсключение "Для выбранного физического лица найдено несколько активных пользователей базы!";
    КонецЕсли;

КонецФункции

Ограничение списка выбора физических лиц на форме

Разберем типичную проблему: если пользователь в форме выбирает человека, у которого нет учетной записи в базе, система не сможет адресовать задачу. Чтобы исключить подобные ошибки на этапе ввода данных, настроим форму выбора справочника ФизическиеЛица так, чтобы в ней отображались только те лица, которые сопоставлены с реальными пользователями базы.

Для этого в обработчике события начала выбора элемента наложим отбор:


Процедура ПолеФизЛицоНачалоВыбора(Элемент, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    ФормаВыбора = Справочники.ФизическиеЛица.ПолучитьФормуВыбора(, Элемент);

    // Получим список физлиц, у которых есть актуальные пользователи
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |   Пользователи.ФизЛицо КАК ФизЛицо
        |ИЗ
        |   Справочник.Пользователи КАК Пользователи
        |ГДЕ
        |   Пользователи.ПометкаУдаления = ЛОЖЬ
        |   И Пользователи.ФизЛицо <> ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка)";

    СписокФизЛиц = Новый СписокЗначений;
    СписокФизЛиц.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ФизЛицо"));

    ФормаВыбора.Отбор.Ссылка.ВидСравнения = ВидСравнения.ВСписке;
    ФормаВыбора.Отбор.Ссылка.Значение = СписокФизЛиц;
    ФормаВыбора.Отбор.Ссылка.Использование = Истина;

    ФормаВыбора.Открыть();

КонецПроцедуры

Альтернативное решение: адресация через роли и бизнес-процессы

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

Для гибкой маршрутизации используется механизм ролевой адресации:

  1. Задача адресуется не на конкретного пользователя или физическое лицо, а на связку Роль исполнителя и Объект адресации (например, подразделение или организация).
  2. Соответствие ролей и пользователей настраивается в регистре сведений адресации.
  3. При таком подходе в интерфейсе задачи фиксируется роль, а исполнитель определяется автоматически в момент входа в систему нужного сотрудника.

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

← На главную