АдминистрированиеСеанс.ИмяПриложения

Свойства · ApplicationName

Тип: Строка. Содержит идентификатор приложения, установившего сеанс.

Полное описание, параметры и ограничения

АдминистрированиеСеанс.ИмяПриложения (AdministrationSession.ApplicationName)

АдминистрированиеСеанс (AdministrationSession)

ИмяПриложения (ApplicationName)

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

Использование:
Только чтение.
Описание:
Тип: Строка.
Содержит идентификатор приложения, установившего сеанс.
Доступность:

Тонкий клиент, сервер, толстый клиент, интеграция.

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

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

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

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

Связать сеансы и соединения только своей базы без их завершения

Получаем два настоящих списка, проверяем принадлежность базе, связываем по номеру сеанса и отдельно показываем ожидания СУБД и управляемых блокировок.

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

Полный модуль собственной управляемой формы. Только чтение явно выбранной УчебнаяБаза85 в УчебныйКластер85 через loopback ras; запуск в 1С и соединение здесь не выполнялись.

Подготовка

  1. Нужен отдельный собственный серверный стенд 1С 8.5.1.1343 без рабочих баз. Администратор должен заранее установить сервер, запустить совместимый ras и создать кластер с точным именем УчебныйКластер85. Код ничего не устанавливает и не регистрирует.

  2. Запускайте обработку в собственной пустой учебной конфигурации с именем метаданных УчебнаяКонфигурацияСинтаксиса. Серверное выполнение должно находиться на той же машине, что собственный ras: код разрешает только 127.0.0.1. Это адрес сервера выполнения, не обязательно компьютера тонкого клиента.

  3. ПортRAS возьмите из фактического запуска своего ras, не из порта ragent или рабочего процесса. Например, 1545 подходит только если именно этот порт настроен на вашем стенде. Используйте законные учётные данные своего агента и своего кластера; пустые допустимы только для намеренно настроенного учебного стенда без соответствующих администраторов.

  4. В первый раз оставьте ИдентификаторКластера пустым: появится JSON только с кластерами УчебныйКластер85. Скопируйте настоящий UUID из результата, вновь введите очищенные пароли и повторите команду. Кластер выбирается одновременно по UUID и точному учебному имени; чужой кластер не принимается.

  5. Выполняйте каждый урок отдельно. JSON формируется в памяти и показывается только на своей форме; код не сохраняет файлы, не пишет настройки кластера, не прерывает сеансы и не запускает команды ОС. Он выполняет сетевое обращение к своему локальному ras только если вы сами запустите его на подготовленном стенде.

  6. Здесь подключение к ras и запуск в 1С не выполнялись. Проверены тексты, сигнатуры и привязки к локальной справке 8.5.1.1343. Пройдите контрольные действия сами только на своём учебном стенде.

  7. Штатными средствами заранее зарегистрируйте в своём УчебныйКластер85 только собственную УчебнаяБаза85 с этой учебной конфигурацией. Код не создаёт базу, СУБД, пользователя, профиль или разрешение.

  8. В управляемой форме обработки создайте ПортRAS — Число без дробной части; ИмяАгента, ПарольАгента, ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера, ИдентификаторУчебнойБазы, ИмяАдминистратораБазы, ПарольАдминистратораБазы, JSONРезультат — Строка. У JSONРезультат длина 0.

  9. Выведите реквизиты на форму. Для всех трёх полей паролей включите Режим пароля, не сохраняйте их в истории и настройках; JSONРезультат — многострочное поле просмотра. Создайте команду ПолучитьУчебныйСнимок и вставьте весь приведённый модуль формы.

  10. Первый запуск с пустым UUID кластера возвращает только каталог УчебныйКластер85. Второй с настоящим UUID кластера и пустым UUID базы — только каталог УчебнаяБаза85. Третий — с обоими подтверждёнными UUID и законными учётными данными пользователя-администратора своей базы.

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

  12. Списки разрешений, роли и модули проверяются только как настройки. COM, внешние приложения, файлы, криптография и внешние веб-сервисы в примерах не запускаются. Снимок в памяти не проверяет фактический доступ или отказ.

