МенеджерДополнительныхНастроекАутентификации.ПолучитьНастройкиПроверкиРаскрытияПароля

Методы · GetPasswordCompromiseCheckSettings

Получает настройки проверки раскрытия паролей пользователей информационной базы.

Синтаксис

ПолучитьНастройкиПроверкиРаскрытияПароля()
Полное описание, параметры и ограничения

МенеджерДополнительныхНастроекАутентификации.ПолучитьНастройкиПроверкиРаскрытияПароля (AdditionalAuthenticationSettingsManager.GetPasswordCompromiseCheckSettings)

МенеджерДополнительныхНастроекАутентификации (AdditionalAuthenticationSettingsManager)

ПолучитьНастройкиПроверкиРаскрытияПароля (GetPasswordCompromiseCheckSettings)

Доступен, начиная с версии 8.3.26.

Синтаксис:
ПолучитьНастройкиПроверкиРаскрытияПароля()
Возвращаемое значение:
Тип: НастройкиПроверкиРаскрытияПароля.

Описание:

Получает настройки проверки раскрытия паролей пользователей информационной базы.

Доступность:

Сервер, толстый клиент.

Использование в версии:

Доступен, начиная с версии 8.3.26.

Методическая информация

Практические примеры

Офлайн-guard: native Нет и фактический флаг сервиса до расчета

Реальные getters читают настройки почты/проверки раскрытия. Наш потребитель отказывается от опыта, если способ почты не Нет или включен сервис; сами механизмы не отключаются.

Где и как запускать

Полный server-only ОбщийМодуль АудитКаналов85; никакой отправки, проверки пароля или записи настроек.

