С помощью данного объекта выполняется установка внешнего соединения с информационной базой 1С:Предприятия 8 и администрирование кластера серверов. С помощью одного экземпляра объекта может быть установлено неограниченное число соединений. Установка соединения с информационной базой 1С:Предприятия 8 осуществляется с помощью метода Connect. Администрирование кластера серверов выполняется с помощью методов ConnectAgent и ConnectWorkingProcess.
Доступность
Интеграция.
Примеры платформы
Соединитель = Новый COMObject("V85.COMConnector");Полное описание, параметры и ограничения
С помощью данного объекта выполняется установка внешнего соединения с информационной базой 1С:Предприятия 8 и администрирование кластера серверов. С помощью одного экземпляра объекта может быть установлено неограниченное число соединений.
Установка соединения с информационной базой 1С:Предприятия 8 осуществляется с помощью метода Connect.
Администрирование кластера серверов выполняется с помощью методов ConnectAgent и ConnectWorkingProcess.
Практические примеры
Разобраться, что такое сеанс, соединение и спящий клиент
На выбранном учебном сеансе читаем паспорт, политику сна и необязательное описание соединения без выгрузки имени пользователя или компьютера.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Только собственный изолированный тестовый кластер на Windows. Зарегистрированная в нём база называется guide-owned-session-lab, имя конфигурации этой базы УчебнаяБазаСеансов. Запустите в ней отдельный учебный клиент.
Создайте собственную обработку с управляемой формой. Вставьте весь код одного урока в модуль этой формы и свяжите команду Прочитать с обработчиком Прочитать. Серверная часть должна исполняться на Windows. Уроки заменяют весь модуль, а не добавляют шесть одинаковых функций.
V85.COMConnector должен быть уже зарегистрирован администратором на Windows-сервере 1С с подходящей разрядностью. Пример ничего не устанавливает и не регистрирует. Если COM недоступен, остановитесь и обратитесь к администратору тестового стенда.
В форме собственной обработки создайте строковые реквизиты КлючКластера, ИмяАгента, ПарольАгента, ИмяАдминистратора, ПарольАдминистратора и числовой НомерСеанса. Для полей паролей включите режим пароля, не сохраняйте значения в настройках формы.
КлючКластера вручную возьмите из собственной консоли администрирования: имя кластера|имя сервера|основной порт, например Учебный|localhost|1541. Это порт кластера, не порт агента 1540 и не порт RAS 1545.
Серверный код связывается только с агентом 127.0.0.1:1540 на том Windows-сервере, где исполняется модуль. Вводятся существующие учебные учётные данные агента и кластера; права и пароли не изменяются.
Клиентский обработчик приведён полностью: он очищает поля паролей до вызова сервера и не печатает аргументы или технический текст ошибок. Это не гарантирует безопасное стирание строк из памяти; учебные учётные данные не должны сохраняться в настройках формы.
Сначала НомерСеанса = 0: получите только ID и AppID сеансов этой учебной базы. Затем введите один ID из этого списка. ID уникален внутри информационной базы, а не во всём кластере.
Ниже дан законченный серверный пример получения настоящего объекта Сеанс, а не функция, требующая неизвестный ИсходныйОбъект. COM и кластер при подготовке руководства не запускались; требуется ручной запуск на собственном стенде.
&НаКлиенте
Процедура Прочитать(Команда)
ЛокальныйПарольАгента = ПарольАгента;
ЛокальныйПарольАдминистратора = ПарольАдминистратора;
ПарольАгента = "";
ПарольАдминистратора = "";
Попытка
Отчет = ПрочитатьУчебныйСеанс(КлючКластера, ИмяАгента, ЛокальныйПарольАгента, ИмяАдминистратора, ЛокальныйПарольАдминистратора, НомерСеанса);
Исключение
ЛокальныйПарольАгента = "";
ЛокальныйПарольАдминистратора = "";
Сообщить("Чтение не выполнено. Проверьте собственный стенд, COM, ключ кластера, права и наличие выбранного сеанса. Технические сведения проверяет администратор стенда.");
Возврат;
КонецПопытки;
ЛокальныйПарольАгента = "";
ЛокальныйПарольАдминистратора = "";
Сообщить(Отчет);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПрочитатьУчебныйСеанс(КлючКластера, ИмяАгента, ПарольАгента, ИмяАдминистратора, ПарольАдминистратора, НомерСеанса)
Если ПустаяСтрока(КлючКластера) Тогда
ВызватьИсключение "Укажите точный ключ собственного тестового кластера";
КонецЕсли;
Если НомерСеанса < 0 Или Цел(НомерСеанса) <> НомерСеанса Тогда
ВызватьИсключение "Номер сеанса должен быть целым неотрицательным числом";
КонецЕсли;
Соединитель = Новый COMОбъект("V85.COMConnector");
Агент = Соединитель.ConnectAgent("127.0.0.1:1540");
Агент.AuthenticateAgent(ИмяАгента, ПарольАгента);
ПодходящиеКластеры = Новый Массив;
Для Каждого Кандидат Из Агент.GetClusters() Цикл
КлючКандидата = СтрШаблон("%1|%2|%3", Кандидат.ClusterName, Кандидат.HostName, Кандидат.MainPort);
Если НРег(КлючКандидата) = НРег(КлючКластера) Тогда
ПодходящиеКластеры.Добавить(Кандидат);
КонецЕсли;
КонецЦикла;
Если ПодходящиеКластеры.Количество() <> 1 Тогда
ВызватьИсключение "Собственный тестовый кластер не выбран однозначно";
КонецЕсли;
Кластер = ПодходящиеКластеры.Получить(0);
Агент.Authenticate(Кластер, ИмяАдминистратора, ПарольАдминистратора);
УчебныеБазы = Новый Массив;
Для Каждого ОписаниеБазы Из Агент.GetInfoBases(Кластер) Цикл
Если ОписаниеБазы.Name = "guide-owned-session-lab" Тогда
УчебныеБазы.Добавить(ОписаниеБазы);
КонецЕсли;
КонецЦикла;
Если УчебныеБазы.Количество() <> 1 Тогда
ВызватьИсключение "Зарегистрированная учебная база не выбрана однозначно";
КонецЕсли;
УчебнаяБаза = УчебныеБазы.Получить(0);
УчебныеСеансы = Агент.GetInfoBaseSessions(Кластер, УчебнаяБаза);
СтрокиОтчета = Новый Массив;
НайденныеСеансы = Новый Массив;
Для Каждого КандидатСеанс Из УчебныеСеансы Цикл
Если НомерСеанса = 0 Тогда
СтрокиОтчета.Добавить(СтрШаблон("Сеанс %1; приложение %2", КандидатСеанс.SessionID, КандидатСеанс.AppID));
ИначеЕсли КандидатСеанс.SessionID = НомерСеанса Тогда
НайденныеСеансы.Добавить(КандидатСеанс);
КонецЕсли;
КонецЦикла;
Если НомерСеанса = 0 Тогда
Если СтрокиОтчета.Количество() = 0 Тогда
Возврат "В учебной базе сейчас нет сеансов";
КонецЕсли;
Возврат СтрСоединить(СтрокиОтчета, Символы.ПС);
КонецЕсли;
Если НайденныеСеансы.Количество() <> 1 Тогда
ВызватьИсключение "Учебный сеанс исчез или не выбран однозначно; обновите список";
КонецЕсли;
Сеанс = НайденныеСеансы.Получить(0);
Если Сеанс.InfoBase.Name <> "guide-owned-session-lab" Тогда
ВызватьИсключение "Сеанс не принадлежит выбранной учебной базе";
КонецЕсли;
СтрокиОтчета.Добавить(СтрШаблон("ID=%1; AppID=%2; язык интерфейса=%3", Сеанс.SessionID, Сеанс.AppID, Сеанс.Locale));
СтрокиОтчета.Добавить(СтрШаблон("Начало=%1; последняя активность=%2", Сеанс.StartedAt, Сеанс.LastActiveAt));
СтрокиОтчета.Добавить(СтрШаблон("Имя клиента заполнено=%1; имя пользователя заполнено=%2", Не ПустаяСтрока(Сеанс.Host), Не ПустаяСтрока(Сеанс.UserName)));
СтрокиОтчета.Добавить(СтрШаблон("Описание учебной базы заполнено=%1", Не ПустаяСтрока(Сеанс.InfoBase.Descr)));
СтрокиОтчета.Добавить(СтрШаблон("Спящий=%1; простой до сна, с=%2; сон до завершения, с=%3", Сеанс.Hibernate, Сеанс.PassiveSessionHibernateTime, Сеанс.HibernateSessionTerminateTime));
СтрокиОтчета.Добавить(СтрШаблон("Есть рабочий процесс=%1; есть клиентская лицензия=%2", Сеанс.Process <> Неопределено, Сеанс.License <> Неопределено));
Соединение = Сеанс.Connection;
Если Соединение = Неопределено Тогда
СтрокиОтчета.Добавить("Соединение сейчас не назначено; это допустимое состояние сеанса");
Иначе
СтрокиОтчета.Добавить(СтрШаблон("Соединение=%1; приложение=%2; установлено=%3", Соединение.ConnID, Соединение.Application, Соединение.ConnectedAt));
СтрокиОтчета.Добавить(СтрШаблон("Связь с выбранным сеансом=%1; связь с учебной базой=%2", Соединение.SessionID = Сеанс.SessionID, Соединение.InfoBase.Name = "guide-owned-session-lab"));
СтрокиОтчета.Добавить(СтрШаблон("Имя клиента соединения заполнено=%1; рабочий процесс назначен=%2; блокирующий ID=%3", Не ПустаяСтрока(Соединение.Host), Соединение.Process <> Неопределено, Соединение.blockedByLS));
КонецЕсли;
Возврат СтрСоединить(СтрокиОтчета, Символы.ПС);
КонецФункцииРазбор по шагам
Сначала функция выбирает конкретный кластер и собственную зарегистрированную базу; только затем вызывает GetInfoBaseSessions.
SessionID относится к базе. ConnID — номер соединения; он не заменяет SessionID. Сеанс и соединение — разные сущности.
Connection/Process/License могут быть Неопределено; перед чтением вложенных свойств это проверяется.
Оба тайм-аута сна заданы в секундах. Hibernate показывает текущее состояние, а не распоряжение завершить клиента.
Locale — язык интерфейса и сообщений, не обещание регионального формата числа. Даты показываются как получены; часовой пояс не угадывается.
Как проверить результат
При НомерСеанса=0 видны только номера и AppID собственной базы; для выбранного ID показан паспорт.
Если соединение назначено, сравнения связи с сеансом и собственной базой ожидаются Истина. При конкурентном изменении состояния обновите снимок.
Имя пользователя, адрес клиента, описание базы не публикуются; выводится лишь признак заполненности.
Ожидаемый результат
Новичок видит реальный сеанс и различает его необязательные связи и настройки сна.
На что обратить внимание
Не считать спящий сеанс ошибочным и не завершать его ради учебного отчёта.
Описание соединения — отдельный интерфейс с восемью свойствами, не интерфейс Соединение с другим набором полей.
COM чтения не составляют транзакционный снимок; значения могли измениться между обращениями.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Увидеть блокировщика, не принимая его ID за секунды
Читаем два номера блокирующих сеансов, признак захваченного соединения СУБД и длительность захвата.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Только собственный изолированный тестовый кластер на Windows. Зарегистрированная в нём база называется guide-owned-session-lab, имя конфигурации этой базы УчебнаяБазаСеансов. Запустите в ней отдельный учебный клиент.
Создайте собственную обработку с управляемой формой. Вставьте весь код одного урока в модуль этой формы и свяжите команду Прочитать с обработчиком Прочитать. Серверная часть должна исполняться на Windows. Уроки заменяют весь модуль, а не добавляют шесть одинаковых функций.
V85.COMConnector должен быть уже зарегистрирован администратором на Windows-сервере 1С с подходящей разрядностью. Пример ничего не устанавливает и не регистрирует. Если COM недоступен, остановитесь и обратитесь к администратору тестового стенда.
В форме собственной обработки создайте строковые реквизиты КлючКластера, ИмяАгента, ПарольАгента, ИмяАдминистратора, ПарольАдминистратора и числовой НомерСеанса. Для полей паролей включите режим пароля, не сохраняйте значения в настройках формы.
КлючКластера вручную возьмите из собственной консоли администрирования: имя кластера|имя сервера|основной порт, например Учебный|localhost|1541. Это порт кластера, не порт агента 1540 и не порт RAS 1545.
Серверный код связывается только с агентом 127.0.0.1:1540 на том Windows-сервере, где исполняется модуль. Вводятся существующие учебные учётные данные агента и кластера; права и пароли не изменяются.
Клиентский обработчик приведён полностью: он очищает поля паролей до вызова сервера и не печатает аргументы или технический текст ошибок. Это не гарантирует безопасное стирание строк из памяти; учебные учётные данные не должны сохраняться в настройках формы.
Сначала НомерСеанса = 0: получите только ID и AppID сеансов этой учебной базы. Затем введите один ID из этого списка. ID уникален внутри информационной базы, а не во всём кластере.
Ниже дан законченный серверный пример получения настоящего объекта Сеанс, а не функция, требующая неизвестный ИсходныйОбъект. COM и кластер при подготовке руководства не запускались; требуется ручной запуск на собственном стенде.
&НаКлиенте
Процедура Прочитать(Команда)
ЛокальныйПарольАгента = ПарольАгента;
ЛокальныйПарольАдминистратора = ПарольАдминистратора;
ПарольАгента = "";
ПарольАдминистратора = "";
Попытка
Отчет = ПрочитатьУчебныйСеанс(КлючКластера, ИмяАгента, ЛокальныйПарольАгента, ИмяАдминистратора, ЛокальныйПарольАдминистратора, НомерСеанса);
Исключение
ЛокальныйПарольАгента = "";
ЛокальныйПарольАдминистратора = "";
Сообщить("Чтение не выполнено. Проверьте собственный стенд, COM, ключ кластера, права и наличие выбранного сеанса. Технические сведения проверяет администратор стенда.");
Возврат;
КонецПопытки;
ЛокальныйПарольАгента = "";
ЛокальныйПарольАдминистратора = "";
Сообщить(Отчет);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПрочитатьУчебныйСеанс(КлючКластера, ИмяАгента, ПарольАгента, ИмяАдминистратора, ПарольАдминистратора, НомерСеанса)
Если ПустаяСтрока(КлючКластера) Тогда
ВызватьИсключение "Укажите точный ключ собственного тестового кластера";
КонецЕсли;
Если НомерСеанса < 0 Или Цел(НомерСеанса) <> НомерСеанса Тогда
ВызватьИсключение "Номер сеанса должен быть целым неотрицательным числом";
КонецЕсли;
Соединитель = Новый COMОбъект("V85.COMConnector");
Агент = Соединитель.ConnectAgent("127.0.0.1:1540");
Агент.AuthenticateAgent(ИмяАгента, ПарольАгента);
ПодходящиеКластеры = Новый Массив;
Для Каждого Кандидат Из Агент.GetClusters() Цикл
КлючКандидата = СтрШаблон("%1|%2|%3", Кандидат.ClusterName, Кандидат.HostName, Кандидат.MainPort);
Если НРег(КлючКандидата) = НРег(КлючКластера) Тогда
ПодходящиеКластеры.Добавить(Кандидат);
КонецЕсли;
КонецЦикла;
Если ПодходящиеКластеры.Количество() <> 1 Тогда
ВызватьИсключение "Собственный тестовый кластер не выбран однозначно";
КонецЕсли;
Кластер = ПодходящиеКластеры.Получить(0);
Агент.Authenticate(Кластер, ИмяАдминистратора, ПарольАдминистратора);
УчебныеБазы = Новый Массив;
Для Каждого ОписаниеБазы Из Агент.GetInfoBases(Кластер) Цикл
Если ОписаниеБазы.Name = "guide-owned-session-lab" Тогда
УчебныеБазы.Добавить(ОписаниеБазы);
КонецЕсли;
КонецЦикла;
Если УчебныеБазы.Количество() <> 1 Тогда
ВызватьИсключение "Зарегистрированная учебная база не выбрана однозначно";
КонецЕсли;
УчебнаяБаза = УчебныеБазы.Получить(0);
УчебныеСеансы = Агент.GetInfoBaseSessions(Кластер, УчебнаяБаза);
СтрокиОтчета = Новый Массив;
НайденныеСеансы = Новый Массив;
Для Каждого КандидатСеанс Из УчебныеСеансы Цикл
Если НомерСеанса = 0 Тогда
СтрокиОтчета.Добавить(СтрШаблон("Сеанс %1; приложение %2", КандидатСеанс.SessionID, КандидатСеанс.AppID));
ИначеЕсли КандидатСеанс.SessionID = НомерСеанса Тогда
НайденныеСеансы.Добавить(КандидатСеанс);
КонецЕсли;
КонецЦикла;
Если НомерСеанса = 0 Тогда
Если СтрокиОтчета.Количество() = 0 Тогда
Возврат "В учебной базе сейчас нет сеансов";
КонецЕсли;
Возврат СтрСоединить(СтрокиОтчета, Символы.ПС);
КонецЕсли;
Если НайденныеСеансы.Количество() <> 1 Тогда
ВызватьИсключение "Учебный сеанс исчез или не выбран однозначно; обновите список";
КонецЕсли;
Сеанс = НайденныеСеансы.Получить(0);
Если Сеанс.InfoBase.Name <> "guide-owned-session-lab" Тогда
ВызватьИсключение "Сеанс не принадлежит выбранной учебной базе";
КонецЕсли;
БлокировщикСУБД = Сеанс.blockedByDBMS;
БлокировщикМенеджера = Сеанс.blockedByLS;
СтрокиОтчета.Добавить(СтрШаблон("ID блокировщика СУБД=%1; ID блокировщика менеджера=%2", БлокировщикСУБД, БлокировщикМенеджера));
СтрокиОтчета.Добавить(СтрШаблон("Блокировка СУБД отсутствует=%1; блокировка менеджера отсутствует=%2", БлокировщикСУБД = 0, БлокировщикМенеджера = 0));
ЗахватЕсть = Не ПустаяСтрока(Сеанс.dbProcInfo);
СтрокиОтчета.Добавить(СтрШаблон("Соединение СУБД захвачено=%1; с момента захвата, мс=%2", ЗахватЕсть, Сеанс.dbProcTook));
Если ЗахватЕсть Тогда
СтрокиОтчета.Добавить(СтрШаблон("Момент последнего захвата=%1", Сеанс.dbProcTookAt));
КонецЕсли;
СтрокиОтчета.Добавить(СтрШаблон("Сервисный вызов указан=%1", Не ПустаяСтрока(Сеанс.CurrentServiceName)));
Возврат СтрСоединить(СтрокиОтчета, Символы.ПС);
КонецФункцииРазбор по шагам
Ноль в blockedByDBMS/blockedByLS означает отсутствие соответствующего блокировщика. Ненулевое число — ID блокирующего сеанса, не время и не число блокировок.
dbProcInfo содержит номер соединения в терминах СУБД; это не SQL запрос и не стек. Его содержимое не выводим.
dbProcTook — миллисекунды с захвата соединения, не доказательство, что весь интервал выполнялся запрос. Транзакция и временные таблицы тоже могут удерживать соединение.
dbProcTookAt — момент последнего захвата. При отсутствии захвата не представляем его как активную работу.
CurrentServiceName читаем только как признак текущего сервисного вызова; отчёт не вмешивается в работу.
Как проверить результат
На свободном учебном клиенте нули и Ложь для захвата допустимы; не создавайте искусственную блокировку в рабочей базе.
Поля явно подписаны ID и мс; отсутствуют команды отключения клиентов или удаления соединений.
Ожидаемый результат
Получен безопасный диагностический отчёт, который не смешивает идентификаторы и время.
На что обратить внимание
Ненулевой dbProcTook не означает зависший SQL. Для причины нужен отдельный анализ на стенде.
Блокировка может исчезнуть между чтениями. Один снимок не доказывает длительность проблемы.
Нельзя завершать найденный ID в другой базе: SessionID не является глобальным номером кластера.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.