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

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

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

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

Почему прямой SQL-запрос — не лучшее решение

В исходном вопросе автор искал способ изменить признак копии скриптом SQL. Давайте разберем, почему опытные специалисты не рекомендуют этот путь, хотя технически он возможен.

В базе данных 1С информация о том, является ли база перемещенной, хранится не в виде простой настройки «Истина/Ложь» в понятной таблице. Механизм определения копии работает через сравнение текущих параметров подключения с параметрами, сохраненными в системной таблице Params (в записи с ключом DBNames).

Если мы посмотрим на структуру хранения, то увидим следующие проблемы:

  1. Таблица Params содержит служебную информацию в бинарном или сериализованном внутреннем формате 1С. Прямое изменение этой строки (UPDATE Params...) чревато разрушением структуры данных, если формат записи изменится в новой версии платформы.
  2. Если речь идет о константе конфигурации (например, в БСП это константа, отвечающая за работу с внешними ресурсами), то ее значение хранится в таблице вида _ConstXXXX. Имя этой таблицы (XXXX) генерируется динамически и уникально для каждой конфигурации. Чтобы написать универсальный SQL-скрипт, нам пришлось бы сначала парсить таблицу DBSchema, находить нужное имя таблицы константы, а затем выполнять динамический SQL.

Поэтому мы рассмотрим более надежные и безопасные методы, которые гарантированно работают и не ломают базу данных.

Метод 1: Использование утилиты администрирования RAC (Рекомендуемый)

Самый правильный способ управления настройками базы без входа в конфигуратор — это использование утилиты rac (Remote Administration Client), которая входит в поставку сервера 1С. Этот метод позволяет заблокировать выполнение регламентных заданий на уровне кластера серверов сразу после восстановления базы SQL.

Это решает главную проблему: база не начнет ничего рассылать, пока администратор или разработчик явно не разрешит это.

Алгоритм действий:

  1. Скрипт восстановления базы на SQL Server завершает работу.
  2. Запускается командный файл или менеджер архивации, который обращается к кластеру 1С.

Команда для блокировки регламентных заданий выглядит следующим образом:


rac infobase update --cluster= --infobase= --scheduled-jobs-deny=on

Где:

Если вы используете аутентификацию администратора кластера, добавьте параметры --cluster-user и --cluster-pwd.

Преимущество этого метода в том, что блокировка устанавливается на уровне службы сервера приложений. Даже если пользователь зайдет в базу и скажет «Это не копия», сервер 1С все равно не запустит фоновые задания, пока администратор не снимет галочку в консоли администрирования.

Метод 2: Блокировка через файл-флаг и Расширение конфигурации

Разберем интересный подход, который позволяет управлять логикой работы базы через наличие файла на диске. Это удобно, если у вас нет настроенного rac или вы хотите управлять логикой изнутри 1С (например, менять заголовок окна).

Суть метода:

  1. При автоматическом развертывании копии скрипт создает в каталоге сервера или сетевой папке пустой файл, например is_copy.lock.
  2. В конфигурацию 1С добавляется небольшое Расширение.
  3. В расширении перехватывается событие начала работы системы.

Давайте посмотрим, как может выглядеть код в модуле обычного приложения или модуле управляемого приложения в расширении. Нам понадобится событие ПриНачалеРаботыСистемы.


&НаКлиенте
Процедура Расш1_ПриНачалеРаботыСистемы(Отказ)
    
    // Проверяем наличие признака копии
    Если ЭтоКопияБазыПоФайлу() Тогда
        
        // Устанавливаем заголовок, чтобы пользователь видел
        ОстановитьВыполнение = Ложь;
        Попытка
            УстановитьЗаголовокКлиентскогоПриложения("!!! ЭТО КОПИЯ БАЗЫ !!!");
        Исключение
        КонецПопытки;
        
        // Здесь можно вызвать серверный метод для установки безопасного режима
        УстановитьБлокировкуВнешнихРесурсовНаСервере();
        
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура УстановитьБлокировкуВнешнихРесурсовНаСервере()
    // Пример для БСП (Библиотека Стандартных Подсистем)
    // Устанавливаем параметры блокировки работы с внешними ресурсами
    
    Попытка
        // В современных конфигурациях это может отличаться, 
        // но принцип - установка константы или вызов общего модуля
        Константы.ЗапретитьРаботуСВнешнимиРесурсами.Установить(Истина);
    Исключение
        // Логирование ошибки
    КонецПопытки;
