Как реализовать восстановление и смену пароля пользователя в самописной конфигурации 1С

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

Разработка собственной конфигурации «с нуля» (так называемой «нетленки») дает полную свободу действий, но рано или поздно ставит перед программистом классические задачи администрирования. Одна из наиболее частых потребностей — предоставить пользователям возможность самостоятельно восстанавливать или менять свой пароль без привлечения администратора системы.

В этой статье мы подробно разберем три различных подхода к решению этой задачи в зависимости от ваших требований к архитектуре системы:

  1. Использование встроенного стандартного механизма платформы 1С:Предприятие (без программирования).
  2. Интеграция подсистемы «Пользователи» из Библиотеки Стандартных Подсистем (БСП) и исправление сопутствующих ошибок компиляции.
  3. Разработка собственного механизма восстановления паролей через e-mail «с нуля» с использованием привилегированного режима.

---

Способ 1. Встроенный штатный механизм восстановления паролей платформы (начиная с версии 8.3.15)

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

Этот способ работает абсолютно во всех конфигурациях (даже в полностью пустых) и поддерживается в тонком, толстом и веб-клиентах. Нам не потребуется писать ни одной строчки кода.

Выполним настройку по шагам в Конфигураторе:

  1. Откроем базу в режиме Конфигуратора с правами администратора.
  2. Перейдем в главное меню: Администрирование — Дополнительные настройки аутентификации.
  3. В открывшемся диалоговом окне настроим параметры восстановления пароля. Нам доступны три варианта:
    • Использовать стандартный сервис «1С» (требует минимальных настроек, отправка идет через инфраструктуру фирмы «1С»).
    • Использовать собственный SMTP-сервер. Здесь мы можем указать параметры корпоративного почтового ящика: адрес SMTP-сервера, порт, имя пользователя (логин), пароль и необходимость использования безопасного соединения SSL/TLS.
    • Переход по внешней ссылке. Этот вариант подходит, если в компании принят единый корпоративный портал для управления учетными записями. В окне авторизации будет выведена ссылка на этот ресурс.
  4. После настройки почтового сервера перейдем в список пользователей (Администрирование — Пользователи). Для каждого пользователя, которому разрешено самостоятельно сбрасывать пароль, должны быть выполнены следующие условия:
    • В поле E-mail должен быть указан корректный адрес электронной почты.
    • Должен быть снят флажок «Пользователю запрещено восстанавливать пароль».

Теперь при запуске программы в окне авторизации под полями ввода логина и пароля появится интерактивная гиперссылка «Забыли пароль?». При клике на нее система предложит пользователю ввести свой e-mail. Платформа автоматически сгенерирует временный код подтверждения, отправит его на указанный адрес, проверит введенный код в форме авторизации и позволит пользователю задать новый пароль.

---

Способ 2. Интеграция функционала из БСП и разбор ошибок переноса кода

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

При попытке перенести код смены почты и пароля вручную компилятор выдает следующую ошибку:


{ОбщийМодуль.ИнтеграцияПодсистемБСП.Модуль(27,7)}: Переменная не определена (ОбщегоНазначения)
Если >ОбщегоНазначения.ПодсистемаСуществует("Подсистемы.СтандартныеПодсистемы.РаботаВМоделиСервиса.ПользователиВМоделиСервиса") Тогда

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

Чтобы избежать подобных проблем и корректно интегрировать механизмы управления пользователями БСП в вашу «нетленку», выполните следующие рекомендации:

  1. Используйте «Помощник внедрения БСП». Эта специализированная обработка поставляется вместе с дистрибутивом БСП. Она позволяет в интерактивном режиме отметить галочками только нужные вам подсистемы (например, «Пользователи») и автоматически выгрузит все связанные объекты, роли и общие модули (включая ОбщегоНазначения), контролируя их целостность.
  2. Если вы все же переносите код вручную, вам придется перенести как минимум базовые модули ядра БСП:
    • ОбщегоНазначения
    • ОбщегоНазначенияКлиентСервер
    • ОбщегоНазначенияВызовСервера
    • Общие свойства и константы, к которым обращаются данные модули.

---

Способ 3. Создание собственного механизма восстановления пароля «с нуля»

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

Главная сложность при написании своего кода смены пароля обычным пользователем — ограничение прав доступа. Обычный пользователь без полных прав не может модифицировать учетные записи других пользователей (и даже свою собственную на уровне таблицы ПользователиИнформационнойБазы). При попытке программной записи система выдаст ошибку нарушения прав доступа.

Для решения этой проблемы операции по записи пароля необходимо выполнять на сервере в привилегированном режиме.

Рассмотрим по шагам структуру создания такой системы:

Шаг 1. Создание регистра сведений для хранения запросов на восстановление

Создадим новый регистр сведений ЗапросыНаВосстановлениеПароля со следующей структурой:

Шаг 2. Генерация токена и отправка письма пользователю

Создадим общий модуль УправлениеДоступомСервер с установленными флагами «Сервер» и «Привилегированный». В нем напишем процедуру создания запроса и отправки письма:


