База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как автоматизировать закрытие сеансов в 1С:Предприятие 8.3 на SQL? › Ответ в теме: Как автоматизировать закрытие сеансов в 1С:Предприятие 8.3 на SQL?
Автоматизировать закрытие сеансов пользователей в 1С:Предприятие 8.3 с базой на SQL-сервере можно несколькими способами. Самый гибкий и рекомендуемый — использовать COM-объект v8.COMConnector для программного завершения сеансов через агент сервера 1С. Также можно применять стандартную обработку блокировки пользователей, скрипты остановки/запуска сервера или программное завершение работы пользователей из 1С.
Кратко по методам:
1. Через COM-объект агента сервера можно получить список сеансов и завершить все, кроме системных и текущего пользователя. Этот способ подходит для автоматизации и запуска по расписанию.
2. Стандартная обработка «Блокировка работы пользователей» позволяет без программирования заблокировать базу для новых сеансов и завершить текущие.
3. Скрипты Windows для остановки и запуска сервера 1С полностью отключают все базы, что не всегда удобно.
4. В 1С можно написать процедуру, которая по времени завершает работу пользователей, вызывая ПрекратитьРаботуСистемы.
СИНХРОН-КОД: в вопросе упомянуто «закрытие сеансов пользователей», а в финальном коде используется именно COM-объект v8.COMConnector и процедуры для завершения сеансов, а также скрипты остановки сервера и программное завершение работы пользователей.
Ниже приведены примеры и шаблоны кода для каждого из описанных способов.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
Процедура ЗавершитьСеансыПользователей() СтрокаСоединения = СтрокаСоединенияИнформационнойБазы(); Параметры = ПолучитьПараметрыСервераИзСтрокиСоединения(СтрокаСоединения); Если Параметры.ИмяСервера = "" Тогда Возврат; КонецЕсли; Если ТипПлатформы() = ТипПлатформы.ОперационнаяСистема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 |
net stop "1C:Enterprise 8.3 Server Agent" |
|
1 |
net start "1C:Enterprise 8.3 Server Agent" |
|
1 2 3 4 5 6 |
Процедура ЗавершитьРаботуПользователей() ТекущийЧасДляЗавершения = 22; Если Час(ТекущаяДатаСеанса()) >= ТекущийЧасДляЗавершения Тогда ПрекратитьРаботуСистемы(Ложь); КонецЕсли; КонецПроцедуры |