&НаКлиенте
Процедура ПолучитьУчебныйСнимок(Команда)
    Попытка
        JSONРезультат = УчебныйСнимокНаСервере(ПортRAS, ИмяАгента, ПарольАгента,
            ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера,
    ИдентификаторУчебнойБазы, ИмяАдминистратораБазы, ПарольАдминистратораБазы);
    Исключение
        JSONРезультат = "Снимок не получен. Проверьте собственный стенд, порт, UUID кластера и базы, учебные имена и права администраторов. Подробную серверную ошибку исследуйте в отладчике без публикации учётных данных.";
    КонецПопытки;
    ПарольАгента = "";
    ПарольАдминистратораКластера = "";
    ПарольАдминистратораБазы = "";
КонецПроцедуры

&НаСервереБезКонтекста
Функция УчебныйСнимокНаСервере(ПортRAS, ИмяАгента, ПарольАгента,
    ИдентификаторКластера, ИмяАдминистратораКластера, ПарольАдминистратораКластера,
    ИдентификаторУчебнойБазы, ИмяАдминистратораБазы, ПарольАдминистратораБазы)
    Если ТипЗнч(ПортRAS) <> Тип("Число") Тогда
        ВызватьИсключение "Порт ras должен быть числом";
    КонецЕсли;
    Если ПортRAS <> Цел(ПортRAS) Или ПортRAS < 1 Или ПортRAS > 65535 Тогда
        ВызватьИсключение "Недопустимый порт собственного ras";
    КонецЕсли;
    ТекстовыеПараметры = Новый Массив;
    ТекстовыеПараметры.Добавить(ИмяАгента);
    ТекстовыеПараметры.Добавить(ПарольАгента);
    ТекстовыеПараметры.Добавить(ИдентификаторКластера);
    ТекстовыеПараметры.Добавить(ИмяАдминистратораКластера);
    ТекстовыеПараметры.Добавить(ПарольАдминистратораКластера);
    ТекстовыеПараметры.Добавить(ИдентификаторУчебнойБазы);
    ТекстовыеПараметры.Добавить(ИмяАдминистратораБазы);
    ТекстовыеПараметры.Добавить(ПарольАдминистратораБазы);
    Для Каждого ТекстовыйПараметр Из ТекстовыеПараметры Цикл
        Если ТипЗнч(ТекстовыйПараметр) <> Тип("Строка") Тогда
            ВызватьИсключение "Учётные данные и UUID должны быть строками";
        КонецЕсли;
    КонецЦикла;
    Агент = Новый АдминистрированиеСервера("127.0.0.1", ПортRAS);
    Агент.ВыполнитьАутентификацию(ПарольАгента, ИмяАгента);
    Кластеры = Агент.ПолучитьКластеры();
    Если ПустаяСтрока(СокрЛП(ИдентификаторКластера)) Тогда
        Каталог = Новый Массив;
        Для Каждого Найденный Из Кластеры Цикл
            Если Найденный.Имя = "УчебныйКластер85" Тогда
                СтрокаКаталога = Новый Структура;
                СтрокаКаталога.Вставить("UUID", Строка(Найденный.ИдентификаторКластера));
                СтрокаКаталога.Вставить("Имя", Найденный.Имя);
                Каталог.Добавить(СтрокаКаталога);
            КонецЕсли;
        КонецЦикла;
        Возврат СериализоватьСвойСнимок(Новый Структура("УчебныеКластеры", Каталог));
    КонецЕсли;
    Кластер = Неопределено;
    Совпадений = 0;
    Для Каждого Найденный Из Кластеры Цикл
        Если НРег(Строка(Найденный.ИдентификаторКластера)) = НРег(СокрЛП(ИдентификаторКластера))
            И Найденный.Имя = "УчебныйКластер85" Тогда
            Кластер = Найденный;
            Совпадений = Совпадений + 1;
        КонецЕсли;
    КонецЦикла;
    Если Совпадений <> 1 Тогда
        ВызватьИсключение "Нужен один собственный учебный кластер с подтверждённым UUID";
    КонецЕсли;
    Кластер.ВыполнитьАутентификацию(ИмяАдминистратораКластера, ПарольАдминистратораКластера);
    Снимок = Новый Структура;
    Снимок.Вставить("UUIDКластера", Строка(Кластер.ИдентификаторКластера));
    Снимок.Вставить("ИмяКластера", Кластер.Имя);
    Базы = Кластер.ПолучитьИнформационныеБазы();
    Если ПустаяСтрока(СокрЛП(ИдентификаторУчебнойБазы)) Тогда
        КаталогБаз = Новый Массив;
        Для Каждого КандидатБазы Из Базы Цикл
            Если ТипЗнч(КандидатБазы) <> Тип("АдминистрированиеИнформационнаяБаза") Тогда
                ВызватьИсключение "Ожидалось описание информационной базы";
            КонецЕсли;
            Если КандидатБазы.Имя = "УчебнаяБаза85" Тогда
                ЗаписьКаталога = Новый Структура;
                ЗаписьКаталога.Вставить("UUID", Строка(КандидатБазы.ИдентификаторИнформационнойБазы));
                ЗаписьКаталога.Вставить("Имя", КандидатБазы.Имя);
                КаталогБаз.Добавить(ЗаписьКаталога);
            КонецЕсли;
        КонецЦикла;
        Снимок.Вставить("УчебныеБазы", КаталогБаз);
        Возврат СериализоватьСвойСнимок(Снимок);
    КонецЕсли;
    База = Неопределено;
    СовпаденийБазы = 0;
    Для Каждого КандидатБазы Из Базы Цикл
        Если ТипЗнч(КандидатБазы) <> Тип("АдминистрированиеИнформационнаяБаза") Тогда
            ВызватьИсключение "Ожидалось описание информационной базы";
        КонецЕсли;
        Если КандидатБазы.Имя = "УчебнаяБаза85"
            И НРег(Строка(КандидатБазы.ИдентификаторИнформационнойБазы)) = НРег(СокрЛП(ИдентификаторУчебнойБазы)) Тогда
            База = КандидатБазы;
            СовпаденийБазы = СовпаденийБазы + 1;
        КонецЕсли;
    КонецЦикла;
    Если СовпаденийБазы <> 1 Тогда
        ВызватьИсключение "Нужна одна собственная УчебнаяБаза85 с подтверждённым UUID";
    КонецЕсли;
    База.ВыполнитьАутентификацию(ИмяАдминистратораБазы, ПарольАдминистратораБазы);
    Снимок.Вставить("UUIDБазы", Строка(База.ИдентификаторИнформационнойБазы));
    Снимок.Вставить("ИмяБазы", База.Имя);
    Сеансы = База.ПолучитьСеансы();
    Соединения = База.ПолучитьСоединения();
    НомераСеансов = Новый Соответствие;
    СтрокиСеансов = Новый Массив;
    ОжидающихСУБД = 0;
    ОжидающихУправляемойБлокировки = 0;
    Для Каждого Сеанс Из Сеансы Цикл
        Если ТипЗнч(Сеанс) <> Тип("АдминистрированиеСеанс") Тогда
            ВызватьИсключение "Ожидалось описание сеанса";
        КонецЕсли;
        Если Сеанс.ИдентификаторИнформационнойБазы <> База.ИдентификаторИнформационнойБазы Тогда
            ВызватьИсключение "Сеанс не относится к выбранной собственной базе";
        КонецЕсли;
        СтрокаСеанса = Новый Структура;
        СтрокаСеанса.Вставить("ИмяКомпьютера", Сеанс.ИмяКомпьютера);
        СтрокаСеанса.Вставить("ИмяПользователя", Сеанс.ИмяПользователя);
        СтрокаСеанса.Вставить("ИмяПриложения", Сеанс.ИмяПриложения);
        СтрокаСеанса.Вставить("КодЯзыка", Сеанс.КодЯзыка);
        СтрокаСеанса.Вставить("НомерСеанса", Сеанс.НомерСеанса);
        СтрокаСеанса.Вставить("СпящийСеанс", Сеанс.СпящийСеанс);
        СтрокаСеанса.Вставить("НомерСеансаБлокирующегоСУБД", Сеанс.НомерСеансаБлокирующегоСУБД);
        СтрокаСеанса.Вставить("НомерСеансаВыполнившегоУправляемуюБлокировку", Сеанс.НомерСеансаВыполнившегоУправляемуюБлокировку);
        СтрокаСеанса.Вставить("ИдентификаторСеанса", Строка(Сеанс.ИдентификаторСеанса));
        СтрокаСеанса.Вставить("ИдентификаторПроцесса", Строка(Сеанс.ИдентификаторПроцесса));
        СтрокаСеанса.Вставить("ИдентификаторСоединения", Строка(Сеанс.ИдентификаторСоединения));
        СтрокаСеанса.Вставить("Начало", XMLСтрока(Сеанс.ВремяНачала));
        СтрокаСеанса.Вставить("ПоследняяАктивность", XMLСтрока(Сеанс.ВремяПоследнейАктивности));
        НомераСеансов.Вставить(Сеанс.НомерСеанса, Истина);
        Если Сеанс.НомерСеансаБлокирующегоСУБД <> 0 Тогда
            ОжидающихСУБД = ОжидающихСУБД + 1;
        КонецЕсли;
        Если Сеанс.НомерСеансаВыполнившегоУправляемуюБлокировку <> 0 Тогда
            ОжидающихУправляемойБлокировки = ОжидающихУправляемойБлокировки + 1;
        КонецЕсли;
        СтрокиСеансов.Добавить(СтрокаСеанса);
    КонецЦикла;
    СтрокиСоединений = Новый Массив;
    Для Каждого Соединение Из Соединения Цикл
        Если ТипЗнч(Соединение) <> Тип("АдминистрированиеСоединение") Тогда
            ВызватьИсключение "Ожидалось описание соединения";
        КонецЕсли;
        Если Соединение.ИдентификаторИнформационнойБазы <> База.ИдентификаторИнформационнойБазы Тогда
            ВызватьИсключение "Соединение не относится к выбранной собственной базе";
        КонецЕсли;
        СтрокаСоединения = Новый Структура;
        СтрокаСоединения.Вставить("ИмяКомпьютера", Соединение.ИмяКомпьютера);
        СтрокаСоединения.Вставить("ИмяПриложения", Соединение.ИмяПриложения);
        СтрокаСоединения.Вставить("НомерСоединения", Соединение.НомерСоединения);
        СтрокаСоединения.Вставить("НомерСеанса", Соединение.НомерСеанса);
        СтрокаСоединения.Вставить("ИдентификаторСоединения", Строка(Соединение.ИдентификаторСоединения));
        СтрокаСоединения.Вставить("ИдентификаторПроцесса", Строка(Соединение.ИдентификаторПроцесса));
        СтрокаСоединения.Вставить("ВремяУстановки", XMLСтрока(Соединение.ВремяУстановкиСоединения));
        СтрокаСоединения.Вставить("НомерСеансаЕстьВПредыдущемСписке", НомераСеансов.Получить(Соединение.НомерСеанса) <> Неопределено);
        СтрокаСоединения.Вставить("БлокирующееСоединениеКакВСправке", Соединение.НомерСеансаВыполнившегоУправляемуюБлокировку);
        СтрокиСоединений.Добавить(СтрокаСоединения);
    КонецЦикла;
    Снимок.Вставить("КоличествоСеансов", Сеансы.Количество());
    Снимок.Вставить("КоличествоСоединений", Соединения.Количество());
    Снимок.Вставить("Сеансы", СтрокиСеансов);
    Снимок.Вставить("Соединения", СтрокиСоединений);
    Снимок.Вставить("СеансовОжидающихСУБД", ОжидающихСУБД);
    Снимок.Вставить("СеансовОжидающихУправляемойБлокировки", ОжидающихУправляемойБлокировки);
    Возврат СериализоватьСвойСнимок(Снимок);
