Америку открывать никому не собираюсь, но как это ни странно, после получаса блуждания по просторам интернета я так и не нашёл конкретного описания, как можно сравнить введённый пароль с паролем текущего пользователя без его модификации (как это, например, реализовано в публикации 102655).
На деле всё оказалось довольно просто. В справке к свойству СохраняемоеЗначениеПароля объекта типа ПользовательИнформационнойБазы написано:
Содержит хранимые значения пароля (хеш-функции) и хранимые значения пароля в верхнем регистре (хеш-функции) разделенные запятой.
Только не указано, какие конкретно для этого используются хэш-функции. Для значения пароля "Привет" свойство содержит строку "KAWujn4S8YITX5L7kIQ7sQgNO+g=,c9a04UjoS/W0iLeU7GUa9/Ltd1E=".
Немного покопавшись в "сети", можно найти такую формулировку "sha-1, обёрнутый в base64". Складывая всё вместе, выводим следующий алгоритм:
Функция ПолучитьХешПароля(Пароль) Экспорт
Хеш = Новый ХешированиеДанных(ХешФункция.SHA1);
Хеш.Добавить(Пароль);
Возврат Base64Строка(Хеш.ХешСумма);
КонецФункции
Проверяем на нашем пароле "Привет" и убеждаемся, что получившееся значение действительно совпадает с левой частью из сохраненного хеша.
Дальше с помощью функции получаем текущее значение свойства СохраняемоеЗначениеПароля, не забывая установить привилегированный режим (т.к. "доступно только пользователю с административными правами"), декомпозируем его на регистрозависимую (слева от запятой) и регистронезависимую (справа) части и сравниваем полученные значения.
Функция ПроверитьТекущийПарольПользователя(Пароль, РегистроНезависимый=Истина) Экспорт
УстановитьПривилегированныйРежим(Истина);
ХешТекущегоПароля = ПользователиИнформационнойБазы.ТекущийПользователь().СохраняемоеЗначениеПароля;
УстановитьПривилегированныйРежим(Ложь);
Если ХешТекущегоПароля = Пароль Тогда Возврат Истина КонецЕсли; // Пароль совпадает с СохраняемоеЗначениеПароля только в случае пустого значения
ПозицияРазделителя = Найти(ХешТекущегоПароля, ",");
Результат = Ложь;
Если РегистроНезависимый Тогда
Результат = ПолучитьХешПароля(ВРег(Пароль)) = Прав(ХешТекущегоПароля, СтрДлина(ХешТекущегоПароля) - ПозицияРазделителя);
Иначе
Результат = ПолучитьХешПароля(Пароль) = Лев(ХешТекущегоПароля, ПозицияРазделителя - 1);
КонецЕсли;
Возврат Результат;
КонецФункции
Вуаля! Ну, и на последок приведу еще функцию, формирующую значение свойства СохраняемоеЗначениеПароля из введенного пароля.
Функция ПолучитьСохраняемоеЗначение(Пароль) Экспорт
Возврат ?(ЗначениеЗаполнено(Пароль),ПолучитьХешПароля(Пароль) + "," + ПолучитьХешПароля(ВРег(Пароль),"");
КонецФункции