При разработке в среде 1С программисты часто сталкиваются с задачей автоматического заполнения реквизитов, таких как Ответственный или Автор. Казалось бы, задача тривиальна, однако начинающие разработчики часто попадают в ловушку архитектуры платформы, путая пользователя информационной базы (объект платформы) с пользователем из справочника (объект метаданных). В этой статье мы подробно разберем, как правильно получить ссылку на текущего пользователя в современных конфигурациях, таких как «Бухгалтерия предприятия 3.0», «Зарплата и управление персоналом 3.1» или «Управление торговлей 11».
Разберем ситуацию: вы пытаетесь присвоить реквизиту значение, используя метод ПользователиИнформационнойБазы.ТекущийПользователь(). Программа не выдает ошибку, но поле в документе остается пустым или очищается. Почему так происходит? Проанализируем типы данных. Метод ПользователиИнформационнойБазы.ТекущийПользователь() возвращает объект типа ПользовательИнформационнойБазы. В то же время реквизит Ответственный в 99% конфигураций имеет тип СправочникСсылка.Пользователи. Это принципиально разные сущности в системе 1С, и прямое присвоение между ними невозможно.
Для решения задачи нам необходимо найти элемент справочника Пользователи, который «связан» с текущим пользователем, под которым осуществлен вход в систему. Рассмотрим несколько способов реализации этой задачи, от «ручных» методов до использования стандартов БСП.
В современных конфигурациях, построенных на базе БСП, этот вопрос решается одной строкой кода. Это самый правильный и универсальный метод, так как он учитывает кэширование, права доступа и работу с внешними пользователями.
Вариант для серверного кода:
Если вам нужно заполнить реквизит в модуле объекта или в серверной процедуре формы, используйте общий модуль Пользователи. Проанализируем код:
// В серверном контексте
ТекПользователь = Пользователи.ТекущийПользователь();
Этот метод возвращает ссылку на справочник Пользователи (или ВнешниеПользователи, если вход выполнен внешним лицом). Рассмотрим подробнее преимущества этого метода: он выполняется в привилегированном режиме, что позволяет избежать проблем, если у пользователя ограничены права (RLS) на чтение собственного элемента справочника.
Вариант для клиентского кода:
Если вам нужно получить пользователя непосредственно на клиенте (например, при открытии формы), используйте клиентский модуль, чтобы избежать лишнего вызова сервера:
// В клиентском контексте
ТекПользователь = ПользователиКлиент.ТекущийПользователь();
Иногда в разных версиях БСП имя модуля может отличаться (например, ПользователиКлиентСервер.ТекущийПользователь()). Выясним причину такой путаницы: разработчики 1С постоянно оптимизируют библиотеку, перенося функции в более подходящие по контексту модули. Всегда проверяйте наличие функций через выпадающий список подсказок (IntelliSense) в конфигураторе.
В типовых решениях (особенно в «1С:Бухгалтерия») при запуске системы инициализируется специальный параметр сеанса — ТекущийПользователь. Это значение хранится в памяти сервера на протяжении всей работы пользователя с базой.
Выясним, как это применить на практике:
// Прямое обращение к параметру сеанса
Объект.Ответственный = ПараметрыСеанса.ТекущийПользователь;
Важный нюанс: Обращение к ПараметрыСеанса напрямую возможно только на сервере. Если вы попытаетесь сделать это в клиентской процедуре &НаКлиенте, система выдаст ошибку. Поэтому предварительно создайте серверную функцию-обертку.
Если вы работаете в конфигурации, где БСП отсутствует или сильно кастомизирована, вы можете реализовать поиск вручную. Связь между списком пользователей ИБ и справочником Пользователи обычно осуществляется через реквизит ИдентификаторПользователяИБ.
Разберем по шагам, как реализовать такую функцию поиска на сервере:
&НаСервере
Функция ПолучитьСсылкуНаТекущегоПользователя() Экспорт
// 1. Получаем ID текущего пользователя ИБ
ИдПользователяИБ = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
// 2. Ищем элемент справочника по этому идентификатору
СсылкаНаПользователя = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ИдПользователяИБ);
// 3. Проверяем, найден ли пользователь
Если СсылкаНаПользователя.Пустая() Тогда
Возврат Неопределено;
Иначе
Возврат СсылкаНаПользователя;
КонецЕсли;
КонецФункции
Внимание: Не рекомендуется искать пользователя по наименованию (НайтиПоНаименованию), так как полное имя пользователя ИБ может не совпадать с наименованием в справочнике или может быть изменено в будущем, что приведет к ошибкам в логике программы.
Проанализируем ситуацию при работе в фоновых заданиях. Если ваш код выполняется в регламентном задании, то ПользователиИнформационнойБазы.ТекущийПользователь() вернет системного пользователя или пользователя, под которым запущен сервер 1С. В этом случае методы БСП могут вернуть пустую ссылку. Если для бизнес-логики важно зафиксировать конкретного человека, его идентификатор или ссылку нужно передавать в параметры фонового задания при его создании.
Также стоит учитывать нюансы работы в режиме разделения данных (SaaS, например, «1С:Фреш»). В облачных версиях сопоставление между пользователем ИБ и справочником жестко контролируется разделом данных. В таких случаях использование штатной функции Пользователи.ТекущийПользователь() является единственно верным способом, так как она корректно отрабатывает в контексте текущего разделителя.
Подведем итог нашему исследованию. Для того чтобы эффективно работать с текущим пользователем в 1С 8.3, придерживайтесь следующих правил:
Пользователи.ТекущийПользователь(). Это самый безопасный и производительный способ.ПользователиКлиент.ТекущийПользователь().глТекущийПользователь.УникальныйИдентификатор, а не имя или наименование.Соблюдение этих принципов позволит вам писать чистый, надежный и отказоустойчивый код, который будет корректно работать даже после обновлений платформы или конфигурации.