Инструкция:
1. Нужно выбрать папку, для элементов которой надо установить пароли.
2. Выбрать, будет ли пароль генерироваться или использоваться для установки номер паспорта физлица.
При опции генерации:
3. Выставить длину пароля.
4. Выбрать символы, которые будут использоваться для генерации.
По умолчанию они уже заполнены (буквы O,o,l,I убраны по умолчанию, дабы не путать их с нулем и единицей, а также л-латинскую с И-латинской).
Если нужно использовать, например, только цифры, то все остальные символы в полях нужно стереть (и флажки ниже для проверки кроме "Цифры проверять наличие" снять).
5. Установить или снять флажки обязательного наличия нужных символов.
6. Нажать кнопку "Сгенерировать пароли для рассылки РЛ"
По окончанию кроме генерации и установки паролей сформируется печатная форма со списком всех элементов и установленных для них паролей.
Протестировано на ЗУП КОРП 3.1.27.23 и версиях ниже (см. Примечание 1).
(Платформа 1С:Предприятие 8.3 (8.3.22.1923) и ниже)
Примечание 1:
После обновления ЗУП на релиз 3.1.27.23 изменяется хранение паролей в регистре сведений БезопасноеХранилищеДанных:
до этого релиза в качестве Владельца записывалась сама ссылка справочника Рассылка отчетов. Теперь - ссылка справочника Физическое лицо.
А также в справочник Рассылка отчетов добавился реквизит УстановитьПаролиЗашифровать.
Обработка изначально писалась для рассылки расчетных листков еще до релиза ЗУП 3.1.27.23, когда пароль хранился для всего элемента справочника Рассылка отчетов. То есть подразумевалось, что для каждого сотрудника создавался отдельный элемент справочника Рассылка отчетов с отдельным паролем.
Тогда в логике использовался для установки пароля первый пользователь из ТЧ Получатели.
Поэтому обработку легко исправить для применения на релизе ЗУП ниже 3.1.27.23.
Для этого нужно изменить код в функции СгенерироватьПаролиДляРассылкиРЛНаСервере()
с:
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
РассылкаСсылка = ВыборкаДетальныеЗаписи.Ссылка;
//Получатель = РассылкаСсылка.Получатели[0].Получатель; //до версии ЗУП 3.1.27.23 - один пароль на всю рассылку устанавливался
//с версии ЗУП 3.1.27.23 пароль храниться по физическим лицам в измерении Владелец РС БезопасноеХранилищеДанных, ранее Владелец - ссылка справочника Рассылка отчетов
Для каждого СтрокаТЧ Из РассылкаСсылка.Получатели Цикл
Если НЕ СтрокаТЧ.Исключен Тогда
Получатель = СтрокаТЧ.Получатель;
ПарольАрхива = ?(Объект.УстановитьНомерПаспорта, ПолучитьНомерПаспортаФизЛица(Получатель), СоздатьПароль(ПараметрыПароля())); //ПользователиСлужебный.СоздатьПароль(ПараметрыПароля());
УстановитьПривилегированныйРежим(Истина);
ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(Получатель, ПарольАрхива, "ПарольАрхива"); //было РассылкаСсылка вместо Получатель
УстановитьПривилегированныйРежим(Ложь);
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ОбластьДетальныхЗаписей.Параметры.ПарольАрхива = ПарольАрхива;
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
КонецЕсли;
КонецЦикла;
РассылкаОбъект = РассылкаСсылка.ПолучитьОбъект();
РассылкаОбъект.УстановитьПаролиЗашифровать = Истина;
РассылкаОбъект.Записать();
КонецЦикла;
на:
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
РассылкаСсылка = ВыборкаДетальныеЗаписи.Ссылка;
Получатель = РассылкаСсылка.Получатели[0].Получатель; //один пароль на всю рассылку, один пользователь в рассылке
ПарольАрхива = ?(Объект.УстановитьНомерПаспорта, ПолучитьНомерПаспортаФизЛица(Получатель), СоздатьПароль(ПараметрыПароля())); //ПользователиСлужебный.СоздатьПароль(ПараметрыПароля());
УстановитьПривилегированныйРежим(Истина);
ОбщегоНазначения.ЗаписатьДанныеВБезопасноеХранилище(РассылкаСсылка, ПарольАрхива, "ПарольАрхива"); //заменили на РассылкаСсылка вместо Получатель
УстановитьПривилегированныйРежим(Ложь);
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ОбластьДетальныхЗаписей.Параметры.ПарольАрхива = ПарольАрхива;
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
КонецЦикла;
Примечание 2:
Функция СоздатьПароль(ПараметрыПароля, ГСЧ = Неопределено) Экспорт
- это немного видоизмененная типовая функция из общего модуля ПользователиСлужебный.СоздатьПароль(ПараметрыПароля()).
Если использовать типовую функцию, то в ней происходит зацикливание при некоторых условиях.
Разработчики это до сих пор не поправили, письмо с сообщением об ошибке когда-то давно проигнорили.
ПользователиСлужебный.СоздатьПароль(ПараметрыПароля())
при формирования пароля только из цифр или спецсимволов процедура уходит в бесконечный цикл.
Рабочий вариант:
(перенесены УстановитьЦифру = (ГСЧ.СлучайноеЧисло(0, 1) = 1); И УстановитьСпецСимвол = (ГСЧ.СлучайноеЧисло(0, 1) = 1);
до условий Если ИспользоватьЦифры И УстановитьЦифру Тогда И Если ИспользоватьСпецСимволы И УстановитьСпецСимвол Тогда.
Иначе если внутри условия Если… эти переменные примут значение Ложь, то при следующем шаге цикла в это условие никогда не будет захода. И цифры/спецсимволы дальше добавляться в пароль не будут, и если не будет достигнута конечная длина пароля цикл будут крутиться бесконечно)
Функция СоздатьПароль(ПараметрыПароля, ГСЧ = Неопределено) Экспорт
НовыйПароль = "";
СогласныеСтрочные = ПараметрыПароля.СогласныеБуквыСтрочные;
СогласныеЗаглавные = ПараметрыПароля.СогласныеБуквыЗаглавные;
КоличествоСогласныхСтрочных = СтрДлина(СогласныеСтрочные);
КоличествоСогласныхЗаглавных = СтрДлина(СогласныеЗаглавные);
ИспользоватьСогласные = (КоличествоСогласныхСтрочных > 0)
ИЛИ (КоличествоСогласныхЗаглавных > 0);
ГласныеСтрочные = ПараметрыПароля.ГласныеБуквыСтрочные;
ГласныеЗаглавные = ПараметрыПароля.ГласныеБуквыЗаглавные;
КоличествоГласныхСтрочных = СтрДлина(ГласныеСтрочные);
КоличествоГласныхЗаглавных = СтрДлина(ГласныеЗаглавные);
ИспользоватьГласные = (КоличествоГласныхСтрочных > 0)
ИЛИ (КоличествоГласныхЗаглавных > 0);
Цифры = ПараметрыПароля.Цифры;
КоличествоЦифр = СтрДлина(Цифры);
ИспользоватьЦифры = (КоличествоЦифр > 0);
СпецСимволы = ПараметрыПароля.СпецСимволы;
КоличествоСпецСимволов = СтрДлина(СпецСимволы);
ИспользоватьСпецСимволы = (КоличествоСпецСимволов > 0);
// Создание генератора случайных чисел.
Если ГСЧ = Неопределено Тогда
ГСЧ = Новый ГенераторСлучайныхЧисел();
КонецЕсли;
Счетчик = 0;
МаксимальнаяДлина = ПараметрыПароля.МаксимальнаяДлина;
МинимальнаяДлина = ПараметрыПароля.МинимальнаяДлина;
// Определение позиции спец. символов и цифр.
Если ПараметрыПароля.ПроверятьУсловияСложности Тогда
УстановитьСтрочную = ПараметрыПароля.СтрочныеБуквыПроверятьНаличие;
УстановитьЗаглавную = ПараметрыПароля.ЗаглавныеБуквыПроверятьНаличие;
УстановитьЦифру = ПараметрыПароля.ЦифрыПроверятьНаличие;
УстановитьСпецСимвол = ПараметрыПароля.СпецСимволыПроверятьНаличие;
Иначе
УстановитьСтрочную = (КоличествоГласныхСтрочных > 0)
ИЛИ (КоличествоСогласныхСтрочных > 0);
УстановитьЗаглавную = (КоличествоГласныхЗаглавных > 0)
ИЛИ (КоличествоСогласныхЗаглавных > 0);
УстановитьЦифру = ИспользоватьЦифры;
УстановитьСпецСимвол = ИспользоватьСпецСимволы;
КонецЕсли;
Пока Счетчик < МаксимальнаяДлина Цикл
// Начало с согласной буквы.
Если ИспользоватьСогласные Тогда
Если УстановитьЗаглавную И УстановитьСтрочную Тогда
СтрокаПоиска = СогласныеСтрочные + СогласныеЗаглавные;
ВерхняяГраница = КоличествоСогласныхСтрочных + КоличествоСогласныхЗаглавных;
ИначеЕсли УстановитьЗаглавную Тогда
СтрокаПоиска = СогласныеЗаглавные;
ВерхняяГраница = КоличествоСогласныхЗаглавных;
Иначе
СтрокаПоиска = СогласныеСтрочные;
ВерхняяГраница = КоличествоСогласныхСтрочных;
КонецЕсли;
Если ПустаяСтрока(СтрокаПоиска) Тогда
СтрокаПоиска = СогласныеСтрочные + СогласныеЗаглавные;
ВерхняяГраница = КоличествоСогласныхСтрочных + КоличествоСогласныхЗаглавных;
КонецЕсли;
Символ = Сред(СтрокаПоиска, ГСЧ.СлучайноеЧисло(1, ВерхняяГраница), 1);
Если Символ = ВРЕГ(Символ) Тогда
Если УстановитьЗаглавную Тогда
УстановитьЗаглавную = (ГСЧ.СлучайноеЧисло(0, 1) = 1);
КонецЕсли;
Иначе
УстановитьСтрочную = Ложь;
КонецЕсли;
НовыйПароль = НовыйПароль + Символ;
Счетчик = Счетчик + 1;
Если Счетчик >= МинимальнаяДлина Тогда
Прервать;
КонецЕсли;
КонецЕсли;
// Добавление гласных.
Если ИспользоватьГласные Тогда
Если УстановитьЗаглавную И УстановитьСтрочную Тогда
СтрокаПоиска = ГласныеСтрочные + ГласныеЗаглавные;
ВерхняяГраница = КоличествоГласныхСтрочных + КоличествоГласныхЗаглавных;
ИначеЕсли УстановитьЗаглавную Тогда
СтрокаПоиска = ГласныеЗаглавные;
ВерхняяГраница = КоличествоГласныхЗаглавных;
Иначе
СтрокаПоиска = ГласныеСтрочные;
ВерхняяГраница = КоличествоГласныхСтрочных;
КонецЕсли;
Если ПустаяСтрока(СтрокаПоиска) Тогда
СтрокаПоиска = ГласныеСтрочные + ГласныеЗаглавные;
ВерхняяГраница = КоличествоГласныхСтрочных + КоличествоГласныхЗаглавных;
КонецЕсли;
Символ = Сред(СтрокаПоиска, ГСЧ.СлучайноеЧисло(1, ВерхняяГраница), 1);
Если Символ = ВРЕГ(Символ) Тогда
УстановитьЗаглавную = Ложь;
Иначе
УстановитьСтрочную = Ложь;
КонецЕсли;
НовыйПароль = НовыйПароль + Символ;
Счетчик = Счетчик + 1;
Если Счетчик >= МинимальнаяДлина Тогда
Прервать;
КонецЕсли;
КонецЕсли;
// Добавление цифр.
УстановитьЦифру = (ГСЧ.СлучайноеЧисло(0, 1) = 1);
Если ИспользоватьЦифры И УстановитьЦифру Тогда
Символ = Сред(Цифры, ГСЧ.СлучайноеЧисло(1, КоличествоЦифр), 1);
НовыйПароль = НовыйПароль + Символ;
Счетчик = Счетчик + 1;
Если Счетчик >= МинимальнаяДлина Тогда
Прервать;
КонецЕсли;
КонецЕсли;
// Добавление спец. символов.
УстановитьСпецСимвол = (ГСЧ.СлучайноеЧисло(0, 1) = 1);
Если ИспользоватьСпецСимволы И УстановитьСпецСимвол Тогда
Символ = Сред(СпецСимволы, ГСЧ.СлучайноеЧисло(1, КоличествоСпецСимволов), 1);
НовыйПароль = НовыйПароль + Символ;
Счетчик = Счетчик + 1;
Если Счетчик >= МинимальнаяДлина Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат НовыйПароль;
КонецФункции