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