Как правильно завершить работу пользователей в 1С для автоматической выгрузки базы

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

При попытке автоматизировать создание резервных копий в формате .dt системные администраторы часто сталкиваются с парадоксальной ситуацией. Мы используем штатный ключ командной строки /CЗавершитьРаботуПользователей, платформа честно выгоняет всех пользователей, но оставляет активным сеанс самого администратора (инициатора процесса). В итоге база не переходит в монопольный режим, и попытка выгрузки через /DumpIB завершается ошибкой. Рассмотрим подробно, почему так происходит, и разберем эффективные способы решения этой задачи.

Разберем причину: почему сеанс администратора не закрывается

Важно понимать, что ключ /C — это всего лишь способ передачи параметра внутрь программного кода конфигурации. Платформа сама по себе не анализирует содержимое этой строки. В типовых конфигурациях, построенных на Библиотеке Стандартных Подсистем (БСП), написан код, который считывает этот параметр и запускает процедуру завершения сеансов.

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

Способ 1. Использование внешней обработки для «самоубийства» сеанса

Один из самых простых и эффективных «деревянных» способов — заставить администраторский сеанс закрыться сразу после того, как он отдаст команду на отключение остальных. Для этого мы можем создать небольшую внешнюю обработку и запустить ее через ключ /Execute.

Алгоритм действий будет следующим:

  1. Создаем внешнюю обработку (например, CloseSession.epf).
  2. В модуле формы обработки в процедуре ПриОткрытии (или ПриСозданииНаСервере для управляемых форм) прописываем команду завершения работы системы.
  3. Запускаем 1С со следующей комбинацией ключей:

Пример командной строки:

1cv8.exe ENTERPRISE /F "ПутьКБазе" /N "Admin" /P "Pass" /C ЗавершитьРаботуПользователей /Execute "C:\Scripts\CloseSession.epf"

В этом случае ключ /C отработает через механизмы БСП и установит блокировку, а внешняя обработка закроет само окно 1С, освободив базу для последующей выгрузки.

Способ 2. Программная модификация через расширение

Если мы не боимся вносить небольшие правки в логику работы системы (что безопасно при использовании расширений), можно скорректировать поведение процедуры завершения работы. Посмотрим на пример кода, который можно добавить в расширение для модуля СоединенияИБКлиент:


&После("ЗавершитьРаботуПользователей")
Процедура ЗавершитьРаботуПользователей(ТекущийРежим)
    Если ПараметрыКлиента.ПроцедураЗавершитьРаботуПользователейУжеВыполняется = Ложь Тогда
        // Принудительно завершаем текущий сеанс администратора
        ЗавершитьРаботуЭтогоСеанса();
    КонецЕсли;
КонецПроцедуры

Этот код гарантирует, что после того, как БСП выполнит стандартную процедуру УдалитьВсеСеансыКромеТекущего, сам «текущий» сеанс тоже будет закрыт. Это позволит избежать «зависшего» администратора.

Способ 3. Трехэтапный сценарий (Best Practice)

Проанализируем правильный алгоритм автоматизации через .bat или .powershell скрипты. Ошибка многих заключается в попытке сделать всё в один шаг. Разделим процесс на этапы:

  1. Блокировка: Запускаем 1С в режиме ENTERPRISE с ключом /CЗавершитьРаботуПользователей. Это устанавливает флаг блокировки в базе.
  2. Пауза и очистка: Выжидаем 1–2 минуты (сеансы пользователей закрываются не мгновенно). Для гарантии можно использовать команду taskkill /F /IM 1cv8*, чтобы принудительно завершить оставшиеся процессы 1С, а также выполнить очистку кэша 1С через батник.
  3. Выгрузка: Запускаем Конфигуратор DESIGNER с ключом /DumpIB. Важно: для работы в заблокированной базе обязательно используйте ключ /UC (код разрешения). Код разрешения по умолчанию в БСП часто соответствует строке ЗавершитьРаботуПользователей.
  4. Разблокировка: После завершения выгрузки запускаем 1С снова с ключом /CРазрешитьРаботуПользователей /UC <КодРазрешения>.

Пример ключа для заблокированной базы:

1cv8.exe DESIGNER /F "Путь" /N "Admin" /P "Pass" /DumpIB "C:\Backup\base.dt" /UC ЗавершитьРаботуПользователей

Способ 4. Профессиональный подход через RAS/RAC (для серверных баз)

Если ваша база работает в клиент-серверном варианте, забудьте про ключи /C. Рассмотрим более надежный инструмент — утилиту rac.exe (или ras.exe). Она позволяет управлять кластером серверов напрямую, не запуская само приложение 1С.

С помощью rac можно программно:

Это исключает «человеческий фактор» и проблемы с кодом БСП, так как управление идет на уровне платформы и сервера приложений.

Важное замечание о формате .dt

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

Проанализируем риски: при создании .dt происходит реструктуризация. Если в индексах или таблицах есть логические ошибки, выгрузка может пройти успешно, а вот загрузить такой файл обратно в базу часто бывает невозможно. Для надежной защиты данных в промышленной эксплуатации всегда используйте средства СУБД (SQL Server Management Studio, архивирование PostgreSQL на Linux) или технологию VSS (Volume Shadow Copy) для «горячего» копирования файловых баз .1CD.

← На главную