В процессе разработки автоматизированных систем на базе 1С:Предприятие 8.3 часто возникает задача массового создания пользователей. Одной из ключевых политик безопасности при этом является требование, чтобы пользователь самостоятельно задал себе пароль при первом входе в систему. В интерактивном режиме в конфигурациях на базе БСП (например, 1С:Бухгалтерия 3.0, ERP, ЗУП 3.1) это делается установкой флажка "Потребовать установку (смену) пароля при входе" в карточке пользователя. Однако при программном создании (например, через COM-соединение или при загрузке из внешних систем) установка этого признака вызывает вопросы, так как он не является реквизитом самого объекта Справочник.Пользователи.
В этой статье мы подробно разберем механику работы этого функционала и рассмотрим несколько способов программной установки данного флажка.
Проанализируем архитектуру хранения этих данных. Хотя флажок отображается в форме элемента справочника Пользователи, он является динамическим реквизитом формы. Сами же данные физически записываются в Регистр сведений "Сведения о пользователях". В этом регистре за хранение нужного нам признака отвечает ресурс ПотребоватьСменуПароляПриВходе.
Когда пользователь пытается войти в систему, платформа и программный код конфигурации (модуль управляемого приложения) анализируют состояние этого ресурса. Если значение установлено в Истина, вызывается специализированное диалоговое окно для смены пароля.
Рассмотрим самый простой и быстрый способ, который подходит для большинства ситуаций, включая работу через COM-соединение. Мы будем использовать стандартный объект НаборЗаписей для работы с регистром СведенияОПользователях.
Разберем пример кода по шагам:
&НаСервере
Процедура УстановитьТребованиеСменыПароля(ВыбранныйПользователь)
// Создаем набор записей с фильтром по конкретному пользователю
НаборЗаписей = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Пользователь.Установить(ВыбранныйПользователь);
// Читаем текущую запись, чтобы не затереть другие важные данные (например, дату последнего входа)
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() = 0 Тогда
// Если записи еще нет (новый пользователь), добавляем её
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Пользователь = ВыбранныйПользователь;
Иначе
// Если запись существует, редактируем первую (и единственную по отбору)
НоваяЗапись = НаборЗаписей[0];
КонецЕсли;
// Устанавливаем целевой флаг
НоваяЗапись.ПотребоватьСменуПароляПриВходе = Истина;
// Записываем набор записей
НаборЗаписей.Записать(Истина);
КонецПроцедуры
В данном примере ВыбранныйПользователь — это ссылка на элемент справочника Пользователи. Обратите внимание на важность вызова метода НаборЗаписей.Прочитать(). В регистре СведенияОПользователях хранятся и другие критически важные параметры (например, ДатаНачалаИспользованияПароля или признаки инвалидности учетной записи). Если просто записать пустой набор, вы можете нарушить логику работы системы для этого пользователя.
Для конфигураций, использующих Библиотеку Стандартных Подсистем (БСП), более правильным и безопасным методом является использование программного интерфейса модуля Пользователи. Это гарантирует, что при обновлении конфигурации или изменении структуры регистров ваш код останется работоспособным.
Рассмотрим, как это реализовать через структуру свойств пользователя:
// Получаем текущие свойства пользователя в структуру
СвойстваПользователя = Пользователи.СвойстваПользователя(СсылкаНаПользователя);
// Устанавливаем или изменяем нужное свойство
СвойстваПользователя.Вставить("ПотребоватьСменуПароляПриВходе", Истина);
// Вызываем процедуру записи, которая обновит справочник и все связанные регистры
Пользователи.ЗаписатьПользователя(СсылкаНаПользователя, СвойстваПользователя);
Использование метода Пользователи.ЗаписатьПользователя предпочтительнее, так как внутри него реализованы все необходимые проверки целостности данных и прав доступа. Также это исключает ситуацию, когда данные в справочнике ПользователиИнформационнойБазы рассинхронизируются с данными в регистрах БСП.
Проанализируем несколько ограничений и особенностей, которые стоит учитывать при реализации этого функционала:
ПотребоватьСменуПароляПриВходе в значение Истина является приоритетной. Даже если для пользователя установлен флаг "Срок действия пароля не ограничен", система все равно потребует смену пароля разово при входе, если в регистре стоит соответствующая отметка.Если вам необходимо в другом месте программы проверить, требуется ли пользователю смена пароля, не обязательно обращаться напрямую к регистру. В БСП за это отвечает параметр клиента ТребуетсяСменитьПароль. При инициализации системы (в модуле управляемого приложения) вызывается процедура ПользователиСлужебныйКлиент.ПослеВходаВСистему, которая получает этот параметр с сервера и принимает решение об открытии формы СменаПароля.
Выясним причину, по которой иногда флаг не срабатывает. Это может произойти, если при программной записи в регистр СведенияОПользователях была нарушена уникальность записей или не заполнено измерение Пользователь. Всегда используйте Отбор по ссылке на справочник Пользователи, а не по имени (логину), так как логин может измениться, а внутренняя ссылка остается неизменной.
Таким образом, для надежной работы мы рекомендуем использовать Способ №2 (через API БСП), а при невозможности его использования (например, в очень старых версиях или при специфических ограничениях доступа) — Способ №1 с аккуратным использованием набора записей регистра СведенияОПользователях.