Администрирование · 10 мин
Как закрыть сеанс 1С программно
Как программно завершить сеанс 1С: ЗавершитьРаботуСистемы, консоль кластера, административный API, регламентные задания. Примеры кода, риски, типичные ошибки.
Программное завершение сеанса 1С требуется в двух типичных ситуациях: когда нужно корректно закрыть текущий сеанс пользователя из встроенного кода и когда администратору необходимо принудительно завершить чужие сеансы — например, перед обновлением конфигурации или регламентным обслуживанием базы. В обоих случаях есть штатные механизмы платформы, и выбирать их нужно в зависимости от того, где выполняется код: в клиенте, на сервере или вне платформы.
Главное различие — между «мягким» завершением, при котором платформа корректно завершает работу и освобождает ресурсы, и принудительным разрывом соединения, при котором незавершённые транзакции откатываются. Неправильный выбор способа приводит к потере несохранённых данных пользователей, поэтому перед массовым завершением сеансов стоит предупредить пользователей штатной рассылкой сообщений.
Ниже разобраны основные способы: процедура ЗавершитьРаботуСистемы, методы глобального контекста для управления сеансами, консоль кластера серверов, административный интерфейс RAS и завершение сеансов из внешних скриптов. Для каждого способа приведены условия применения, примеры кода и ограничения.
Завершение текущего сеанса процедурой ЗавершитьРаботуСистемы
Основной способ закрыть свой сеанс из встроенного языка — глобальная процедура ЗавершитьРаботуСистемы(). У неё два параметра: первый (булево) отвечает за запрос подтверждения у пользователя, второй — за перезапуск после завершения. Вызов ЗавершитьРаботуСистемы(Ложь) закрывает приложение без лишних вопросов, а ЗавершитьРаботуСистемы(Истина) покажет стандартный диалог подтверждения.
Типичный сценарий — автоматическое закрытие программы после выполнения пакетной операции в тонком клиенте, запущенном по расписанию. Например, обработка выполнила обмен данными и должна освободить лицензию:
&НаКлиенте
Процедура ПослеВыгрузкиДанных(Результат, ДополнительныеПараметры) Экспорт
Если Результат.Успешно Тогда
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
Учтите, что процедура доступна только на клиенте. Вызов её в серверном контексте невозможен — серверный код не управляет клиентским приложением напрямую. Если логика выполняется на сервере, решение о завершении нужно передавать на клиент через возвращаемое значение или оповещение.
Мягкое завершение с предупреждением пользователей
Когда сеанс нужно закрыть не сразу, а через заданное время, используют связку обработчиков ожидания и предупреждений. Это стандартный подход для принудительного, но вежливого завершения работы — например, при плановом обновлении конфигурации в файловой базе, где всех пользователей нужно вывести из программы.
Схема такая: при старте сеанса или по сигналу извне (через константу-флаг, параметр сеанса или файл-маркер) на клиенте запускается обработчик ожидания, который показывает предупреждение и по истечении таймаута вызывает завершение работы:
&НаКлиенте
Процедура КонтрольЗавершенияРаботы() Экспорт
Если ТребуетсяЗавершениеРаботы() Тогда
ПоказатьПредупреждение(
Новый ОписаниеОповещения("ЗавершитьПослеПредупреждения", ЭтотОбъект),
"Работа программы будет завершена через 5 минут. Сохраните данные.",
300);
КонецЕсли;
КонецПроцедуры
Функция ТребуетсяЗавершениеРаботы() в этом примере — серверная, она проверяет признак, установленный администратором. Такой подход даёт пользователям время сохранить документы и снижает риск потери данных до минимума.
Завершение чужих сеансов через консоль кластера
Для клиент-серверных баз штатный инструмент администратора — консоль кластера серверов 1С. В ней сеансы видны в разделе конкретной информационной базы, и любой сеанс можно удалить контекстной командой. Это ручной способ, но он ложится в основу программных методов, потому что те же операции доступны через административные интерфейсы.
Программно ту же задачу решают двумя путями: через утилиту командной строки RAC (при работающей службе агента сервера) или через протокол администрирования RAS, который позволяет обращаться к кластеру по HTTP. Оба варианта требуют учётных данных администратора кластера или информационной базы.
rac session --cluster=<ID_кластера> terminate --session=<ID_сеанса>Идентификаторы кластера и сеансов получают командами rac cluster list и rac session list. В скриптах вывод разбирают построчно и завершают сеансы выборочно — например, все сеансы конкретной базы или все фоновые задания. Это стандартный приём при автоматизации обновлений: сначала блокируется запуск новых сеансов, затем завершаются существующие, далее выполняется обновление конфигурации.
Завершение сеансов из кода через COM и административный API
Из встроенного языка 1С сеансы кластера завершают через COM-объект V83.ComConnector (имя зависит от версии платформы) либо через HTTP-запросы к сервису RAS. Вариант с COM подходит, когда код выполняется на машине с установленной платформой той же версии, что и сервер.
Общая логика одинакова: установить соединение с агентом сервера, получить список сеансов информационной базы, отфильтровать нужные и вызвать прерывание. Перед завершением полезно отправить пользователям сообщения — для этого в объектах администрирования есть соответствующие методы.
- 1Установите блокировку начала новых сеансов для информационной базы
- 2Получите список активных сеансов через RAC, RAS или COM
- 3Отправьте пользователям сообщение с просьбой завершить работу
- 4Выждите регламентное время (обычно 5–15 минут)
- 5Завершите оставшиеся сеансы принудительно
- 6Проверьте, что активных сеансов не осталось, и приступайте к обслуживанию
Для файловых баз кластерные механизмы недоступны. Там применяют файловые маркеры: администратор создаёт файл-блокировку, клиентские сеансы периодически проверяют его наличие обработчиком ожидания и самостоятельно завершают работу. Это менее надёжно, чем серверное прерывание, но единственный штатный вариант без сторонних средств.
Риски и типичные ошибки
Принудительное прерывание сеанса — это аварийная операция. Незавершённые транзакции откатываются, несохранённые данные форм теряются, а в редких случаях при разрыве в момент записи возможны ошибки, требующие тестирования и исправления базы. Поэтому принудительное завершение всегда должно идти после предупреждения и таймаута, а не вместо них.
Проверка результата
После завершения сеансов нужно убедиться, что база действительно свободна. В консоли кластера список сеансов информационной базы должен быть пуст (кроме, возможно, вашего собственного административного соединения). При работе через RAC повторный вызов rac session list покажет оставшиеся сеансы.
Как проверить результат
Активных пользовательских сеансов нет
Сеансы появляются снова — не установлена блокировка подключений
Установлена с датой окончания и сообщением для пользователей
Блокировка не задана — новые подключения возможны
Нет выполняющихся заданий по базе
Задание активно — его прерывание может повредить данные
Если сеансы «возрождаются» после завершения, причина почти всегда одна: не включена блокировка начала сеансов, и пользователи (или автоматически перезапускаемые клиенты) подключаются заново. Проверьте также регламентные задания на стороне сервера — они создают фоновые сеансы по расписанию.
FAQ
Можно ли закрыть сеанс 1С по таймеру без действий пользователя?
Да. На клиенте запускается ПодключитьОбработчикОжидания с нужным интервалом, в обработчике проверяется условие (время, флаг в базе) и вызывается ЗавершитьРаботуСистемы(Ложь). Для гарантированного закрытия без диалогов убедитесь, что нет модифицированных открытых форм.
Чем отличается ЗавершитьРаботуСистемы от ПрерватьРаботуСистемы?
ЗавершитьРаботуСистемы выполняет штатное закрытие с возможными вопросами о сохранении. Прерывание работы — аварийное, без сохранения данных, и применяется только в исключительных ситуациях, когда штатное завершение невозможно.
Как завершить сеансы в файловой базе, если нет сервера 1С?
Штатного прерывания для файловой базы нет. Используют файл-маркер: администратор создаёт файл в общем каталоге, клиентские сеансы обработчиком ожидания обнаруживают его и завершают работу сами. Либо процессы 1cv8.exe завершают средствами ОС на каждой машине — это грубый аварийный вариант.
Нужны ли особые права для завершения чужих сеансов?
Да. Через консоль кластера, RAC или RAS требуется аутентификация администратора кластера или администратора информационной базы. Без этих прав команды завершения сеансов вернут ошибку доступа.
Что происходит с несохранёнными данными при принудительном разрыве сеанса?
Незавершённые транзакции откатываются СУБД, данные в открытых, но не записанных формах теряются безвозвратно. Именно поэтому перед массовым завершением сеансов обязательна рассылка предупреждений и выдержка времени.
Можно ли завершить только фоновые сеансы, не трогая пользователей?
Да. В списке сеансов (консоль кластера, RAC) сеансы различаются по типу приложения — фоновые задания видны отдельно. Фильтруйте список по признаку приложения и завершайте только нужные сеансы, либо отключите регламентные задания для базы на время обслуживания.
Что важно запомнить
Свой сеанс закрывайте через ЗавершитьРаботуСистемы(Ложь) на клиенте. Чужие сеансы в клиент-серверной базе завершайте через консоль кластера, RAC или RAS, предварительно заблокировав новые подключения и предупредив пользователей. Принудительный разрыв — крайняя мера: несохранённые данные при нём теряются.