Подготовка

  1. Опыт только для отдельной НОВОЙ собственной файловой ИБ, не для рабочей базы или ее копии с данными. Вручную создайте пустую ИБ по точному пути C:\1c-labs\OwnAuthPolicy85_16364087-5f69-4df1-885d-2fa55cfb864f\IB и откройте ее Конфигуратором 8.5.1.1343. Код проверяет именно File-строку, а не только имя конфигурации. Этот каталог и ИБ агент не создавал.

  2. У корня конфигурации задайте Имя=УчебнаяПолитикаВхода85, РежимСовместимости=НеИспользовать, ОсновнойРежимЗапуска=УправляемоеПриложение. Прикладные справочники/документы/регистры/планы/константы/обработки/отчеты, HTTP/Web-сервисы, внешние источники, общие реквизиты, подписки и задания не добавляйте. Расширений базы и сеанса нет. Все это собственные ручные действия подготовки, не выполнение приведенного BSL.

  3. Роли → новая АудитВхода85: явно включите права конфигурации АдминистрированиеДанных, Администрирование, АктивныеПользователи и ТонкийКлиент; предоставьте использование/просмотр собственной общей формы. Администрирование нужно для ПолучитьПользователей и чтения Роли; оно требует АдминистрированиеДанных. АктивныеПользователи нужно для ПолучитьСоединенияИнформационнойБазы. Это привилегии только своего изолированного лабораторного администратора, НЕ рекомендация прав обычному пользователю рабочей ИБ.

  4. Администрирование → Пользователи: вручную заведите только AuthAudit85Ученик и назначьте только АудитВхода85. Пароль выбирает человек; не помещайте его в код, отчет, командную строку или файл. Настройте собственный локальный стандартный вход вручную. Наличие семи native значений не означает, что все семь способов включены. Для дальнейшего чтения нужен именно этот единственный пользователь и только один сеанс.

  5. ОбщиеМодули: создайте ровно АудитМетодов85, АудитСохранения85, АудитКаналов85. Для КАЖДОГО: ГлобальныйНет, СерверДа, ВызовСервераДа, КлиентОбычноеПриложениеНет, КлиентУправляемоеПриложениеНет, ВнешнееСоединениеНет, ПривилегированныйНет, ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать. В АудитМетодов85 вставьте METHOD, в АудитСохранения85 AUTO, в АудитКаналов85 CHANNEL целиком. Сервер сравнивает metadata enums через Метаданные.СвойстваОбъектов. Флаг кеширования проверяется только ПОСЛЕ отказа глобальному модулю; менять флаги программно не требуется.

  6. ОбщиеФормы → новая управляемая АудитВхода85: единственный собственный реквизит Отчет85, Строка10000. Разместите многострочное поле с Данные=Отчет85 и ТолькоПросмотрДа. Создайте команду Сверить85 и кнопку с этой командой. Вставьте FORM целиком. Назначьте настоящие события ПриСозданииНаСервере → ПриСозданииНаСервере(2), ПриОткрытии → ПриОткрытии(1); действие команды → Сверить85(1). Обработчики событий не вызываются вручную, общие модули не получают UI-объекты.

  7. Конфигурация → Модуль управляемого приложения: вставьте APP целиком и свяжите настоящее ПриНачалеРаботыСистемы(0). Обновите только свою конфигурацию базы данных, закройте Конфигуратор и другие соединения. Запустите собственную ИБ тонким Windows-клиентом под AuthAudit85Ученик. Нативные менеджер/объекты настроек/перечисления/ТаблицаЗначений остаются на сервере; через RPC возвращаются только три Числа и Строка.

  8. Физически изолируйте свою новую лабораторную среду до запуска опыта. Код НЕ доказывает отключение сети. Он дополнительно читает фактический способ почты и флаг сервисной проверки: нужны именно Нет и Ложь. Любое другое значение останавливает наш потребитель, а не выключает сервис или аутентификацию. Не исправляйте настройки рабочей ИБ ради прохождения guard.

  9. Числа 1,2,3,4,5,6,7 — только придуманные количества ПРЕДЛОЖЕННЫХ запросов для семи native enum значений. В коде потребитель принимает лишь АутентификацияСтандартная. Ожидаемые 7 строк, 28 всего, 5 принятых и 23 отклоненных — арифметика собственного офлайн-плана, НЕ аутентифицированные сеансы, настройка безопасности или рекомендация запрещать остальные способы.

  10. РазрешитьСохранение/СохранятьПоУмолчанию читаются фактически и определяют отдельные пояснения отчета. Исходное число ВремяЖизниСохраненнойАутентификации отображается без единицы, диапазона и трактовки нуля: installed справка этого не сообщает. Нет предположения о значениях по умолчанию этих трех полей и нет обещания вычисленного срока истечения.

  11. Ни в одном модуле нет Set*, записи пользователей/настроек, проверки пароля, входа, чтения списков паролей/хешей, SMTP-адреса/пароля/токена, письма, HTTP или журналирования. Сравниваются только явно перечисленные три scalar поля сохранения и четыре безопасных scalar результата каналов; это НЕ полный снимок секретных/внутренних настроек, всей ИБ или доказательство отсутствия конкурентного изменения.

Функция Снимок85() Экспорт
    АудитСохранения85.ПроверитьСвоюИБ85();
    Проверка = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиПроверкиРаскрытияПароля();
    Почта = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиАутентификацииЧерезЭлектроннуюПочту();
    Если ТипЗнч(Проверка) <> Тип("НастройкиПроверкиРаскрытияПароля")
        Или ТипЗнч(Почта) <> Тип("НастройкиАутентификацииЧерезЭлектроннуюПочту") Тогда
        ВызватьИсключение "Ожидались два настоящих объекта из штатных getters";
    КонецЕсли;
    Если ТипЗнч(Проверка.ИспользоватьСервисПроверкиРаскрытияПароля) <> Тип("Булево")
        Или ТипЗнч(Проверка.ИспользоватьЗаданныйСписокПроверкиРаскрытияПароля) <> Тип("Булево")
        Или ТипЗнч(Проверка.ИспользоватьСтандартныйСписокПроверкиРаскрытияПароля) <> Тип("Булево")
        Или ТипЗнч(Почта.СпособАутентификацииЧерезЭлектроннуюПочту) <> Тип("СпособАутентификацииЧерезЭлектроннуюПочту") Тогда
        ВызватьИсключение "Флаги и способ почтовой аутентификации имеют неожиданный тип";
    КонецЕсли;
    Если Почта.СпособАутентификацииЧерезЭлектроннуюПочту <> СпособАутентификацииЧерезЭлектроннуюПочту.Нет
        Или Проверка.ИспользоватьСервисПроверкиРаскрытияПароля Тогда
        ВызватьИсключение "Офлайн-предпосылки не совпали: не меняйте настройки ради этого примера";
    КонецЕсли;
    Возврат Новый Структура("Сервис,ЗаданныйСписок,СтандартныйСписок,ПочтаНет",
        Проверка.ИспользоватьСервисПроверкиРаскрытияПароля,
        Проверка.ИспользоватьЗаданныйСписокПроверкиРаскрытияПароля,
        Проверка.ИспользоватьСтандартныйСписокПроверкиРаскрытияПароля,
        Почта.СпособАутентификацииЧерезЭлектроннуюПочту = СпособАутентификацииЧерезЭлектроннуюПочту.Нет);
