В практике разработки на платформе 1С часто возникает специфическая задача: необходимо подтвердить права конкретного сотрудника на выполнение ответственного действия в рамках уже открытого сеанса другого пользователя. Типичный пример — рабочий цех, где под одной учетной записью «Терминал» запущена обработка фиксации выпуска продукции. Если рядовой сотрудник хочет изменить состав бригады, система должна потребовать пароль начальника смены, при этом не закрывая общую обработку и не требуя перевхода в программу. Рассмотрим, как решить эту задачу различными способами — от классического хеширования до современных встроенных методов платформы.
Представим рабочее место в производственном цехе. Сеанс 1С запущен под «техническим» пользователем. В открытой обработке работают сотрудники, имен которых нет в списке пользователей информационной базы. Однако начальник бригады — это полноценный пользователь системы с заданными правами. Нам нужно реализовать механизм, при котором нажатие кнопки «Изменить состав» вызывает диалоговое окно для ввода логина и пароля начальника. Если данные верны — действие разрешается. Важный нюанс: нам нужно только проверить подлинность данных, не меняя текущего ПараметрыСеанса.ТекущийПользователь.
Начиная с версии платформы 8.3.15, разработчики получили мощный и безопасный инструмент, который избавляет от необходимости вручную вычислять хеши. Речь идет о методе ИнформационнаяБаза.ПроверитьПарольПользователя(). Проанализируем его преимущества: он автоматически учитывает настройки безопасности, такие как «соль» (salt) в паролях и современные алгоритмы хеширования (SHA-256), которые могут использоваться в последних релизах.
Для реализации этого метода нам понадобится создать простую экранную форму для ввода логина и пароля. После ввода данных выполним проверку на сервере:
&НаСервере
Функция ПроверитьВведенныеДанныеНаСервере(ИмяПользователя, Пароль)
// Метод возвращает Истина, если пара логин/пароль верна
Попытка
Результат = ИнформационнаяБаза.ПроверитьПарольПользователя(ИмяПользователя, Пароль);
Возврат Результат;
Исключение
// Обработка исключения, если пользователь не найден
Возврат Ложь;
КонецПопытки;
КонецФункции
Этот способ является наиболее предпочтительным, так как он не требует использования привилегированного режима и прямого доступа к системным таблицам паролей.
Рассмотрим ситуацию, когда по каким-то причинам штатный метод недоступен или требуется реализовать собственную логику сравнения. В платформе 1С пароли хранятся в виде хеш-сумм. Долгое время стандартом был алгоритм SHA1. Разберем по шагам, как можно программно проверить пароль, обратившись к объекту ПользовательИнформационнойБазы.
Для этого нам понадобится функция получения хеша и сопоставления его с данными в ИБ. Обратите внимание, что доступ к свойству СохраняемоеЗначениеПароля возможен только в привилегированном режиме.
&НаСервере
Функция ПроверитьПарольНачальника(ВыбранныйПользовательСсылка, ВведенныйПароль)
// Получаем объект пользователя ИБ через его идентификатор
ИдентификаторИБ = ВыбранныйПользовательСсылка.ИдентификаторПользователяИБ;
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ИдентификаторИБ);
Если ПользовательИБ = Неопределено Тогда
Возврат Ложь;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
ХешТекущегоПароля = ПользовательИБ.СохраняемоеЗначениеПароля;
УстановитьПривилегированныйРежим(Ложь);
// Если в базе пароль пустой
Если ПустаяСтрока(ХешТекущегоПароля) И ПустаяСтрока(ВведенныйПароль) Тогда
Возврат Истина;
КонецЕсли;
// Стандартный формат СохраняемоеЗначениеПароля в 1С (до усиления безопасности):
// ХешОбычный + "," + ХешВВерхнемРегистре
ПозицияРазделителя = Найти(ХешТекущегоПароля, ",");
// Вычисляем хеш введенного пароля
ХешВведенного = ПолучитьХешСтроки(ВведенныйПароль);
ХешВведенногоВРег = ПолучитьХешСтроки(ВРег(ВведенныйПароль));
// Сравниваем с частями из базы
Если ПозицияРазделителя > 0 Тогда
ЧастьОбычная = Лев(ХешТекущегоПароля, ПозицияРазделителя - 1);
ЧастьВРег = Прав(ХешТекущегоПароля, СтрДлина(ХешТекущегоПароля) - ПозицияРазделителя);
Возврат (ХешВведенного = ЧастьОбычная) Или (ХешВведенногоВРег = ЧастьВРег);
КонецЕсли;
Возврат Ложь;
КонецФункции
&НаСервере
Функция ПолучитьХешСтроки(Значение)
ХешОбъект = Новый ХешированиеДанных(ХешФункция.SHA1);
ХешОбъект.Добавить(Значение);
Возврат Base64Строка(ХешОбъект.ХешСумма);
КонецФункции
Важное предупреждение: Данный метод (SHA1) может не сработать в современных конфигурациях, если включена опция «Повышенная безопасность паролей». В этом случае 1С использует более сложные алгоритмы с добавлением уникальной «соли» для каждого пользователя, и простое хеширование строки не совпадет с системным значением. В таких ситуациях использование ИнформационнаяБаза.ПроверитьПарольПользователя() становится обязательным.
Поскольку 1С:ERP построена на базе БСП, мы можем воспользоваться готовыми программными интерфейсами этой библиотеки. В модуле Пользователи (или ПользователиСлужебный) часто реализованы функции для валидации паролей, которые учитывают не только сам факт совпадения строк, но и дополнительные условия: не заблокирован ли пользователь, разрешен ли ему вход в программу и т.д.
Пример логики с использованием БСП может выглядеть так:
Пользователи.Проанализируем условия работы: цех, рабочая бригада. Ввод текстового пароля на клавиатуре в таких условиях может быть неудобен и небезопасен (пароль легко подсмотреть). Профессиональным решением для таких задач в 1С:ERP является использование персональных карт сотрудников (RFID или штрихкоды).
Алгоритм реализации:
Физические лица или Сотрудники привязывается штрихкод карты.Это значительно ускоряет работу и повышает уровень дисциплины в цехе.
Выясним причину, почему стоит выбрать тот или иной метод. Если ваша версия платформы выше 8.3.15, всегда используйте ИнформационнаяБаза.ПроверитьПарольПользователя(). Это максимально надежно, безопасно и поддерживает любые изменения в алгоритмах шифрования 1С.
Разберем основные моменты, которые нужно помнить при реализации:
УстановитьПривилегированныйРежим(Истина). Если вы все же используете его для чтения хешей, убедитесь, что в функцию невозможно передать произвольные параметры извне, чтобы исключить риск подбора паролей.Таким образом, мы рассмотрели различные подходы к реализации дополнительной аутентификации, которые позволяют гибко управлять правами доступа внутри одного сеанса 1С.