Как программно установить требование смены пароля при входе в 1С?

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

В процессе разработки автоматизированных систем на базе 1С:Предприятие 8.3 часто возникает задача массового создания пользователей. Одной из ключевых политик безопасности при этом является требование, чтобы пользователь самостоятельно задал себе пароль при первом входе в систему. В интерактивном режиме в конфигурациях на базе БСП (например, 1С:Бухгалтерия 3.0, ERP, ЗУП 3.1) это делается установкой флажка "Потребовать установку (смену) пароля при входе" в карточке пользователя. Однако при программном создании (например, через COM-соединение или при загрузке из внешних систем) установка этого признака вызывает вопросы, так как он не является реквизитом самого объекта Справочник.Пользователи.

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

Где хранятся данные о требовании смены пароля?

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

Когда пользователь пытается войти в систему, платформа и программный код конфигурации (модуль управляемого приложения) анализируют состояние этого ресурса. Если значение установлено в Истина, вызывается специализированное диалоговое окно для смены пароля.

Способ №1: Прямая запись в регистр сведений (универсальный метод)

Рассмотрим самый простой и быстрый способ, который подходит для большинства ситуаций, включая работу через COM-соединение. Мы будем использовать стандартный объект НаборЗаписей для работы с регистром СведенияОПользователях.

Разберем пример кода по шагам:


&НаСервере
Процедура УстановитьТребованиеСменыПароля(ВыбранныйПользователь)
    
    // Создаем набор записей с фильтром по конкретному пользователю
    НаборЗаписей = РегистрыСведений.СведенияОПользователях.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Пользователь.Установить(ВыбранныйПользователь);
    
    // Читаем текущую запись, чтобы не затереть другие важные данные (например, дату последнего входа)
    НаборЗаписей.Прочитать();
    
    Если НаборЗаписей.Количество() = 0 Тогда
        // Если записи еще нет (новый пользователь), добавляем её
        НоваяЗапись = НаборЗаписей.Добавить();
        НоваяЗапись.Пользователь = ВыбранныйПользователь;
    Иначе
        // Если запись существует, редактируем первую (и единственную по отбору)
        НоваяЗапись = НаборЗаписей[0];
    КонецЕсли;
    
    // Устанавливаем целевой флаг
    НоваяЗапись.ПотребоватьСменуПароляПриВходе = Истина;
    
    // Записываем набор записей
    НаборЗаписей.Записать(Истина);
    
КонецПроцедуры

В данном примере ВыбранныйПользователь — это ссылка на элемент справочника Пользователи. Обратите внимание на важность вызова метода НаборЗаписей.Прочитать(). В регистре СведенияОПользователях хранятся и другие критически важные параметры (например, ДатаНачалаИспользованияПароля или признаки инвалидности учетной записи). Если просто записать пустой набор, вы можете нарушить логику работы системы для этого пользователя.

Способ №2: Использование стандартного API БСП (рекомендуемый метод)

Для конфигураций, использующих Библиотеку Стандартных Подсистем (БСП), более правильным и безопасным методом является использование программного интерфейса модуля Пользователи. Это гарантирует, что при обновлении конфигурации или изменении структуры регистров ваш код останется работоспособным.

Рассмотрим, как это реализовать через структуру свойств пользователя:


// Получаем текущие свойства пользователя в структуру
СвойстваПользователя = Пользователи.СвойстваПользователя(СсылкаНаПользователя);

// Устанавливаем или изменяем нужное свойство
СвойстваПользователя.Вставить("ПотребоватьСменуПароляПриВходе", Истина);

// Вызываем процедуру записи, которая обновит справочник и все связанные регистры
Пользователи.ЗаписатьПользователя(СсылкаНаПользователя, СвойстваПользователя);

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

Важные технические нюансы

Проанализируем несколько ограничений и особенностей, которые стоит учитывать при реализации этого функционала:

  1. Тип аутентификации: Флаг смены пароля работает исключительно для аутентификации 1С:Предприятия. Если для пользователя настроена только доменная авторизация (ОС-аутентификация), этот флаг будет проигнорирован, так как 1С не имеет прав на изменение паролей в Active Directory или других внешних системах.
  2. COM-соединение: Если вы устанавливаете флаг через COM, само окно смены пароля не появится в момент работы COM-скрипта. Оно откроется только тогда, когда реальный человек попытается авторизоваться через тонкий или толстый клиент под этой учетной записью.
  3. Политика сложности паролей: Если в системных настройках (раздел "Администрирование — Настройки пользователей и прав") включена проверка сложности пароля, то при смене пароля пользователем система автоматически применит эти правила. Программно установленный флаг просто инициирует этот процесс.
  4. Срок действия пароля: Установка ресурса ПотребоватьСменуПароляПриВходе в значение Истина является приоритетной. Даже если для пользователя установлен флаг "Срок действия пароля не ограничен", система все равно потребует смену пароля разово при входе, если в регистре стоит соответствующая отметка.

Как проверить результат в коде?

Если вам необходимо в другом месте программы проверить, требуется ли пользователю смена пароля, не обязательно обращаться напрямую к регистру. В БСП за это отвечает параметр клиента ТребуетсяСменитьПароль. При инициализации системы (в модуле управляемого приложения) вызывается процедура ПользователиСлужебныйКлиент.ПослеВходаВСистему, которая получает этот параметр с сервера и принимает решение об открытии формы СменаПароля.

Выясним причину, по которой иногда флаг не срабатывает. Это может произойти, если при программной записи в регистр СведенияОПользователях была нарушена уникальность записей или не заполнено измерение Пользователь. Всегда используйте Отбор по ссылке на справочник Пользователи, а не по имени (логину), так как логин может измениться, а внутренняя ссылка остается неизменной.

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

← На главную