В процессе администрирования баз данных 1С часто возникает необходимость программно завершить работу пользователей — для этого есть обработка принудительного завершения сеансов по расписанию. Это требуется для проведения регламентных работ, таких как создание резервной копии (выгрузка .dt), обновление конфигурации или исправление критических ошибок. Одной из распространенных проблем является ошибка "Метод объекта не обнаружен (ОтключитьСеанс)", которая возникает из-за различий в версиях платформы, режимах совместимости или использовании устаревших методов БСП. Разберем подробно, как реализовать механизм отключения сеансов правильно.
Ошибка часто связана с тем, что программисты пытаются вызвать метод ОтключитьСеанс() непосредственно у объектов, которые его не поддерживают в текущем режиме совместимости (например, 8.2). В платформе 1С управление сеансами на серверном варианте осуществляется через COM-соединение с агентом сервера или через консольную утилиту rac — упрощает процесс готовая панель управления кластерами и сеансами 1С. Если ваша конфигурация (например, Альфа-Авто на обычных формах) имеет древнюю версию БСП, стандартные механизмы могут просто отсутствовать в коде. Решение заключается в написании собственной процедуры взаимодействия с COMConnector.
Для того чтобы управлять сеансами, нам необходимо подключиться к агенту сервера 1С, найти нужный кластер и информационную базу. Рассмотрим универсальный код, который позволяет перебрать все активные соединения и завершить их, за исключением текущего сеанса администратора.
Разберем алгоритм по шагам:
V83.COMConnector.TerminateSession.
Процедура ЗавершитьВсеСеансыНаСервере()
// 1. Инициализация параметров подключения
// Эти данные можно получить из строки соединения ИБ
ИмяСервера = "ИмяВашегоСервера"; // Например, "Server1C"
ИмяБазы = "ИмяВашейБазы"; // Как она называется в консоли администрирования
// Данные администратора кластера (не путать с пользователем 1С!)
АдминКластера = "admin";
ПарольКластера = "password";
Попытка
Коннектор = Новый COMОбъект("v83.COMConnector.1");
Исключение
Сообщить("Не удалось создать COM-объект. Проверьте регистрацию v83.comconnector в системе.");
Возврат;
КонецПопытки;
Попытка
// Подключаемся к агенту сервера
Агент = Коннектор.ConnectAgent(ИмяСервера);
Кластеры = Агент.GetClusters();
Для Каждого Кластер Из Кластеры Цикл
// Проходим аутентификацию администратора кластера
Агент.Authenticate(Кластер, АдминКластера, ПарольКластера);
// Получаем список информационных баз в кластере
Базы = Агент.GetInfoBases(Кластер);
Для Каждого База Из Базы Цикл
Если нРег(База.Name) = нРег(ИмяБазы) Тогда
// Получаем сеансы конкретной базы
Сеансы = Агент.GetInfoBaseSessions(Кластер, База);
Для Каждого Сеанс Из Сеансы Цикл
// Пропускаем фоновые задания и конфигуратор, если нужно
Если нРег(Сеанс.AppID) = "backgroundjob" Тогда
Продолжить;
КонецЕсли;
// Пропускаем текущего пользователя, чтобы не "выбить" самого себя
Если Сеанс.UserName = ИмяПользователя() Тогда
Продолжить;
КонецЕсли;
// Завершаем сеанс
Агент.TerminateSession(Кластер, Сеанс);
Сообщить("Сеанс пользователя " + Сеанс.UserName + " завершен.");
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Исключение
Сообщить("Ошибка администрирования: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Важный нюанс: Если вы используете 64-битную платформу, убедитесь, что COM-компонента зарегистрирована корректно. В некоторых случаях может потребоваться настройка в Component Services (Службы компонентов) Windows для запуска 32-битного COM-объекта в 64-битной среде.
Часто автоматическая выгрузка .dt не срабатывает, потому что в базе "забыт" открытый Конфигуратор. Он считается активным сеансом и блокирует монопольный доступ. Чтобы закрыть именно его, проанализируем свойство AppID сеанса. У конфигуратора оно обычно равно Designer.
Рассмотрим модифицированный пример кода для закрытия только конфигураторов:
Для Каждого ТекСеанс Из СеансыИБ Цикл
// Проверяем тип приложения
Если ТекСеанс.AppID = "Designer" Или ТекСеанс.AppID = "Designer" Тогда
Сообщить("Закрываем забытый конфигуратор пользователя: " + ТекСеанс.userName);
СоединениеСАгентом.TerminateSession(РабочийКластер, ТекСеанс);
КонецЕсли;
КонецЦикла;
После вызова этого метода в самом Конфигураторе у пользователя появится окно "Сеанс завершен администратором". Это позволяет корректно освободить базу для работы скрипта архивации.
Проанализируем ситуацию, когда пользователь работает через терминальный сервер (RDP). Часто бывает так, что пользователь закрывает окно терминала "крестиком", не выходя из 1С. В этом случае сессия в Windows переходит в состояние Disconnected, но процесс 1cv8.exe продолжает висеть и удерживать сеанс в базе.
Чтобы предопределенная процедура ПередЗавершениемРаботыСистемы() сработала, 1С должна закрыться штатно. Если же администратор принудительно "убивает" сеанс RDP или происходит сбой сети, эта процедура не вызывается.
Как с этим бороться:
Disconnected более 15 минут, сервер должен его завершить автоматически.ready_to_backup.txt). А в планировщике задач Windows настройте скрипт, который раз в 10 минут проверяет наличие этого файла и отсутствие активных процессов 1С, после чего запускает бэкап.В обсуждении был затронут вопрос формирования имени файла бэкапа, если работа затянулась за полночь. Если запустить выгрузку в 00:05, стандартная команда даты в CMD выдаст уже "сегодняшнее" число, хотя бэкап логически относится к "вчерашнему" рабочему дню.
Вместо сложных конструкций на чистом BAT, рекомендуем использовать PowerShell для получения вчерашней даты одной строкой внутри вашего скрипта:
@echo off
for /f "tokens=*" %%i in ('powershell -NoProfile -Command "(Get-Date).AddDays(-1).ToString('yyyy-MM-dd')"') do set YESTERDAY=%%i
set BakName="F:\Backups\BaseBackup_%YESTERDAY%.dt"
"C:\Program Files\1cv8\8.3.10.2466\bin\1cv8.exe" DESIGNER /S "Server\Base" /N "Admin" /P "Pass" /DumpIB %BakName% /Out "log.txt" -NoTruncate
Если вы пытаетесь запустить задачу планировщика из 1С командой ЗапуститьПриложение("schtasks /run /tn MyTask"), она может не сработать под рядовым пользователем. Это происходит потому, что управление планировщиком требует прав администратора системы.
Проанализируем варианты решения:
SYSTEM или Network Service.Подведем итог: для надежного отключения сеансов используйте V83.COMConnector с обязательной авторизацией администратора кластера. Для борьбы с "зависшими" терминальными сессиями настройте политики сервера Windows, а задачи архивации лучше делегируйте системному планировщику, используя 1С только как инициатор процесса через файловые флаги.