КонецФункции
Полный серверный расчет собственного семистрочного плана

ОбщиеМодули → АудитМетодов85 → Модуль целиком

СерверДа/ВызовСервераДа, оба клиентаНет. Native enum/TV не передаются клиенту.

Функция Построить85() Экспорт
    АудитСохранения85.ПроверитьСвоюИБ85();
    КаналыДо = АудитКаналов85.Снимок85();
    СохранениеДо = АудитСохранения85.Снимок85();
    Способы = Новый Массив;
    Способы.Добавить(СпособАутентификацииПользователяИнформационнойБазы.АутентификацияOpenID);
    Способы.Добавить(СпособАутентификацииПользователяИнформационнойБазы.АутентификацияOpenIDConnect);
    Способы.Добавить(СпособАутентификацииПользователяИнформационнойБазы.АутентификацияQRКодом);
    Способы.Добавить(СпособАутентификацииПользователяИнформационнойБазы.АутентификацияОС);
    Способы.Добавить(СпособАутентификацииПользователяИнформационнойБазы.АутентификацияСтандартная);
    Способы.Добавить(СпособАутентификацииПользователяИнформационнойБазы.АутентификацияТокеномДоступа);
    Способы.Добавить(СпособАутентификацииПользователяИнформационнойБазы.АутентификацияЧерезЭлектроннуюПочту);
    Если Способы.Количество() <> 7 Тогда
        ВызватьИсключение "Нужна полная собственная матрица семи способов";
    КонецЕсли;
    Матрица = Новый ТаблицаЗначений;
    Матрица.Колонки.Добавить("Способ", Новый ОписаниеТипов("СпособАутентификацииПользователяИнформационнойБазы"));
    Матрица.Колонки.Добавить("Заявок", Новый ОписаниеТипов("Число"));
    Матрица.Колонки.Добавить("ПринятоПотребителем", Новый ОписаниеТипов("Булево"));
    Уже = Новый Массив;
    Для Индекс = 0 По 6 Цикл
        Способ = Способы[Индекс];
        Если ТипЗнч(Способ) <> Тип("СпособАутентификацииПользователяИнформационнойБазы") Или Уже.Найти(Способ) <> Неопределено Тогда
            ВызватьИсключение "Ненастоящий или повторный native способ";
        КонецЕсли;
        Уже.Добавить(Способ);
        СтрокаПлана = Матрица.Добавить();
        СтрокаПлана.Способ = Способ;
        СтрокаПлана.Заявок = Индекс + 1;
        СтрокаПлана.ПринятоПотребителем = Способ = СпособАутентификацииПользователяИнформационнойБазы.АутентификацияСтандартная;
    КонецЦикла;
    Если Матрица.Количество() <> 7 Или Матрица.Колонки.Количество() <> 3 Тогда
        ВызватьИсключение "Изменилась форма собственного плана";
    КонецЕсли;
    Всего = 0;
    Принято = 0;
    Отклонено = 0;
    Текст = "Собственный офлайн-потребитель, НЕ результат входа в 1С:";
    Для Индекс = 0 По 6 Цикл
        Р = Матрица[Индекс];
        Если ТипЗнч(Р.Способ) <> Тип("СпособАутентификацииПользователяИнформационнойБазы") Или Р.Способ <> Способы[Индекс]
            Или ТипЗнч(Р.Заявок) <> Тип("Число") Или Р.Заявок <> Индекс + 1
            Или ТипЗнч(Р.ПринятоПотребителем) <> Тип("Булево")
            Или Р.ПринятоПотребителем <> (Р.Способ = СпособАутентификацииПользователяИнформационнойБазы.АутентификацияСтандартная) Тогда
            ВызватьИсключение "Полный построчный readback не совпал с собственной матрицей";
        КонецЕсли;
        Всего = Всего + Р.Заявок;
        Если Р.ПринятоПотребителем Тогда
            Принято = Принято + Р.Заявок;
        Иначе
            Отклонено = Отклонено + Р.Заявок;
        КонецЕсли;
        Текст = Текст + Символы.ПС + Строка(Р.Способ) + ": " + Строка(Р.Заявок)
            + "; принято только нашим потребителем=" + Строка(Р.ПринятоПотребителем);
    КонецЦикла;
    Если Всего <> 28 Или Принято <> 5 Или Отклонено <> 23 Или Принято + Отклонено <> Всего Тогда
        ВызватьИсключение "Фактические учебные суммы не равны 28/5/23";
    КонецЕсли;
    СохранениеПосле = АудитСохранения85.Снимок85();
    КаналыПосле = АудитКаналов85.Снимок85();
    АудитСохранения85.Сверить85(СохранениеДо, СохранениеПосле, "Разрешено,ПоУмолчанию,NativeВремяЖизни");
    АудитСохранения85.Сверить85(КаналыДо, КаналыПосле, "Сервис,ЗаданныйСписок,СтандартныйСписок,ПочтаНет");
    Текст = Текст + Символы.ПС + "Всего=" + Строка(Всего) + "; принято=" + Строка(Принято) + "; отклонено=" + Строка(Отклонено);
    Текст = Текст + Символы.ПС + "Настройки сохранения, только фактическое чтение: разрешено=" + Строка(СохранениеПосле.Разрешено)
        + "; флаг по умолчанию=" + Строка(СохранениеПосле.ПоУмолчанию)
        + "; исходное native число времени жизни=" + Строка(СохранениеПосле.NativeВремяЖизни);
    Если СохранениеПосле.Разрешено Тогда
        Текст = Текст + Символы.ПС + "Платформа допускает сохранение по прочитанному флагу. Этот потребитель ничего не сохраняет.";
    Иначе
        Текст = Текст + Символы.ПС + "По прочитанному флагу сохранение не разрешено. Этот потребитель не изменяет данный запрет.";
    КонецЕсли;
    Если СохранениеПосле.ПоУмолчанию Тогда
        Текст = Текст + Символы.ПС + "Прочитан установленный флаг Запомнить по умолчанию; это НЕ доказательство уже сохраненной аутентификации.";
    Иначе
        Текст = Текст + Символы.ПС + "Прочитан снятый флаг Запомнить по умолчанию; сохраненные данные этот пример не исследует.";
    КонецЕсли;
    Текст = Текст + Символы.ПС + "Единица, диапазон и смысл нуля времени жизни здесь не определяются."
        + Символы.ПС + "Проверка пароля: сервис=" + Строка(КаналыПосле.Сервис)
        + "; заданный список=" + Строка(КаналыПосле.ЗаданныйСписок)
        + "; стандартный список=" + Строка(КаналыПосле.СтандартныйСписок)
        + "; способ почты Нет=" + Строка(КаналыПосле.ПочтаНет)
        + Символы.ПС + "Пароли, списки и успешность аутентификации НЕ проверялись.";
    Возврат Новый Структура("Всего,Принято,Отклонено,Текст", Всего, Принято, Отклонено, Текст);
