Прервать только собственный учебный серверный вызов

Учебные задачи

Изменяющее упражнение на двух отдельных пустых учебных базах. По умолчанию только просмотр; прерывание не является завершением сеанса.

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

Изменяющий административный пример только для собственного изолированного лабораторного кластера и двух отдельных пустых учебных баз. По умолчанию — предварительный просмотр. Не выполнялся автором руководства.

Подготовка

  1. Только отдельный учебный кластер 1С:Предприятия 8.5.1.1343 с уже настроенным ras совместимой версии. Не подключайтесь к рабочему серверу для обучения.

  2. Создайте внешнюю обработку с управляемой формой. Добавьте реквизиты АдресRAS (Строка), ПортRAS (Число), ИмяАгента, ПарольАгента, ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера (Строка). Выведите поля на форму; у элементов ввода паролей в свойствах включите Режим пароля (PasswordMode).

  3. АдресRAS относится к машине серверного выполнения кода. Пример для ras на этой же тестовой машине: 127.0.0.1 и порт 1545; подтвердите фактические адрес и порт у администратора.

  4. Используйте законные учётные данные учебного агента и кластера. Оставлять имя и пароль пустыми можно только если соответствующие администраторы не зарегистрированы и среда допускает такую аутентификацию.

  5. При первом запуске оставьте ИдентификаторКластера пустым: код выведет идентификаторы и имена кластеров. Скопируйте идентификатор нужного учебного кластера в поле и повторите.

  6. Вставьте клиентскую процедуру и серверную функцию отдельно на уровне модуля формы. Код не запускает ras и не настраивает учётные записи.

  7. Дополнительно добавьте на форму ИдентификаторУчебнойБазы и ИдентификаторУчебногоСеанса (Строка). Сначала оставьте их пустыми: после выбора учебного кластера получите пары UUID ИБ/сеанса. Выберите сеанс своей отдельной учебной базы, не рабочий.

  8. Административные счётчики меняются во время чтения. Контроль состоит в сравнении с консолью того же учебного кластера, а не в требовании заранее известного числа пользователей, памяти или вызовов.

  9. Для этого действия обязательны две отдельные пустые учебные конфигурации: УчебнаяПульт85 и УчебнаяСеансы85. Создайте их базы на изолированном тестовом кластере без рабочих данных. Регистрационное имя целевой ИБ в кластере — точно УчебнаяСеансы85.

  10. Пульт работает в УчебнаяПульт85 под собственным администратором; целевой клиент — другая ИБ УчебнаяСеансы85 под пользователем УчебныйОператор. Из рабочей базы код останавливается до подключения к ras.

  11. Добавьте на форму пульта ПодтверждениеДействия (Строка) с начальным пустым значением. Не храните подтверждение в коде и не заполняйте его автоматически. Первый запуск — только предварительный просмотр.

  12. Создайте команду ПрерватьУчебныйВызов и её кнопку. После проверки двух UUID, имени ИБ и пользователя вручную введите ПРЕРВАТЬ УЧЕБНЫЙ ВЫЗОВ только для разрешённого действия в своём тестовом кластере.

  13. Проверки имён — учебные страховки, не криптографическое доказательство изоляции. Не называйте рабочую ИБ учебным именем для обхода проверок. Фактическую изоляцию подтверждает администратор.

  14. На целевой управляемой форме УчебнаяСеансы85 создайте команду НачатьУчебныйРасчет и вставьте следующий код на уровне модуля формы. Он занимает один учебный серверный вызов примерно 15 секунд вычислением в памяти, без записи; не запускайте многократно или одновременно: &НаКлиенте
    Процедура НачатьУчебныйРасчет(Команда)
    Сообщить(УчебныйРасчетНаСервере());
    КонецПроцедуры

    &НаСервереБезКонтекста
    Функция УчебныйРасчетНаСервере()
    Если Метаданные.Имя <> "УчебнаяСеансы85" Тогда
    ВызватьИсключение "Расчёт допустим только в отдельной учебной конфигурации";
    КонецЕсли;
    Предел = ТекущаяУниверсальнаяДата() + 15;
    Счетчик = 0;
    Пока ТекущаяУниверсальнаяДата() < Предел Цикл
    Счетчик = Счетчик + 1;
    КонецЦикла;
    Возврат Счетчик;
    КонецФункции

  15. Сначала выберите UUID целевого сеанса в пульте. Затем УчебныйОператор запускает расчёт, а администратор выполняет прерывание из другого пульта пока вызов ещё активен.

&НаКлиенте
Процедура ПрерватьУчебныйВызов(Команда)
    Результат = ПрерватьУчебныйВызовНаСервере(АдресRAS, ПортRAS, ИмяАгента, ПарольАгента, ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера, ИдентификаторУчебнойБазы, ИдентификаторУчебногоСеанса, ПодтверждениеДействия);
    Сообщить(Результат);
КонецПроцедуры

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

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

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

  2. Совпадение двух UUID выбирает сеанс, а дополнительный поиск ИБ проверяет регистрационное имя и целевого учебного пользователя.

  3. Пустое либо неверное подтверждение возвращает только предварительный просмотр, без метода изменения.

  4. Только точная вручную введённая фраза разрешает единственный выбранный учебный вызов метода; массового обхода нет.

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

  1. С пустым подтверждением только предварительный просмотр; целевой расчёт продолжается.

  2. Из другой конфигурации отказ до подключения к ras; другая ИБ/пользователь также дают отказ до метода изменения.

  3. Во время собственного расчёта с точной фразой клиент получает прерывание вызова. Повторная диагностика должна показывать, что сеанс может остаться доступен.

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

Разобран запрос прерывания отдельного разрешённого учебного вызова с несколькими защитами и ручным подтверждением.

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

  1. Метод изменяет состояние сервера. Нельзя запускать на рабочем кластере; копия HTML не является разрешением на администрирование рабочих сеансов.

  2. Непосредственно перед действием сеанс может завершиться сам. При отказе обновите список; не переключайтесь на первый попавшийся сеанс и не делайте бесконечные повторы.

  3. Прерывание вызова и завершение сеанса — разные действия. Ни одно не гарантирует отката внешних HTTP/файловых операций, уже выполненных прикладным кодом.

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

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

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

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

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