Как автоматизировать отключение пользователей и выгрузку базы 1С в dt?

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При обслуживании информационных баз 1С часто возникает задача переноса данных между различными СУБД (например, из клиент-серверного варианта SQL в файловый режим для разработки или тестирования). Для создания выгрузки в формате .dt требуется монопольный доступ к базе, что делает необходимым предварительное завершение всех активных сеансов пользователей. Разберем основные способы автоматизации этого процесса: от программного кода внутри платформы до внешних скриптов администрирования кластера.

Способ 1. Программное отключение сеансов средствами встроенного языка 1С

Рассмотрим, как можно завершить сеансы других пользователей непосредственно из сеанса специального сервисного пользователя. Метод опирается на вызов процедур общего модуля СоединенияИБКлиентСервер или работу со списком сеансов информационной базы.

Посмотрим на пример кода, который перебирает активные сеансы и отключает всех пользователей, кроме текущего:


УбитьПользователей = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ЗавершитьРаботуВсехПользователей");

Если УбитьПользователей Тогда
    СеансыИнформационнойБазы = ПолучитьСеансыИнформационнойБазы();
    НомерТекСеанса = НомерСеансаИнформационнойБазы();
    
    Для Каждого СеансИБ Из СеансыИнформационнойБазы Цикл
        Сообщение = "";
        НомерСеансаДляЗавершения = СеансИБ.НомерСеанса;
        
        Если НомерСеансаДляЗавершения = НомерТекСеанса Тогда
            Продолжить;
        КонецЕсли;
        
        Отключено = СоединенияИБКлиентСервер.ОтключитьСеанс(НомерСеансаДляЗавершения, Сообщение);
        
        Если НЕ ПустаяСтрока(Сообщение) И Не Отключено Тогда
            Сообщить(Сообщение);
        КонецЕсли;
        
        Если Отключено Тогда
            Сообщить(НСтр("ru = 'Сеанс завершен.'"));
        КонецЕсли;
    КонецЦикла;
    
    // Завершаем текущий сеанс сервисного пользователя
    ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;

Разберем логику работы этого сценария:

  1. Сервисный пользователь запускается по расписанию (например, через планировщик задач Windows или cron).
  2. В процедуре ПриНачалеРаботыСистемы анализируется специальное право или настройка (например, ЗавершитьРаботуВсехПользователей).
  3. Функция ПолучитьСеансыИнформационнойБазы() возвращает коллекцию активных подключений.
  4. В цикле вызывается отключение каждого сеанса, за исключением текущего, после чего вызывается метод ЗавершитьРаботуСистемы().

Способ 2. Администрирование кластера через утилиту командной строки rac

Проанализируем более надежный и современный подход, не требующий модификации конфигурации: использование утилиты rac, работающей со службой удаленного администрирования ras. Это позволяет корректно заблокировать подключения и завершить активные сеансы перед дампом.

Разберем по шагам последовательность команд для пакетного скрипта:

  1. Установка блокировки соединений и регламентных заданий:

    Для запрета новых подключений и остановки фоновых процессов устанавливается параметр блокировки с указанием кода разрешения:

    rac infobase update --cluster=<ID_Кластера> --infobase=<ID_Базы> --sessions-deny=on --scheduled-jobs-deny=on --permission-code="SecretPass"
  2. Завершение оставшихся активных сеансов:

    С помощью команды получения списка сеансов определяются их идентификаторы, после чего каждый сеанс сбрасывается:

    rac session terminate --cluster=<ID_Кластера> --session=<ID_Сеанса>
  3. Пакетная выгрузка базы в файл dt:

    Запуск конфигуратора в пакетном режиме с использованием параметра /UC для обхода установленной блокировки:

    1cv8.exe DESIGNER /IBConnectionString "Srvr=server1c;Ref=base_name;" /N "Admin" /P "AdminPassword" /UC "SecretPass" /DumpIB "C:\Backups\base_dump.dt" /DisableStartupMessages
  4. Снятие блокировки соединений:

    После завершения выгрузки блокировка снимается обратной командой:

    rac infobase update --cluster=<ID_Кластера> --infobase=<ID_Базы> --sessions-deny=off --scheduled-jobs-deny=off

Способ 3. Завершение сеансов через COM-соединение (V83.COMConnector)

Если автоматизация выстраивается на базе скриптов Windows Script Host (VBScript) или PowerShell, управление кластером можно реализовать через COM-объект V83.COMConnector.

Рассмотрим порядок действий при работе через COM:

  1. Инициализируется объект V83.COMConnector и выполняется подключение к агенту кластера методом ConnectAgent.
  2. Выполняется аутентификация в кластере через Authenticate.
  3. Через метод GetSessions получается список всех сеансов целевой базы данных.
  4. Для каждого сеанса вызывается метод TerminateSession.
  5. Для запрета повторного входа пользователей у объекта описания базы свойствам SessionsDenied и ScheduledJobsDenied присваивается значение True, задается PermissionCode и вызывается UpdateInfoBase.

Ограничения и рекомендации по использованию формата dt

Выясним важные технические нюансы, о которых следует помнить при автоматизации выгрузки в .dt:

  1. Назначение формата: выгрузка информационной базы в файл .dt предназначена разработчиками платформы исключительно для переноса данных между различными СУБД (например, переход с PostgreSQL на MS SQL Server или создание локальной файловой копии). Для регулярного резервного копирования боевых баз следует использовать штатные средства СУБД.
  2. Ограничения файлового формата: при обратной загрузке полученного .dt в файловую базу действует лимит на максимальный объем одной внутренней таблицы (4 ГБ). Если в серверной базе объем отдельных регистров превышает данный порог, загрузка в файловый вариант завершится системной ошибкой.
  3. Риски принудительного завершения процессов (taskkill): жесткое завершение процессов 1cv8.exe или рабочего процесса rphost.exe через утилиты операционной системы приводит к аварийному откату открытых транзакций и зависанию блокировок. Всегда используйте корректное завершение через интерфейсы кластера 1С.
← На главную