КонецФункции
Полный серверный паспорт своей ИБ и трехполный снимок сохранения

ОбщиеМодули → АудитСохранения85 → Модуль целиком

Неглобальный непривилегированный серверный модуль без кеширования; реальные getters, не New настроек.

Процедура ПроверитьСвоюИБ85() Экспорт
    Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnAuthPolicy85_16364087-5f69-4df1-885d-2fa55cfb864f\IB"";" Тогда
        ВызватьИсключение "Только своя новая файловая ИБ по точному учебному пути";
    КонецЕсли;
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужны собственная конфигурация, платформа 8.5.1.1343 и отключенная совместимость";
    КонецЕсли;
    Если ПривилегированныйРежим() Или ТранзакцияАктивна() Тогда
        ВызватьИсключение "Опыт не использует привилегированный режим или чужую транзакцию";
    КонецЕсли;
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0
        Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0
        Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
        Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
        Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0
        Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0
        Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0
        Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0
        Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0
        Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Или Метаданные.HTTPСервисы.Количество() <> 0
        Или Метаданные.WebСервисы.Количество() <> 0 Или Метаданные.Обработки.Количество() <> 0
        Или Метаданные.Отчеты.Количество() <> 0 Тогда
        ВызватьИсключение "Нужна пустая прикладная модель без интеграций и заданий";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации()
        Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
        Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
        Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
        ВызватьИсключение "В своем стенде не должно быть расширений";
    КонецЕсли;
    Если Метаданные.ОбщиеМодули.Количество() <> 3 Или Метаданные.ОбщиеФормы.Количество() <> 1
        Или Метаданные.ОбщиеФормы.Найти("АудитВхода85") = Неопределено Или Метаданные.Роли.Количество() <> 1 Тогда
        ВызватьИсключение "Нужны только три собственных общих модуля, пульт и одна роль";
    КонецЕсли;
    Для Каждого ИмяМодуля Из СтрРазделить("АудитМетодов85,АудитСохранения85,АудитКаналов85", ",") Цикл
        Модуль = Метаданные.ОбщиеМодули.Найти(ИмяМодуля);
        Если Модуль = Неопределено Тогда
            ВызватьИсключение "Не найден собственный общий модуль";
        КонецЕсли;
        Если Модуль.Глобальный Или Не Модуль.Сервер Или Не Модуль.ВызовСервера
            Или Модуль.КлиентОбычноеПриложение Или Модуль.КлиентУправляемоеПриложение
            Или Модуль.ВнешнееСоединение Или Модуль.Привилегированный Тогда
            ВызватьИсключение "Модули должны быть только неглобальными непривилегированными серверными";
        КонецЕсли;
        Если Модуль.ПовторноеИспользованиеВозвращаемыхЗначений <> Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать Тогда
            ВызватьИсключение "Для неглобальных модулей кеширование возвращаемых значений отключено";
        КонецЕсли;
    КонецЦикла;
    Если Не ПравоДоступа("Администрирование", Метаданные)
        Или Не ПравоДоступа("АдминистрированиеДанных", Метаданные)
        Или Не ПравоДоступа("АктивныеПользователи", Метаданные) Тогда
        ВызватьИсключение "Только собственный учебный администратор с правом просмотра соединений";
    КонецЕсли;
    Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
    Если Пользователь = Неопределено Или ТипЗнч(Пользователь) <> Тип("ПользовательИнформационнойБазы") Тогда
        ВызватьИсключение "Нет настоящего текущего учебного пользователя";
    КонецЕсли;
    Если Пользователь.Имя <> "AuthAudit85Ученик" Тогда
        ВызватьИсключение "Отказ: другой пользователь";
    КонецЕсли;
    Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
    Если ТипЗнч(Пользователи) <> Тип("Массив") Или Пользователи.Количество() <> 1 Тогда
        ВызватьИсключение "В новой ИБ нужен ровно один собственный учебный пользователь";
    КонецЕсли;
    Единственный = Пользователи[0];
    Если ТипЗнч(Единственный) <> Тип("ПользовательИнформационнойБазы")
        Или Единственный.Имя <> Пользователь.Имя
        Или Единственный.УникальныйИдентификатор <> Пользователь.УникальныйИдентификатор Тогда
        ВызватьИсключение "Свежий пользователь не совпадает с собственным пользователем сеанса";
    КонецЕсли;
    СвояРоль = Метаданные.Роли.Найти("АудитВхода85");
    Если СвояРоль = Неопределено Или Не Единственный.Роли.Содержит(СвояРоль) Тогда
        ВызватьИсключение "Нет собственной учебной роли";
    КонецЕсли;
    ЧислоРолей = 0;
    Для Каждого РольПользователя Из Единственный.Роли Цикл
        Если РольПользователя <> СвояРоль Тогда
            ВызватьИсключение "Найдена чужая роль";
        КонецЕсли;
        ЧислоРолей = ЧислоРолей + 1;
    КонецЦикла;
    Если ЧислоРолей <> 1 Тогда
        ВызватьИсключение "У собственного пользователя должна быть только одна учебная роль";
    КонецЕсли;
    Соединения = ПолучитьСоединенияИнформационнойБазы();
    Если ТипЗнч(Соединения) <> Тип("Массив") Или Соединения.Количество() <> 1 Тогда
        ВызватьИсключение "Закройте другие соединения со своей учебной ИБ";
    КонецЕсли;