Процедура СоздатьЗапросНаВосстановление(Знач ЭлектроннаяПочта) Экспорт
    
    // Выясним, существует ли пользователь с такой почтой
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ИСТИНА
        |   Пользователи.Ссылка КАК Пользователь,
        |   Пользователи.ИмяПользователяИБ КАК ИмяПользователяИБ
        |ИЗ
        |   Справочник.Пользователи КАК Пользователи
        |ГДЕ
        |   Пользователи.ЭлектроннаяПочта = &ЭлектроннаяПочта";
    
    Запрос.УстановитьПараметр("ЭлектроннаяПочта", ЭлектроннаяПочта);
    РезультатЗапроса = Запрос.Выполнить();
    
    Если РезультатЗапроса.Пустой() Тогда
        ВызватьИсключение "Пользователь с таким адресом электронной почты не найден!";
    КонецЕсли;
    
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();
    
    // Генерируем уникальный токен сброса пароля
    НовыйТокен = Строка(Новый УникальныйИдентификатор);
    
    // Записываем запрос в регистр сведений в привилегированном режиме
    УстановитьПривилегированныйРежим(Истина);
    
    МенеджерЗаписи = РегистрыСведений.ЗапросыНаВосстановлениеПароля.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Токен = НовыйТокен;
    МенеджерЗаписи.Пользователь = Выборка.Пользователь;
    МенеджерЗаписи.ДатаСоздания = ТекущаяДата();
    МенеджерЗаписи.Использован = Ложь;
    МенеджерЗаписи.Записать();
    
    УстановитьПривилегированныйРежим(Ложь);
    
    // Отправляем письмо с кодом подтверждения
    ОтправитьПисьмоСКодом(ЭлектроннаяПочта, НовыйТокен);
    
КонецПроцедуры

Шаг 3. Отправка электронного письма

Напишем вспомогательную процедуру для отправки почтового сообщения. Для отправки писем настроим системную учетную запись:


Процедура ОтправитьПисьмоСКодом(Знач АдресПолучателя, Знач Токен)
    
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервераSMTP = "smtp.mail.ru";
    Профиль.ПортSMTP = 465;
    Профиль.Пользователь = "support@mycompany.ru";
    Профиль.Пароль = "SecretPassword123";
    Профиль.ИспользоватьSSLSMTP = Истина;
    
    Письмо = Новый ИнтернетПочтовоеСообщение;
    Письмо.Отправитель.Адрес = "support@mycompany.ru";
    Письмо.Получатели.Добавить(АдресПолучателя);
    Письмо.Тема = "Восстановление доступа к системе 1С";
    
    ТекстСообщения = "Здравствуйте! " + Символы.ПС + Символы.ПС
        + "Был получен запрос на восстановление пароля для вашей учетной записи." + Символы.ПС
        + "Ваш уникальный код подтверждения: " + Токен + Символы.ПС + Символы.ПС
        + "Введите этот код в форме восстановления пароля в 1С.";
        
    Письмо.Тексты.Добавить(ТекстСообщения, ТипТекстаПочтовогоСообщения.ПростойТекст);
    
    Почта = Новый ИнтернетПочта;
    Попытка
        Почта.Подключиться(Профиль);
        Почта.Послать(Письмо);
        Почта.Отключиться();
    Исключение
        ЗаписатьЛогСобытий("Ошибка отправки почты: " + ОписаниеОшибки());
        ВызватьИсключение "Не удалось отправить письмо на указанный адрес!";
    КонецПопытки;
    
КонецПроцедуры

Шаг 4. Изменение пароля пользователя в привилегированном режиме

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

Для этого в нашем привилегированном общем модуле опишем функцию проверки токена и непосредственной перезаписи пароля:


Функция ВыполнитьСбросПароля(Знач Токен, Знач НовыйПароль) Экспорт
    
    УстановитьПривилегированныйРежим(Истина);
    
    // Ищем токен в регистре
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Запросы.Пользователь КАК Пользователь,
        |   Запросы.ДатаСоздания КАК ДатаСоздания,
        |   Запросы.Использован КАК Использован,
        |   Запросы.Пользователь.ИмяПользователяИБ КАК ИмяПользователяИБ
        |ИЗ
        |   РегистрСведений.ЗапросыНаВосстановлениеПароля КАК Запросы
        |ГДЕ
        |   Запросы.Токен = &Токен";
        
    Запрос.УстановитьПараметр("Токен", Токен);
    Результат = Запрос.Выполнить();
    
    Если Результат.Пустой() Тогда
        Возврат "Неверный код подтверждения!";
    КонецЕсли;
    
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    
    // Проверяем, не использовался ли токен ранее
    Если Выборка.Использован Тогда
        Возврат "Данный код уже был использован!";
    КонецЕсли;
    
    // Проверяем актуальность токена (время жизни - 15 минут)
    Если (ТекущаяДата() - Выборка.ДатаСоздания) > 900 Тогда
        Возврат "Срок действия кода подтверждения истек!";
    КонецЕсли;
    
    // Изменяем пароль пользователя информационной базы
    ИмяПользователяИБ = Выборка.ИмяПользователяИБ;
    ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователяИБ);
    
    Если ПользовательИБ = Неопределено Тогда
        Возврат "Пользователь информационной базы не найден!";
    КонецЕсли;
    
    Попытка
        ПользовательИБ.Пароль = НовыйПароль;
        ПользовательИБ.Записать();
    Исключение
        Возврат "Не удалось установить новый пароль: " + ОписаниеОшибки();
    КонецПопытки;
    
    // Помечаем токен как использованный
    МенеджерЗаписи = РегистрыСведений.ЗапросыНаВосстановлениеПароля.СоздатьМенеджерЗаписи();
    МенеджерЗаписи.Токен = Токен;
    МенеджерЗаписи.Прочитать();
    Если МенеджерЗаписи.Выбран() Тогда
        МенеджерЗаписи.Использован = Истина;
        МенеджерЗаписи.Записать();
    КонецЕсли;
    
    Возврат "Пароль успешно изменен!";
    
КонецФункции

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

Мы детально рассмотрели ключевые варианты реализации восстановления паролей в 1С. Для простых и средних проектов оптимальным решением станет использование встроенных настроек аутентификации платформы 1С 8.3.15+. Если же проект требует сложной кастомизации под личный кабинет, теперь вы знаете, как быстро и безопасно запрограммировать собственный функционал с помощью привилегированного режима.

← На главную