При обслуживании информационных баз 1С часто возникает задача переноса данных между различными СУБД (например, из клиент-серверного варианта SQL в файловый режим для разработки или тестирования). Для создания выгрузки в формате .dt требуется монопольный доступ к базе, что делает необходимым предварительное завершение всех активных сеансов пользователей. Разберем основные способы автоматизации этого процесса: от программного кода внутри платформы до внешних скриптов администрирования кластера.
Рассмотрим, как можно завершить сеансы других пользователей непосредственно из сеанса специального сервисного пользователя. Метод опирается на вызов процедур общего модуля СоединенияИБКлиентСервер или работу со списком сеансов информационной базы.
Посмотрим на пример кода, который перебирает активные сеансы и отключает всех пользователей, кроме текущего:
УбитьПользователей = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ЗавершитьРаботуВсехПользователей");
Если УбитьПользователей Тогда
СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы();
НомерТекСеанса = НомерСеансаИнформационнойБазы();
Для Каждого СеансИБ Из СеансыИнформационнойБазы Цикл
Сообщение = "";
НомерСеансаДляЗавершения = СеансИБ.НомерСеанса;
Если НомерСеансаДляЗавершения = НомерТекСеанса Тогда
Продолжить;
КонецЕсли;
Отключено = СоединенияИБКлиентСервер.ОтключитьСеанс(НомерСеансаДляЗавершения, Сообщение);
Если НЕ ПустаяСтрока(Сообщение) И Не Отключено Тогда
Сообщить(Сообщение);
КонецЕсли;
Если Отключено Тогда
Сообщить(НСтр("ru = 'Сеанс завершен.'"));
КонецЕсли;
КонецЦикла;
// Завершаем текущий сеанс сервисного пользователя
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
Разберем логику работы этого сценария:
ПриНачалеРаботыСистемы анализируется специальное право или настройка (например, ЗавершитьРаботуВсехПользователей).ПолучитьСеансыИнформационнойБазы() возвращает коллекцию активных подключений.ЗавершитьРаботуСистемы().Проанализируем более надежный и современный подход, не требующий модификации конфигурации: использование утилиты rac, работающей со службой удаленного администрирования ras. Это позволяет корректно заблокировать подключения и завершить активные сеансы перед дампом.
Разберем по шагам последовательность команд для пакетного скрипта:
Для запрета новых подключений и остановки фоновых процессов устанавливается параметр блокировки с указанием кода разрешения:
rac infobase update --cluster=<ID_Кластера> --infobase=<ID_Базы> --sessions-deny=on --scheduled-jobs-deny=on --permission-code="SecretPass"
С помощью команды получения списка сеансов определяются их идентификаторы, после чего каждый сеанс сбрасывается:
rac session terminate --cluster=<ID_Кластера> --session=<ID_Сеанса>
Запуск конфигуратора в пакетном режиме с использованием параметра /UC для обхода установленной блокировки:
1cv8.exe DESIGNER /IBConnectionString "Srvr=server1c;Ref=base_name;" /N "Admin" /P "AdminPassword" /UC "SecretPass" /DumpIB "C:\Backups\base_dump.dt" /DisableStartupMessages
После завершения выгрузки блокировка снимается обратной командой:
rac infobase update --cluster=<ID_Кластера> --infobase=<ID_Базы> --sessions-deny=off --scheduled-jobs-deny=off
Если автоматизация выстраивается на базе скриптов Windows Script Host (VBScript) или PowerShell, управление кластером можно реализовать через COM-объект V83.COMConnector.
Рассмотрим порядок действий при работе через COM:
V83.COMConnector и выполняется подключение к агенту кластера методом ConnectAgent.Authenticate.GetSessions получается список всех сеансов целевой базы данных.TerminateSession.SessionsDenied и ScheduledJobsDenied присваивается значение True, задается PermissionCode и вызывается UpdateInfoBase.Выясним важные технические нюансы, о которых следует помнить при автоматизации выгрузки в .dt:
.dt предназначена разработчиками платформы исключительно для переноса данных между различными СУБД (например, переход с PostgreSQL на MS SQL Server или создание локальной файловой копии). Для регулярного резервного копирования боевых баз следует использовать штатные средства СУБД..dt в файловую базу действует лимит на максимальный объем одной внутренней таблицы (4 ГБ). Если в серверной базе объем отдельных регистров превышает данный порог, загрузка в файловый вариант завершится системной ошибкой.1cv8.exe или рабочего процесса rphost.exe через утилиты операционной системы приводит к аварийному откату открытых транзакций и зависанию блокировок. Всегда используйте корректное завершение через интерфейсы кластера 1С.