В практике администратора или разработчика 1С нередко возникает ситуация, когда необходимо срочно обновить конфигурацию или провести технические работы, требующие монопольного доступа к базе данных. Однако доступ к Консоли администрирования кластера серверов 1С может быть ограничен политиками безопасности, либо сама оснастка MMC может быть недоступна по техническим причинам. В таких случаях нам приходится искать альтернативные способы «выгнать» активных пользователей из системы. Рассмотрим подробно, как это сделать, разберем механику работы платформы и выясним, почему некоторые привычные инструменты (например, расширения) не подходят для этой задачи.
Самый известный в среде специалистов 1С способ принудительного завершения сеансов — это инициирование процесса реструктуризации базы данных через Конфигуратор. Разберем по шагам, почему это работает. Когда мы вносим изменения в структуру данных (а не просто в код), платформа 1С при попытке «Обновить конфигурацию базы данных» (клавиша F7) анализирует изменения. Если они затрагивают физические таблицы SQL, системе требуется монопольный захват базы.
Проанализируем, какие именно объекты лучше всего подходят для этой цели:
_Consts) очень компактная. Добавление новой Константы или изменение длины строковой константы провоцирует платформу выдать диалоговое окно с предложением «Завершить работу пользователей и повторить». После нажатия этой кнопки сервер 1С сам рассылает сигнал завершения всем активным сеансам.Индексировать у любого реквизита (например, с «Не индексировать» на «Индексировать»). Это также приведет к изменению структуры таблиц на уровне СУБД.Важное замечание: Как справедливо отмечено в обсуждении, простое изменение кода модуля (например, текста в модуле приложения) не вызовет предложения выгнать пользователей. Такое обновление предложит «динамическое обновление» (так называемое «демоническое»), которое не прерывает работу сессий, но часто ведет к ошибкам кэша в дальнейшем.
Многие задаются вопросом: «Я добавил реквизит в расширение, обновил базу, но платформа даже не предложила никого выгнать. Где логика?». Разберем техническую причину этого явления. Платформа 1С использует механизм Data Separation для объектов расширений.
Когда вы добавляете новый реквизит или справочник в расширение, платформа не меняет структуру основной таблицы Config и основных таблиц данных основной конфигурации. Данные расширений хранятся в отдельных физических таблицах SQL, названия которых начинаются с префикса _Extension. Поскольку основная база данных при этом не затрагивается, платформе не требуется монопольный доступ к ней. Следовательно, механизм принудительного завершения сеансов просто не задействуется. Это проектное решение 1С, предназначенное для того, чтобы расширения могли внедряться максимально оперативно и без остановки бизнес-процессов.
Если у нас есть возможность запустить внешнюю обработку или внести изменения в код, мы можем воспользоваться встроенными методами встроенного языка 1С. Это гораздо более профессиональный подход, чем манипуляции с метаданными. Проанализируем использование объекта УстановкаБлокировкиСоединенийИнформационнойБазы.
Посмотрим на пример кода, который можно выполнить во внешней обработке:
Блокировка = Новая УстановкаБлокировкиСоединенийИнформационнойБазы;
Блокировка.Начало = ТекущаяДата();
Блокировка.Конец = ТекущаяДата() + 3600; // Блокировка на 1 час
Блокировка.Сообщение = "База закрыта на техническое обслуживание. Просьба завершить работу.";
Блокировка.Установлена = Истина;
Блокировка.РазрешитьРаботуПользователей = Ложь;
Блокировка.РазрешитьРаботуРегламентныхЗаданий = Ложь;
Блокировка.КодРазрешения = "MySecretKey";
УстановитьБлокировкуУстановкиСоединений(Блокировка);
Этот метод программно устанавливает флаг блокировки в параметрах информационной базы на сервере 1С. Платформа начнет рассылать предупреждения пользователям и через некоторое время (обычно 5 минут по умолчанию) принудительно завершит их работу. Обратите внимание на свойство КодРазрешения: оно позволит вам зайти в базу под Администратором через Конфигуратор или Предприятие, даже когда блокировка активна, если вы укажете параметр запуска /UC MySecretKey.
Если графическая консоль недоступна, проанализируем возможности управления через интерфейс командной строки. В составе платформы поставляется утилита rac.exe, которая работает в паре со службой ras (Remote Administration Service).
Выясним алгоритм действий для удаления сеансов:
cluster-id).infobase-id.sessions) и завершаем их командой session terminate.Это «чистый» способ администрирования, который не требует изменения метаданных и не создает лишних индексов в SQL. Рекомендуется использовать именно его, если вы планируете автоматизировать процесс обслуживания базы через скрипты .bat или PowerShell.
Часто даже после того, как все пользователи «выгнаны», Конфигуратор продолжает жаловаться на невозможность монопольного захвата базы. Проанализируем причину: это Фоновые задания. Современные конфигурации (особенно на базе БСП) запускают десятки заданий каждую минуту.
Чтобы эффективно с ними бороться без консоли кластера, необходимо:
УстановитьБлокировкуУстановкиСоединений с параметром РазрешитьРаботуРегламентныхЗаданий = Ложь.SINGLE_USER. Рассмотрим соответствующий скрипт T-SQL:
USE master;
ALTER DATABASE [Имя_Вашей_Базы]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
-- После выполнения обновления верните базу в многопользовательский режим
ALTER DATABASE [Имя_Вашей_Базы]
SET MULTI_USER;
Команда ROLLBACK IMMEDIATE мгновенно обрывает все активные транзакции и соединения, что позволяет Конфигуратору беспрепятственно выполнить реструктуризацию. Это радикальный, но крайне эффективный метод при работе с «упрямыми» сессиями.
Мы рассмотрели несколько способов завершения сеансов без прямого доступа к консоли кластера. Метод с добавлением константы — самый простой и быстрый для разовой задачи, но он требует осторожности при работе с хранилищем конфигурации (так как требует захвата корня). Программная блокировка через УстановитьБлокировкуУстановкиСоединений является наиболее штатным и безопасным вариантом. При использовании любого из методов всегда помните о фоновых заданиях и кэше сервера, который может потребовать очистки после интенсивных манипуляций со структурой данных.