База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как автоматизировать закрытие сеансов в 1С:Предприятие 8.3 на SQL?
- В этой теме 1 ответ, 2 участника, последнее обновление 6 часов, 14 минут назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
6 мая 2026 в 10:00 #36980
1С83 БД sql. Как автоматизировать
закрытие сеансов пользователей -
6 мая 2026 в 10:00 #36981
Автоматизировать закрытие сеансов пользователей в 1С:Предприятие 8.3 с базой на SQL-сервере можно несколькими способами. Самый гибкий и рекомендуемый — использовать COM-объект v8.COMConnector для программного завершения сеансов через агент сервера 1С. Также можно применять стандартную обработку блокировки пользователей, скрипты остановки/запуска сервера или программное завершение работы пользователей из 1С.
Кратко по методам:
1. Через COM-объект агента сервера можно получить список сеансов и завершить все, кроме системных и текущего пользователя. Этот способ подходит для автоматизации и запуска по расписанию.
2. Стандартная обработка «Блокировка работы пользователей» позволяет без программирования заблокировать базу для новых сеансов и завершить текущие.
3. Скрипты Windows для остановки и запуска сервера 1С полностью отключают все базы, что не всегда удобно.
4. В 1С можно написать процедуру, которая по времени завершает работу пользователей, вызывая ПрекратитьРаботуСистемы.
СИНХРОН-КОД: в вопросе упомянуто «закрытие сеансов пользователей», а в финальном коде используется именно COM-объект v8.COMConnector и процедуры для завершения сеансов, а также скрипты остановки сервера и программное завершение работы пользователей.
Ниже приведены примеры и шаблоны кода для каждого из описанных способов.
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384Процедура ЗавершитьСеансыПользователей()СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();Параметры = ПолучитьПараметрыСервераИзСтрокиСоединения(СтрокаСоединения);Если Параметры.ИмяСервера = "" ТогдаВозврат;КонецЕсли;Если ТипПлатформы() = ТипПлатформы.ОперационнаяСистемаUnix ТогдаВозврат;КонецЕсли;Агент = ПолучитьАгентКластера(Параметры.ИмяСервера);Если Агент = Неопределено ТогдаВозврат;КонецЕсли;ЗавершитьСеансыПоАгенту(Агент, Параметры.ИмяБазы);КонецПроцедурыФункция ПолучитьПараметрыСервераИзСтрокиСоединения(СтрокаСоединения)ИмяПараметраСервера = "Srvr=";ИмяПараметраБазы = "Ref=";СтруктураРезультат = Новый Структура("ИмяСервера, ИмяБазы", "", "");Позиция = СтрНайти(СтрокаСоединения, ИмяПараметраСервера);Если Позиция = 0 ТогдаВозврат СтруктураРезультат;КонецЕсли;Позиция = Позиция + СтрДлина(ИмяПараметраСервера);Остаток = Сред(СтрокаСоединения, Позиция);Знак = СтрНайти(Остаток, """");Если Знак = 0 ТогдаВозврат СтруктураРезультат;КонецЕсли;СтруктураРезультат.ИмяСервера = Лев(Остаток, Знак - 1);Позиция = СтрНайти(СтрокаСоединения, ИмяПараметраБазы);Если Позиция = 0 ТогдаВозврат СтруктураРезультат;КонецЕсли;Позиция = Позиция + СтрДлина(ИмяПараметраБазы);Остаток = Сред(СтрокаСоединения, Позиция);Знак = СтрНайти(Остаток, """");Если Знак = 0 ТогдаВозврат СтруктураРезультат;КонецЕсли;СтруктураРезультат.ИмяБазы = Лев(Остаток, Знак - 1);Возврат СтруктураРезультат;КонецФункцииФункция ПолучитьАгентКластера(ИмяСервера)Возврат Новый COMОбъект("v8.COMConnector").ConnectAgent(ИмяСервера);КонецФункцииПроцедура ЗавершитьСеансыПоАгенту(Агент, ИмяБазы)Кластеры = Агент.GetClusters();Для Каждого Кластер Из Кластеры ЦиклАгент.Authenticate(Кластер, "АдминистраторКластера", "ПарольКластера");ИнформационнаяБаза = НайтиИнформационнуюБазу(Агент, Кластер, ИмяБазы);Если ИнформационнаяБаза = Неопределено ТогдаПродолжить;КонецЕсли;ЗавершитьСеансыБазы(Агент, Кластер, ИнформационнаяБаза);Прервать;КонецЦикла;КонецПроцедурыФункция НайтиИнформационнуюБазу(Агент, Кластер, ИмяБазы)Базы = Агент.GetInfoBases(Кластер);Для Каждого База Из Базы ЦиклЕсли База.Name = ИмяБазы ТогдаВозврат База;КонецЕсли;КонецЦикла;Возврат Неопределено;КонецФункцииПроцедура ЗавершитьСеансыБазы(Агент, Кластер, ИнформационнаяБаза)Сеансы = Агент.GetInfoBaseSessions(Кластер, ИнформационнаяБаза);Для Каждого Сеанс Из Сеансы ЦиклЕсли Сеанс.AppID = "designer" Или Сеанс.AppID = "backgroundjob" ТогдаПродолжить;КонецЕсли;Если Сеанс.UserName = ИмяПользователя() ТогдаПродолжить;КонецЕсли;Агент.TerminateSession(Кластер, Сеанс);КонецЦикла;КонецПроцедуры1С (Код)1net stop "1C:Enterprise 8.3 Server Agent"1С (Код)1net start "1C:Enterprise 8.3 Server Agent"1С (Код)123456Процедура ЗавершитьРаботуПользователей()ТекущийЧасДляЗавершения = 22;Если Час(ТекущаяДатаСеанса()) >= ТекущийЧасДляЗавершения ТогдаПрекратитьРаботуСистемы(Ложь);КонецЕсли;КонецПроцедуры
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.