КонецФункции

&НаСервереБезКонтекста
Функция СериализоватьСвойСнимок(Снимок)
    Писатель = Новый ЗаписьJSON;
    Писатель.УстановитьСтроку();
    ЗаписатьJSON(Писатель, Снимок);
    Возврат Писатель.Закрыть();
КонецФункции

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

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

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

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

  4. Результат строится из простых значений, массивов и структур. UUID и даты представлены текстом; пароли и сырые серверные ошибки в JSON не попадают.

  5. Методы вызываются на выбранной База, не на всём кластере. Каждый объект проверяется по типу и UUID информационной базы до чтения остальных полей.

  6. В сеансе читаем номер, UUID, приложение, пользователя, компьютер, язык, состояние сна и даты. UUID процесса и соединения помогают сопоставлению, не заменяют номер сеанса.

  7. Номера из первого списка сохраняются в Соответствие. Каждое соединение показывает, встречался ли его НомерСеанса в предыдущем снимке.

  8. Два серверных списка читаются последовательно, не атомарно. Отсутствие номера не объявляется повреждением или поводом завершить соединение.

  9. Для сеансов ненулевой НомерСеансаБлокирующегоСУБД указывает ожидание блокировки СУБД; другой ненулевой номер — ожидание управляемой транзакционной блокировки.

  10. У одноимённого свойства описания соединения справка говорит об идентификаторе блокирующего соединения, хотя имя содержит Сеанса. Выводим его отдельно, не связываем с номерами сеансов автоматически.

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

  1. В результате должны быть именно подтверждённые UUID и имена своего учебного кластера и базы, а не первый зарегистрированный объект.

  2. Неверный UUID, чужое имя, неверный тип аргумента или порт вне диапазона должны дать безопасное сообщение; ни одна команда изменения кластера или базы не вызывается.

  3. После любого исхода три поля паролей пустые. Проверяйте только на отдельном собственном стенде: запуск в 1С здесь не выполнялся.

  4. Количество строк каждого списка совпадает с его фактическим количеством объектов. Нулевые и меняющиеся количества допустимы; вымышленные три сеанса не обещаются.

  5. Все полученные объекты должны относиться к UUID своей базы. Несовпадение вызывает ошибку, не фильтрацию чужого объекта с продолжением работы.

  6. Сверьте собственное приложение с консолью своего стенда. Признак СпящийСеанс не приравнивается к отсутствию сеанса.

  7. Счётчики ожиданий основаны на документированном ненулевом значении номера блокирующего сеанса. Нет завершения сеансов, удаления соединений или изменения блокировок.

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