КонецПроцедуры

Этот метод хорош тем, что он визуально информирует пользователя. Заголовок окна программы сразу даст понять, где находится бухгалтер.

Метод 3: Параметры запуска (/C)

Если ваши пользователи запускают копию через специальный ярлык (или вы публикуете её на веб-сервере с определенной строкой подключения), можно использовать параметр запуска /C. Это строковый параметр, который можно передать в 1С при старте.

Пример строки запуска:

1cv8.exe ENTERPRISE /S "ServerName\BaseCopy" /C РежимКопии

Теперь доработаем код в модуле приложения (можно также через расширение), чтобы считывать этот параметр. Используем функцию глобального контекста ПараметрЗапуска.


Процедура ПриНачалеРаботыСистемы()
    
    // Анализируем параметр запуска
    Если Найти(ПараметрЗапуска, "РежимКопии") > 0 Тогда
        
        // Принудительно глушим вопросы системы
        // И устанавливаем признаки безопасности
        ОтключитьРегламентныеЗаданияПрограммно();
        Сообщить("Система запущена в режиме КОПИИ. Обмены отключены.");
        
    КонецЕсли;
    
КонецПроцедуры

Метод 4: Automation (VBS/PowerShell) после восстановления

Если rac недоступен, а менять конфигурацию расширениями не хочется, можно использовать COM-соединение. Скрипт PowerShell или VBScript может подключиться к базе сразу после её поднятия на SQL и выполнить нужный код.

Разберем пример логики на псевдокоде (близком к VBScript/1C), который выполняет внешняя обработка или скрипт:


' Создаем COM-коннектор
Set V8 = CreateObject("V83.COMConnector")
' Подключаемся к базе
Set Connection = V8.Connect("Srvr=""ServerName"";Ref=""BaseCopy"";Usr=""Admin"";Pwd=""Password"";")

' Теперь мы можем обращаться к объектам базы
' Отключаем использование регламентных заданий в самой базе (если есть такая константа)
Connection.Constants.ИспользоватьРегламентныеЗадания.Set(False)

' Или устанавливаем блокировку работы с внешними ресурсами (БСП)
' Внимание: методы БСП часто требуют установки безопасного режима или привилегированного режима
' через COM это может быть сложнее, поэтому проще менять Константы

Connection.Constants.ЗаголовокСистемы.Set("ЭТО КОПИЯ")

Важное примечание: Для работы этого метода в базе должен быть пользователь с правами администратора и заданным паролем, который "зашит" в ваш скрипт обслуживания.

Резюме и рекомендации

Подведем итоги. Задача «сделать базу копией» сводится к двум целям: технически заблокировать опасные действия и визуально предупредить пользователя.

  1. Блокировка фоновых задач: Используйте rac (Метод 1). Это самый надежный способ, так как он работает на уровне кластера серверов 1С и не зависит от кода конфигурации.
  2. Блокировка интеграций (HTTP, почта): Используйте механизмы БСП (блокировка работы с внешними ресурсами). Лучше всего активировать её через расширение при старте (Метод 2) или через параметры запуска (Метод 3).
  3. Визуализация: Обязательно меняйте заголовок окна через расширение (Метод 2). Пользователь должен видеть красную надпись «КОПИЯ».

Комбинация первого и второго метода даст максимальную защиту от случайной отправки данных из тестовой среды в реальный мир.

← На главную