1 2 3 4 5 6 7 8 9 10 |
Функция ПолучитьРодителя(СправочникСсылка) Пока НЕ СправочникСсылка.Родитель.Пустая() Цикл СправочникСсылка = СправочникСсылка.Родитель; КонецЦикла; Возврат СправочникСсылка; КонецФункции |
Архив метки: 1с
1С: проверка пароля пользователя
Задача: проверить соответствие имени пользователю, введённый им пароль. Пользователи хранятся в стандартном справочнике «Пользователи»
Решение: в 1С нет штатных методов проверки пароля, т.к. пароль как таковой не хранится, а хранится его хэш. Следовательно для того чтобы проверить введенный пароль, необходимо сравнить «старый» хэш с хэшэм введеного пароля. Но есть нюанс — никто не знает по какому алгоритму генерируется хэш при сохранении пароля. Следовательно подходит лишь один алгоритм:
- Получаем хэш текущего пароля
- Начинаем транзакцию
- Сохраняем введеный пароль пароль у пользователя
- Получаем хэш введенного пароля
- Отменяем транзакцию (тем самым отменяем изменения у пользователя)
- Сравниваем первый хэш со вторым. Если равны — значит пароль соответствует.
Воплощение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// Функция по входящим body.login и body.password выдает или error=true // или возращает полное имя, уникальный идентификатор и список доступных для проведения инвентаризации документов Функция Auth(body) answer = Новый Структура("error, result",false,""); ПользовательИнформационнойБазы = ПользователиИнформационнойБазы.НайтиПоИмени(body.login); Если ПользовательИнформационнойБазы = Неопределено Тогда answer.error=true; answer.result="Пользователь не найден в БД"; возврат answer; Иначе ХэшНастоящегоПароля = ПользовательИнформационнойБазы.СохраняемоеЗначениеПароля; НачатьТранзакцию(); ПользовательИнформационнойБазы.Пароль = body.password; ПользовательИнформационнойБазы.Записать(); ХешВведенногоПароля = ПользователиИнформационнойБазы.НайтиПоИмени(body.login).СохраняемоеЗначениеПароля; ОтменитьТранзакцию(); Если ХешВведенногоПароля = ХэшНастоящегоПароля Тогда answer.error=false; answer.result=Новый Структура("UserName,UserId,MyInvent",ПользовательИнформационнойБазы.ПолноеИмя,ПользовательИнформационнойБазы.УникальныйИдентификатор,Новый Массив()); Иначе answer.error=true; answer.result="Не верный пароль пользователя"; возврат answer; КонецЕсли; конецесли; возврат answer; КонецФункции |
1С: Узнать позицию в цикле
Задача: узнать текущую позицию для цикла вида
1 2 |
для каждого стр_расчеты из КадастроваяСтоимость цикл конеццикла |
Решение: учить матчасть (с)
1 2 3 |
для каждого стр_расчеты из КадастроваяСтоимость цикл поз=КадастроваяСтоимость.Индекс(стр_расчеты); конеццикла |
1с временная таблица уже существует
Сия ошибка оказывается может возникать и при банальном присутствии в табло отладчика записи вида:
1 |
Запрос.Выполнить() |
😉 Минут 20 копья ломал пока выяснил в чем проблема
1С:Проверка блокировки документа перед его изменением
Ошибка: в высоко нагруженном приложении с бекендом на 1С, возникают ситуации с одновременным изменением части данных одного из документов. Соответственно возникала ошибка
1 |
Операция не может быть выполнена из-за несоответствия версии или отсутствия записи базы данных (возможно, запись была изменена или удалена)! |
Решение: перед изменением документа, ждем его разблокировки:
1 2 3 4 5 6 |
оЭЗС = кккк.ПолучитьОбъект(); пока кккк.Заблокирован() цикл конеццикла; кккк.Прочитать(); кккк.Заблокировать(); |