Построена понятная связь сеанс → соединение → процесс и отдельная диагностика ожиданий без разрушительных действий.

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

  1. 127.0.0.1 относится к машине серверного исполнения формы, не обязательно к ПК тонкого клиента. Не заменяйте адрес рабочим сервером.

  2. Имена — защитные учебные маркеры, UUID — подтверждённые идентификаторы. Код не устанавливает ras, не выбирает первого кандидата и не регистрирует недостающие объекты.

  3. Чтение настроек не является проверкой доступа, работоспособности СУБД, выполнения задания или отсутствия других способов получения лицензии.

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

  5. Статическая сверка и успешная сборка справочника не означают реальное подключение: тексты примеров в 1С не запускались.

  6. Сеанс и соединение — разные объекты; один снимок не доказывает постоянное взаимно-однозначное соответствие. RAS-аутентификация не является вашей командой завершения пользовательского сеанса.

  7. Даты представлены серверными значениями в XML-формате без обещания UTC. Точный смысл одноимённых полей проверяйте в справке конкретного типа, а не переносите по имени.

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

Найти блокирующий сеанс в той же учебной ИБ

Ожидание блокировки СУБД и управляемой блокировки 1С имеют разные поля. Номер блокировщика сопоставляем только внутри той же ИБ.

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

