Реальные getters читают настройки почты/проверки раскрытия. Наш потребитель отказывается от опыта, если способ почты не Нет или включен сервис; сами механизмы не отключаются.
Где и как запускать
Полный server-only ОбщийМодуль АудитКаналов85; никакой отправки, проверки пароля или записи настроек.
Подготовка
Опыт только для отдельной НОВОЙ собственной файловой ИБ, не для рабочей базы или ее копии с данными. Вручную создайте пустую ИБ по точному пути C:\1c-labs\OwnAuthPolicy85_16364087-5f69-4df1-885d-2fa55cfb864f\IB и откройте ее Конфигуратором 8.5.1.1343. Код проверяет именно File-строку, а не только имя конфигурации. Этот каталог и ИБ агент не создавал.
У корня конфигурации задайте Имя=УчебнаяПолитикаВхода85, РежимСовместимости=НеИспользовать, ОсновнойРежимЗапуска=УправляемоеПриложение. Прикладные справочники/документы/регистры/планы/константы/обработки/отчеты, HTTP/Web-сервисы, внешние источники, общие реквизиты, подписки и задания не добавляйте. Расширений базы и сеанса нет. Все это собственные ручные действия подготовки, не выполнение приведенного BSL.
Роли → новая АудитВхода85: явно включите права конфигурации АдминистрированиеДанных, Администрирование, АктивныеПользователи и ТонкийКлиент; предоставьте использование/просмотр собственной общей формы. Администрирование нужно для ПолучитьПользователей и чтения Роли; оно требует АдминистрированиеДанных. АктивныеПользователи нужно для ПолучитьСоединенияИнформационнойБазы. Это привилегии только своего изолированного лабораторного администратора, НЕ рекомендация прав обычному пользователю рабочей ИБ.
Администрирование → Пользователи: вручную заведите только AuthAudit85Ученик и назначьте только АудитВхода85. Пароль выбирает человек; не помещайте его в код, отчет, командную строку или файл. Настройте собственный локальный стандартный вход вручную. Наличие семи native значений не означает, что все семь способов включены. Для дальнейшего чтения нужен именно этот единственный пользователь и только один сеанс.
ОбщиеМодули: создайте ровно АудитМетодов85, АудитСохранения85, АудитКаналов85. Для КАЖДОГО: ГлобальныйНет, СерверДа, ВызовСервераДа, КлиентОбычноеПриложениеНет, КлиентУправляемоеПриложениеНет, ВнешнееСоединениеНет, ПривилегированныйНет, ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать. В АудитМетодов85 вставьте METHOD, в АудитСохранения85 AUTO, в АудитКаналов85 CHANNEL целиком. Сервер сравнивает metadata enums через Метаданные.СвойстваОбъектов. Флаг кеширования проверяется только ПОСЛЕ отказа глобальному модулю; менять флаги программно не требуется.
ОбщиеФормы → новая управляемая АудитВхода85: единственный собственный реквизит Отчет85, Строка10000. Разместите многострочное поле с Данные=Отчет85 и ТолькоПросмотрДа. Создайте команду Сверить85 и кнопку с этой командой. Вставьте FORM целиком. Назначьте настоящие события ПриСозданииНаСервере → ПриСозданииНаСервере(2), ПриОткрытии → ПриОткрытии(1); действие команды → Сверить85(1). Обработчики событий не вызываются вручную, общие модули не получают UI-объекты.
Конфигурация → Модуль управляемого приложения: вставьте APP целиком и свяжите настоящее ПриНачалеРаботыСистемы(0). Обновите только свою конфигурацию базы данных, закройте Конфигуратор и другие соединения. Запустите собственную ИБ тонким Windows-клиентом под AuthAudit85Ученик. Нативные менеджер/объекты настроек/перечисления/ТаблицаЗначений остаются на сервере; через RPC возвращаются только три Числа и Строка.
Физически изолируйте свою новую лабораторную среду до запуска опыта. Код НЕ доказывает отключение сети. Он дополнительно читает фактический способ почты и флаг сервисной проверки: нужны именно Нет и Ложь. Любое другое значение останавливает наш потребитель, а не выключает сервис или аутентификацию. Не исправляйте настройки рабочей ИБ ради прохождения guard.
Числа 1,2,3,4,5,6,7 — только придуманные количества ПРЕДЛОЖЕННЫХ запросов для семи native enum значений. В коде потребитель принимает лишь АутентификацияСтандартная. Ожидаемые 7 строк, 28 всего, 5 принятых и 23 отклоненных — арифметика собственного офлайн-плана, НЕ аутентифицированные сеансы, настройка безопасности или рекомендация запрещать остальные способы.
РазрешитьСохранение/СохранятьПоУмолчанию читаются фактически и определяют отдельные пояснения отчета. Исходное число ВремяЖизниСохраненнойАутентификации отображается без единицы, диапазона и трактовки нуля: installed справка этого не сообщает. Нет предположения о значениях по умолчанию этих трех полей и нет обещания вычисленного срока истечения.
Ни в одном модуле нет 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");
Если СвояФорма = Неопределено Тогда
ВызватьИсключение "Не создана собственная управляемая общая форма";
КонецЕсли;
СвояФорма.Открыть();
КонецПроцедурыРазбор по шагам
Сначала паспорт именно своей новой ИБ.
ПолучитьНастройкиПроверкиРаскрытияПароля0 и supportingGetEmail0 дают два конкретных native объекта.
Проверьте типы трех Bool и способа почты, затем actual None/False ДО матрицы.
Возвращается только finite4scalar снимок. Оба list-флага служат безопасной сводке, содержимое списков не читается.
В конце основного расчета повторите getters и сравните все четыре доступных scalar результата.
Как проверить результат
EmailEnum.Нет используется как genuine readonly native значение, не создается New.
ServiceTrue или другой email mode вызывает отказ без setters/SMTP/HTTP/password checking.
Нет чтения адреса/пароля/токена/хеша или заданного списка.
При ошибке серверного вызова пульт остаетсяСТОП; успешный отчет не остается на экране как новый результат.
Ожидаемый результат
На собственной изолированной подготовленной ИБ guard пропускает только actual EmailНет/ServiceFalse, после чего возможен собственный расчет28/5/23. Иначе явный СТОП без изменений.
На что обратить внимание
Это не доказательство физического отключения сети: изоляция — самостоятельная ручная предпосылка.
Флаги не доказывают содержание/актуальность списков или надежность выбранного человеком пароля.
Не исправляйте production настройки ради этого учебного guard; реальная проверка пароля или аутентификация вне урока.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.