КонецПроцедуры

Функция Снимок85() Экспорт
    ПроверитьСвоюИБ85();
    Настройки = ДополнительныеНастройкиАутентификации.ПолучитьНастройкиАвтоматическогоСохраненияАутентификации();
    Если ТипЗнч(Настройки) <> Тип("НастройкиАвтоматическогоСохраненияАутентификации") Тогда
        ВызватьИсключение "Getter не вернул настоящий объект настроек сохранения";
    КонецЕсли;
    Если ТипЗнч(Настройки.РазрешитьСохранение) <> Тип("Булево")
        Или ТипЗнч(Настройки.СохранятьПоУмолчанию) <> Тип("Булево")
        Или ТипЗнч(Настройки.ВремяЖизниСохраненнойАутентификации) <> Тип("Число") Тогда
        ВызватьИсключение "Ожидались два действительных флага и исходное native число";
    КонецЕсли;
    Возврат Новый Структура("Разрешено,ПоУмолчанию,NativeВремяЖизни", Настройки.РазрешитьСохранение,
        Настройки.СохранятьПоУмолчанию, Настройки.ВремяЖизниСохраненнойАутентификации);
КонецФункции

Процедура Сверить85(Старый, Свежий, Поля) Экспорт
    Если ТипЗнч(Старый) <> Тип("Структура") Или ТипЗнч(Свежий) <> Тип("Структура") Или ТипЗнч(Поля) <> Тип("Строка") Тогда
        ВызватьИсключение "Сравниваются только собственные конечные снимки";
    КонецЕсли;
    Ключи = СтрРазделить(Поля, ",");
    Если Старый.Количество() <> Ключи.Количество() Или Свежий.Количество() <> Ключи.Количество() Тогда
        ВызватьИсключение "Изменилось число полей собственного снимка";
    КонецЕсли;
    Для Каждого Ключ Из Ключи Цикл
        Если Не Старый.Свойство(Ключ, Было) Или Не Свежий.Свойство(Ключ, Стало) Тогда
            ВызватьИсключение "Отсутствует явно проверяемое поле";
        КонецЕсли;
        Если ТипЗнч(Было) <> ТипЗнч(Стало) Или Было <> Стало Тогда
            ВызватьИсключение "Настройки изменились во время опыта: СТОП без отката";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
