Как программно получить сотрудника из пользователя в 1С:Предприятие 8

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

В процессе разработки в системе «1С:Предприятие 8» часто возникает задача связать текущего пользователя, под которым произведен вход в систему (или который указан в реквизите Ответственный), с его карточкой в справочнике Сотрудники. Эта задача не является тривиальной, так как в типовых конфигурациях нет прямой жесткой связи между этими объектами. Вместо этого используется многоступенчатая иерархия через физические лица.

В этой статье мы подробно разберем, как правильно реализовать этот переход, рассмотрим особенности различных конфигураций и проанализируем типичные ошибки разработчиков. Для этой задачи есть инструментарий для отладки и проверки программного кода.

Архитектура связи: Пользователь — Физлицо — Сотрудник

Прежде чем переходить к написанию кода, проанализируем структуру хранения данных в современных конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), таких как ERP 2, ЗУП 3, КА 2 или УТ 11. Основным «мостиком» между техническими данными (пользователь) и кадровыми данными (сотрудник) выступает справочник ФизическиеЛица.

Логическая цепочка выглядит следующим образом:

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

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

Решение для конфигураций ERP и ЗУП 3

В конфигурациях «1С:ERP Управление предприятием» и «Зарплата и управление персоналом» предусмотрены специализированные программные интерфейсы для работы с кадровыми данными. Наиболее корректным способом получения сотрудника является использование функций общего модуля КадровыйУчет.

Рассмотрим пример кода, который позволяет получить основного сотрудника для ответственного лица, указанного в документе — для этого подойдёт автоматическая подстановка подписей ответственных лиц в печатные формы:


// Предположим, что ОтветственныйСсылка — это СправочникСсылка.Пользователи
// ОрганизацияСсылка — СправочникСсылка.Организации

ФизическоеЛицо = ОтветственныйСсылка.ФизическоеЛицо;
ТекущаяДата = ТекущаяДатаСеанса();

СотрудникСсылка = КадровыйУчет.ОсновнойСотрудникФизическогоЛица(
    ФизическоеЛицо, 
    ОрганизацияСсылка, 
    ТекущаяДата
);

Если ЗначениеЗаполнено(СотрудникСсылка) Тогда
    // Продолжаем работу с полученным сотрудником
КонецЕсли;

Разберем важные нюансы этого метода:

Универсальный подход через запрос

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


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

Запрос.УстановитьПараметр("ФизическоеЛицо", Ответственный.ФизическоеЛицо);
Запрос.УстановитьПараметр("Организация", Объект.Организация);

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Если Выборка.Следующий() Тогда
    Сотрудник = Выборка.Сотрудник;
КонецЕсли;

В данном примере мы используем условие НЕ Сотрудники.ВАрхиве. Это важный момент для конфигураций типа «Бухгалтерия предприятия 3.0», где уволенные сотрудники перемещаются в архив, но их карточки не удаляются.

Особенности работы в «1С:Управление нашей фирмой» (УНФ)

В программе УНФ логика связей несколько отличается. Здесь в карточке сотрудника часто напрямую указывается соответствующий ему пользователь. Поэтому поиск может быть выполнен в обратном направлении — по реквизиту самого справочника Сотрудники.

Рассмотрим программную реализацию для УНФ:


ТекущийПользователь = Пользователи.ТекущийПользователь();
СотрудникСсылка = Справочники.Сотрудники.НайтиПоРеквизиту("Пользователь", ТекущийПользователь);

Если СотрудникСсылка.Пустая() Тогда
    // Обработка ситуации, когда связь не настроена
КонецЕсли;

Почему поиск по наименованию — это плохая практика?

Иногда встречается подход, когда разработчики пытаются найти сотрудника по ФИО, используя метод НайтиПоНаименованию. Рассмотрим, почему этого следует избегать:

Использование функций БСП для получения физического лица

Если реквизит ФизическоеЛицо не выведен на форму справочника Пользователи, мы можем получить его значение программно, не обращаясь к самому объекту целиком (что экономит ресурсы системы). Для этого используем стандартные функции БСП:


// Получаем физлицо без чтения всего объекта пользователя
ФизЛицо = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ПользовательСсылка, "ФизическоеЛицо");

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

Подведем итог

Для корректного получения сотрудника из пользователя всегда придерживайтесь следующего алгоритма:

  1. Определите ФизическоеЛицо, связанное с пользователем.
  2. Используйте типовые функции конфигурации (например, из модуля КадровыйУчет) для поиска сотрудника.
  3. Всегда передавайте в параметры поиска Организацию и Дату, чтобы получить актуальный трудовой договор.
  4. Избегайте поиска по текстовым представлениям (наименованиям).

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

← На главную