Это изменение сервера, не безобидное чтение. Целевая ИБ и пользователь проверяются, UUID указывается явно, массового завершения нет.
Где и как запускать
Изменяющий административный пример только для собственного изолированного лабораторного кластера и двух отдельных пустых учебных баз. По умолчанию — предварительный просмотр. Не выполнялся автором руководства.
Подготовка
Только отдельный учебный кластер 1С:Предприятия 8.5.1.1343 с уже настроенным ras совместимой версии. Не подключайтесь к рабочему серверу для обучения.
Создайте внешнюю обработку с управляемой формой. Добавьте реквизиты АдресRAS (Строка), ПортRAS (Число), ИмяАгента, ПарольАгента, ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера (Строка). Выведите поля на форму; у элементов ввода паролей в свойствах включите Режим пароля (PasswordMode).
АдресRAS относится к машине серверного выполнения кода. Пример для ras на этой же тестовой машине: 127.0.0.1 и порт 1545; подтвердите фактические адрес и порт у администратора.
Используйте законные учётные данные учебного агента и кластера. Оставлять имя и пароль пустыми можно только если соответствующие администраторы не зарегистрированы и среда допускает такую аутентификацию.
При первом запуске оставьте ИдентификаторКластера пустым: код выведет идентификаторы и имена кластеров. Скопируйте идентификатор нужного учебного кластера в поле и повторите.
Вставьте клиентскую процедуру и серверную функцию отдельно на уровне модуля формы. Код не запускает ras и не настраивает учётные записи.
Дополнительно добавьте на форму ИдентификаторУчебнойБазы и ИдентификаторУчебногоСеанса (Строка). Сначала оставьте их пустыми: после выбора учебного кластера получите пары UUID ИБ/сеанса. Выберите сеанс своей отдельной учебной базы, не рабочий.
Административные счётчики меняются во время чтения. Контроль состоит в сравнении с консолью того же учебного кластера, а не в требовании заранее известного числа пользователей, памяти или вызовов.
Для этого действия обязательны две отдельные пустые учебные конфигурации: УчебнаяПульт85 и УчебнаяСеансы85. Создайте их базы на изолированном тестовом кластере без рабочих данных. Регистрационное имя целевой ИБ в кластере — точно УчебнаяСеансы85.
Пульт работает в УчебнаяПульт85 под собственным администратором; целевой клиент — другая ИБ УчебнаяСеансы85 под пользователем УчебныйОператор. Из рабочей базы код останавливается до подключения к ras.
Добавьте на форму пульта ПодтверждениеДействия (Строка) с начальным пустым значением. Не храните подтверждение в коде и не заполняйте его автоматически. Первый запуск — только предварительный просмотр.
Создайте команду ЗавершитьУчебныйСеанс и её кнопку. После проверки двух UUID, имени ИБ и пользователя вручную введите ЗАВЕРШИТЬ УЧЕБНЫЙ СЕАНС только для разрешённого действия в своём тестовом кластере.
Проверки имён — учебные страховки, не криптографическое доказательство изоляции. Не называйте рабочую ИБ учебным именем для обхода проверок. Фактическую изоляцию подтверждает администратор.
&НаКлиенте
Процедура ЗавершитьУчебныйСеанс(Команда)
Результат = ЗавершитьУчебныйСеансНаСервере(АдресRAS, ПортRAS, ИмяАгента, ПарольАгента, ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера, ИдентификаторУчебнойБазы, ИдентификаторУчебногоСеанса, ПодтверждениеДействия);
Сообщить(Результат);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗавершитьУчебныйСеансНаСервере(АдресRAS, ПортRAS, ИмяАгента, ПарольАгента, ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера, ИдентификаторУчебнойБазы, ИдентификаторУчебногоСеанса, ПодтверждениеДействия)
Сервер = Новый АдминистрированиеСервера(АдресRAS, ПортRAS);
Сервер.ВыполнитьАутентификацию(ПарольАгента, ИмяАгента);
Кластеры = Сервер.ПолучитьКластеры();
Если Не ЗначениеЗаполнено(ИдентификаторКластера) Тогда
Строки = Новый Массив;
Для Каждого Элемент Из Кластеры Цикл
Строки.Добавить(Строка(Элемент.ИдентификаторКластера) + " — " + Элемент.Имя);
КонецЦикла;
Если Строки.Количество() = 0 Тогда
Возврат "Кластеров нет";
КонецЕсли;
Возврат СтрСоединить(Строки, Символы.ПС);
КонецЕсли;
Кластер = Неопределено;
Для Каждого Элемент Из Кластеры Цикл
Если НРег(Строка(Элемент.ИдентификаторКластера)) = НРег(СокрЛП(ИдентификаторКластера)) Тогда
Кластер = Элемент;
Прервать;
КонецЕсли;
КонецЦикла;
Если Кластер = Неопределено Тогда
ВызватьИсключение "Указанный учебный кластер не найден";
КонецЕсли;
Кластер.ВыполнитьАутентификацию(ИмяАдминистратораКластера, ПарольАдминистратораКластера);
Сеансы = Кластер.ПолучитьСеансы();
Если Не ЗначениеЗаполнено(ИдентификаторУчебнойБазы) Или Не ЗначениеЗаполнено(ИдентификаторУчебногоСеанса) Тогда
Список = Новый Массив;
Для Каждого Кандидат Из Сеансы Цикл
Список.Добавить(СтрШаблон("ИБ=%1; UUID сеанса=%2; номер=%3; приложение=%4",
Кандидат.ИдентификаторИнформационнойБазы, Кандидат.ИдентификаторСеанса,
Кандидат.НомерСеанса, Кандидат.ИмяПриложения));
КонецЦикла;
Возврат "Выберите UUID своей учебной ИБ и сеанса:" + Символы.ПС + СтрСоединить(Список, Символы.ПС);
КонецЕсли;
Сеанс = Неопределено;
Для Каждого Кандидат Из Сеансы Цикл
Если НРег(Строка(Кандидат.ИдентификаторИнформационнойБазы)) = НРег(СокрЛП(ИдентификаторУчебнойБазы))
И НРег(Строка(Кандидат.ИдентификаторСеанса)) = НРег(СокрЛП(ИдентификаторУчебногоСеанса)) Тогда
Сеанс = Кандидат;
Прервать;
КонецЕсли;
КонецЦикла;
Если Сеанс = Неопределено Тогда
Возврат "Выбранный учебный сеанс не найден в этой ИБ; обновите список. Номер сеанса вместо UUID не подходит.";
КонецЕсли;
УчебнаяБаза = Неопределено;
Для Каждого БазаКластера Из Кластер.ПолучитьИнформационныеБазы() Цикл
Если БазаКластера.ИдентификаторИнформационнойБазы = Сеанс.ИдентификаторИнформационнойБазы Тогда
УчебнаяБаза = БазаКластера;
Прервать;
КонецЕсли;
КонецЦикла;
Если УчебнаяБаза = Неопределено Тогда
ВызватьИсключение "Выбранная ИБ уже недоступна";
КонецЕсли;
Если УчебнаяБаза.Имя <> "УчебнаяСеансы85" Или Сеанс.ИмяПользователя <> "УчебныйОператор" Тогда
ВызватьИсключение "Операция допускается только над УчебнымОператором в отдельной ИБ УчебнаяСеансы85";
КонецЕсли;
Если ПодтверждениеДействия <> "ЗАВЕРШИТЬ УЧЕБНЫЙ СЕАНС" Тогда
Возврат СтрШаблон("Только предварительный просмотр: ИБ=%1; сеанс=%2; пользователь=%3. Для учебного действия введите точную фразу подтверждения.",
УчебнаяБаза.Имя, Сеанс.ИдентификаторСеанса, Сеанс.ИмяПользователя);
КонецЕсли;
Сеанс.ЗавершитьСеанс("Завершён только ваш отдельный учебный сеанс по подтверждению администратора");
Возврат "Метод завершения выбранного учебного сеанса выполнен. Обновите список; при следующем обращении старого клиента ожидается сообщение о завершении.";
КонецФункцииРазбор по шагам
На сервере сначала проверяем отдельную конфигурацию пульта, затем аутентифицируемся в тестовом кластере.
Совпадение двух UUID выбирает сеанс, а дополнительный поиск ИБ проверяет регистрационное имя и целевого учебного пользователя.
Пустое либо неверное подтверждение возвращает только предварительный просмотр, без метода изменения.
Только точная вручную введённая фраза разрешает единственный выбранный учебный вызов метода; массового обхода нет.
Как проверить результат
С пустым подтверждением список/предварительный просмотр; ни один сеанс не удаляется.
Сверьте целевые UUID, УчебнаяСеансы85 и УчебныйОператор перед ручным подтверждением.
После разрешённого действия обновите список: старый UUID сеанса отсутствует. Следующее обращение старого клиента вызывает исключение; автоматическое переподключение может создать уже новый UUID.
Ожидаемый результат
Показано завершение одного специально подготовленного учебного сеанса, а не всех пользователей кластера.
На что обратить внимание
Метод изменяет состояние сервера. Нельзя запускать на рабочем кластере; копия HTML не является разрешением на администрирование рабочих сеансов.
Непосредственно перед действием сеанс может завершиться сам. При отказе обновите список; не переключайтесь на первый попавшийся сеанс и не делайте бесконечные повторы.
Прерывание вызова и завершение сеанса — разные действия. Ни одно не гарантирует отката внешних HTTP/файловых операций, уже выполненных прикладным кодом.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.