Полный управляемый пульт с безопасным scalar-пакетом и СТОП при ошибке

ОбщиеФормы → АудитВхода85 → Модуль целиком

Настоящие события2/1 и действие команды1, thin Windows client/server directives.

&НаКлиенте
Перем Остановлен85;

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    АудитСохранения85.ПроверитьСвоюИБ85();
    Отчет85 = "Ожидается только чтение настроек и расчет собственного плана. Никакого входа/проверки пароля.";
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Если Остановлен85 <> Неопределено Тогда
        ВызватьИсключение "Повторная инициализация не сбрасывает остановку";
    КонецЕсли;
    Остановлен85 = Ложь;
    ВыполнитьПроверку85();
КонецПроцедуры

&НаКлиенте
Процедура Сверить85(Команда)
    ВыполнитьПроверку85();
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПроверку85()
    Если Остановлен85 <> Ложь Тогда
        ВызватьИсключение "СТОП: закройте свою учебную форму и выясните причину отказа";
    КонецЕсли;
    Остановлен85 = Истина;
    Попытка
        Пакет = ПакетНаСервере85();
        Если ТипЗнч(Пакет) <> Тип("Структура") Или Пакет.Количество() <> 4 Тогда
            ВызватьИсключение "Клиенту нужен только безопасный пакет четырех собственных scalar полей";
        КонецЕсли;
        Если Не Пакет.Свойство("Всего", Всего) Или Не Пакет.Свойство("Принято", Принято)
            Или Не Пакет.Свойство("Отклонено", Отклонено) Или Не Пакет.Свойство("Текст", Текст) Тогда
            ВызватьИсключение "Пакет неполон";
        КонецЕсли;
        Если ТипЗнч(Всего) <> Тип("Число") Или ТипЗнч(Принято) <> Тип("Число") Или ТипЗнч(Отклонено) <> Тип("Число")
            Или Всего <> 28 Или Принято <> 5 Или Отклонено <> 23 Или ТипЗнч(Текст) <> Тип("Строка") Или СтрДлина(Текст) > 10000 Тогда
            ВызватьИсключение "Неожиданные типы, суммы или размер собственной сводки";
        КонецЕсли;
        Отчет85 = Текст;
        Остановлен85 = Ложь;
    Исключение
        Остановлен85 = Истина;
        Отчет85 = "СТОП. Успешного отчета нет; настройки не исправляются автоматически.";
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПакетНаСервере85()
    Возврат АудитМетодов85.Построить85();
