В процессе разработки или доработки конфигураций 1С часто возникает необходимость программно получить определенные настройки текущего пользователя. Это может быть "Основное подразделение организации", "Основная организация", "Основная касса" или любой другой параметр, который пользователь задал в своих персональных настройках. Эти значения по умолчанию используются системой для автоматической подстановки в новые документы и формы, значительно упрощая работу пользователей. Рассмотрим, как мы можем получить эти настройки средствами встроенного языка 1С, избегая распространенных ошибок.
Персональные настройки пользователя, как правило, хранятся в регистре сведений "НастройкиПользователей" или его аналогах (например, "СохраненныеНастройки" в некоторых конфигурациях). Этот регистр сведений является непериодическим и предназначен для хранения произвольной информации, актуальной на текущий момент. Он обычно имеет измерения, такие как "Пользователь", и ресурсы, хранящие сами значения настроек. Однако, прямое обращение к регистру сведений часто не является лучшей практикой, поскольку типовые конфигурации предоставляют специальные функции для работы с этими данными, которые учитывают все нюансы и особенности.
Мы рассмотрим несколько подходов к получению настроек, начиная с наиболее предпочтительных и универсальных, а затем перейдем к специфическим для отдельных конфигураций.
Наиболее надежный и правильный способ получить пользовательские настройки — это использовать функции, предоставляемые общими модулями типовой конфигурации. Чаще всего это модуль "УправлениеПользователями" или аналогичные модули, предназначенные для работы с пользовательскими данными.
Во многих типовых конфигурациях на базе БСП (Библиотека стандартных подсистем) существует функция ПолучитьЗначениеПоУмолчанию в общем модуле УправлениеПользователями. Она принимает два параметра: объект, представляющий пользователя, и строковое имя параметра настройки.
Разберем пример из темы форума:
КР = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ТекушийПользователь, "ОсновноеПодразделениеОрганизации");
Здесь мы сталкиваемся с очень важным нюансом: тип объекта, который мы передаем в качестве первого параметра, должен соответствовать ожидаемому типу. Распространенной ошибкой является попытка передать объект типа ПользовательИнформационнойБазы, полученный через ПользователиИнформационнойБазы.ТекущийПользователь(), напрямую в эту функцию или использовать его в запросе, ожидающем ссылку на элемент справочника "Пользователи".
Эта ошибка, описанная в сообщении 4, возникает из-за несоответствия типов. Объект, возвращаемый функцией ПользователиИнформационнойБазы.ТекущийПользователь(), имеет тип "ПользовательИнформационнойБазы", который является системным объектом, представляющим пользователя, под которым осуществлен вход в информационную базу. Однако, функция ПолучитьЗначениеПоУмолчанию, как правило, в своей внутренней логике строит запрос к регистру сведений "НастройкиПользователей", измерение "Пользователь" которого имеет тип "СправочникСсылка.Пользователи".
Следовательно, напрямую сравнивать ПользовательИнформационнойБазы с СправочникСсылка.Пользователи нельзя. Мы должны преобразовать системный объект пользователя к ссылке на элемент справочника.
Существует несколько способов получить ссылку на элемент справочника "Пользователи" для текущего пользователя:
В некоторых случаях, если имя пользователя информационной базы совпадает с кодом или наименованием элемента справочника "Пользователи", можно использовать метод поиска по коду или наименованию. Однако это не всегда надежно, так как код или наименование могут быть изменены или не совпадать с именем пользователя ИБ.
Пример из сообщения 8, который успешно заработал:
пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
КтоОткрыл = Справочники.Пользователи.НайтиПоКоду(пользователь.Имя);
КР = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(КтоОткрыл, "ОсновноеПодразделениеОрганизации");
В данном случае, если код элемента справочника "Пользователи" совпадает с именем пользователя информационной базы, этот метод сработает.
Параметр сеанса ТекущийПользователь (или аналогичный, например, ТекущийПользовательБСП) в типовых конфигурациях на основе БСП уже хранит ссылку на элемент справочника "Пользователи". Этот способ является наиболее рекомендованным для серверного кода, особенно при работе с запросами и механизмами ограничения доступа на уровне записей (RLS).
Пример из сообщения 9:
КР = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "ОсновноеПодразделениеОрганизации");
Это самый чистый и правильный способ, поскольку ПараметрыСеанса.ТекущийПользователь уже имеет нужный тип СправочникСсылка.Пользователи.
Некоторые конфигурации предоставляют специализированную функцию в общем модуле УправлениеПользователями, которая самостоятельно определяет текущего пользователя и возвращает его в виде ссылки на справочник "Пользователи".
Пример из сообщения 10:
ОсновноеПодразделение = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(УправлениеПользователями.ОпределитьТекущегоПользователя(), "ОсновноеПодразделениеОрганизации");
Этот способ также очень удобен, так как инкапсулирует логику получения правильного объекта пользователя.
Если в справочнике "Пользователи" есть реквизит, хранящий уникальный идентификатор пользователя информационной базы (например, ИдентификаторПользователяИБ), мы можем найти нужный элемент по нему. Это один из самых надежных способов.
ТекущийПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
ПользовательСсылка = Справочники.Пользователи.НайтиПоУникальномуИдентификатору(ТекущийПользовательИБ.УникальныйИдентификатор);
Если ПользовательСсылка.Пустая() Тогда
// Обработать ситуацию, когда пользователь ИБ не найден в справочнике
Сообщить("Для текущего пользователя не найден соответствующий элемент в справочнике 'Пользователи'.");
Иначе
КР = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПользовательСсылка, "ОсновноеПодразделениеОрганизации");
КонецЕсли;
Этот метод основан на том, что при синхронизации пользователей между информационной базой и справочником "Пользователи" в элементе справочника сохраняется уникальный идентификатор пользователя ИБ. Это обеспечивает корректную привязку.
Хотя использование типовых функций предпочтительнее, мы можем также напрямую обратиться к регистру сведений "НастройкиПользователей" (или аналогичному, например, "СохраненныеНастройки"), если в конфигурации нет подходящих типовых функций или если нам требуется специфическая логика.
Для этого мы можем использовать запрос:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НастройкиПользователей.Значение
|ИЗ
| РегистрСведений.НастройкиПользователей КАК НастройкиПользователей
|ГДЕ
| НастройкиПользователей.Пользователь = &Пользователь
| И НастройкиПользователей.ИмяНастройки = &ИмяНастройки";
Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);
Запрос.УстановитьПараметр("ИмяНастройки", "ОсновноеПодразделениеОрганизации");
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
ОсновноеПодразделение = Результат.Значение;
Иначе
// Установка значения по умолчанию, если настройка не найдена
ОсновноеПодразделение = Неопределено;
КонецЕсли;
Обратите внимание, что здесь мы также используем ПараметрыСеанса.ТекущийПользователь, чтобы получить корректную ссылку на элемент справочника "Пользователи". Имя настройки, например, "ОсновноеПодразделениеОрганизации", должно соответствовать тому, как оно сохраняется в регистре.
Различные типовые конфигурации могут иметь свои специализированные механизмы для получения наиболее часто используемых настроек, таких как основная организация.
Для получения основной организации в ЗУП 3.0 (иногда и в других конфигурациях), могут использоваться следующие подходы (подробнее в справочнике методов конфигурации Зарплата и кадры):
ОрганизацияПоУмолчанию:
Многие справочники имеют статические методы для получения значений по умолчанию. Для организаций это может быть:
&НаСервере
Процедура ОсновнаяОрганизацияНаСервере(ОсновнаяОрганизацияТекущегоПользователя)
ОсновнаяОрганизацияТекущегоПользователя = Справочники.Организации.ОрганизацияПоУмолчанию(ПользователиИнформационнойБазы.ТекущийПользователь());
КонецПроцедуры
Здесь мы видим, что в качестве параметра передается ПользователиИнформационнойБазы.ТекущийПользователь(). Это означает, что функция ОрганизацияПоУмолчанию в данном случае способна работать с объектом типа "ПользовательИнформационнойБазы" или внутри себя преобразует его.
Иногда используются более высокоуровневые функции из специализированных общих модулей, например, для получения первой доступной организации:
Объект.Организация = ЗарплатаКадры.ПерваяДоступнаяОрганизация();
Или общий модуль, который может содержать функцию ОрганизацияПоУмолчанию:
ОбщегоНазначения.ОбщийМодуль("Справочники.Организации").ОрганизацияПоУмолчанию;
В УНФ также могут использоваться специализированные функции, похожие на те, что мы рассматривали в "УправлениеПользователями":
ОрганизацияПоУмолчанию = УправлениеНебольшойФирмойПовтИсп.ПолучитьЗначениеПоУмолчаниюПользователя(
Пользователи.ТекущийПользователь(), "ОсновнаяОрганизация");
Здесь используется Пользователи.Текущий() (или Пользователи.ТекущийПользователь(), как в примере), который возвращает объект типа "Пользователь", а не ссылку на элемент справочника. Важно уточнять, какой именно объект пользователя ожидает конкретная функция.
В БП 3.0 для получения основной организации или других настроек по умолчанию можно использовать функции модуля БухгалтерскийУчетПереопределяемый:
ОсновнаяОрганизация = БухгалтерскийУчетПереопределяемый.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация");
Этот метод является предпочтительным для БП, поскольку он инкапсулирует специфическую логику конфигурации (аналогично тому, как реализовано управление датами запрета изменений в разрезе метаданных).
Принцип получения других настроек по умолчанию остается тем же — используем соответствующую функцию из типового модуля и передаем правильный объект пользователя и имя настройки:
&НаСервере
Процедура ПолучитьНаСервере()
ТекПользователь = ПараметрыСеанса.ТекущийПользователь; // Или другой подходящий способ получения ссылки на пользователя
// Получение основного источника финансирования
Объект.ИсточникФинансирования = ПользователиБКВызовСервераПовтИсп.ПолучитьЗначениеПоУмолчанию(ТекПользователь, "ОсновнойИсточникФинансирования");
// Получение основной кассы
Объект.Касса = ПользователиБКВызовСервераПовтИсп.ПолучитьЗначениеПоУмолчанию(ТекПользователь, "ОсновнаяКасса");
КонецПроцедуры
В этом примере мы видим, что для разных настроек используется одна и та же функция ПолучитьЗначениеПоУмолчанию, но с разными именами параметров.
УправлениеПользователями.ПолучитьЗначениеПоУмолчанию), так как они уже содержат проверенную логику и учитывают особенности конфигурации.ПараметрыСеанса.ТекущийПользователь является наиболее универсальным и рекомендуемым способом получения ссылки на элемент справочника "Пользователи" для серверного кода и запросов.Следуя этим рекомендациям, мы сможем эффективно и надежно получать программно необходимые настройки текущего пользователя, обеспечивая корректную работу нашей системы 1С.