Управляемая форма учебного административного пульта. Клиентский обработчик и серверная функция находятся на уровне модуля формы. Только чтение отдельного учебного кластера через ras.

Подготовка

  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. Создайте команду ПоказатьОжиданиеСеанса, её кнопку и одноимённый клиентский обработчик из кода.

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

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

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

  1. Аутентифицируемся в явно выбранном учебном кластере; сеанс выбираем одновременно по UUID ИБ и UUID сеанса.

  2. Нулевой номер — нет указанного блокировщика в снимке; не ищем сеанс номер 0.

  3. Для каждого ненулевого номера одновременно проверяем ИБ и НомерСеанса: одинаковые номера в других ИБ не подходят.

  4. Если найден, показываем UUID для дальнейшей диагностики, но не завершаем его и не снимаем блокировку.

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

  1. При отсутствии ожидания две строки сообщают, что блокировщик не указан.

  2. При ненулевом поле найденный номер обязательно принадлежит UUID той же ИБ; исчезнувшая запись даёт сообщение об обновлении.

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

Построены диагностические связи ожидания без воздействия на блокировщиков.

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

  1. Это снимок административной диагностики, не замер внутри прикладной транзакции и не команда удаления сеансов.

  2. Отсутствие блокировщика в снимке не доказывает отсутствие задержек или блокировок вообще.

  3. Не завершайте сеанс только потому, что его номер показан: нужна отдельная диагностика и разрешение.

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

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

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

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

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