КонецФункции
Полный штатный запуск своей общей формы

Конфигурация → Модуль управляемого приложения

Подготовленное native ПриНачалеРаботыСистемы0, без ручного вызова событий формы.

Процедура ПриНачалеРаботыСистемы()
    СвояФорма = ПолучитьФорму("ОбщаяФорма.АудитВхода85");
    Если СвояФорма = Неопределено Тогда
        ВызватьИсключение "Не создана собственная управляемая общая форма";
    КонецЕсли;
    СвояФорма.Открыть();
КонецПроцедуры

Разбор по шагам

  1. Сначала паспорт именно своей новой ИБ.

  2. ПолучитьНастройкиПроверкиРаскрытияПароля0 и supportingGetEmail0 дают два конкретных native объекта.

  3. Проверьте типы трех Bool и способа почты, затем actual None/False ДО матрицы.

  4. Возвращается только finite4scalar снимок. Оба list-флага служат безопасной сводке, содержимое списков не читается.

  5. В конце основного расчета повторите getters и сравните все четыре доступных scalar результата.

Как проверить результат

  1. EmailEnum.Нет используется как genuine readonly native значение, не создается New.

  2. ServiceTrue или другой email mode вызывает отказ без setters/SMTP/HTTP/password checking.

  3. Нет чтения адреса/пароля/токена/хеша или заданного списка.

  4. При ошибке серверного вызова пульт остаетсяСТОП; успешный отчет не остается на экране как новый результат.

Ожидаемый результат

На собственной изолированной подготовленной ИБ guard пропускает только actual EmailНет/ServiceFalse, после чего возможен собственный расчет28/5/23. Иначе явный СТОП без изменений.

На что обратить внимание

  1. Это не доказательство физического отключения сети: изоляция — самостоятельная ручная предпосылка.

  2. Флаги не доказывают содержание/актуальность списков или надежность выбранного человеком пароля.

  3. Не исправляйте production настройки ради этого учебного guard; реальная проверка пароля или аутентификация вне урока.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.