При администрировании серверов 1С:Предприятие одной из рутинных, но критически важных задач является создание тестовых копий (песочниц) из рабочих баз. Это необходимо программистам для отладки и бухгалтерам для экспериментов. Однако, этот процесс таит в себе серьезную опасность: если тестовая база «решит», что она боевая, она может начать отправлять письма клиентам, выгружать данные на сайт или обмениваться информацией с банками.
Стандартный механизм платформы предлагает пользователю диалог «База перемещена или восстановлена из копии?». Но полагаться на человека (человеческий фактор) нельзя: пользователи часто машинально нажимают «Нет», снимая тем самым защиту. Рассмотрим подробно, как автоматизировать процесс установки признака копии и блокировки регламентных заданий, чтобы исключить риск ошибки.
В исходном вопросе автор искал способ изменить признак копии скриптом SQL. Давайте разберем, почему опытные специалисты не рекомендуют этот путь, хотя технически он возможен.
В базе данных 1С информация о том, является ли база перемещенной, хранится не в виде простой настройки «Истина/Ложь» в понятной таблице. Механизм определения копии работает через сравнение текущих параметров подключения с параметрами, сохраненными в системной таблице Params (в записи с ключом DBNames).
Если мы посмотрим на структуру хранения, то увидим следующие проблемы:
Params содержит служебную информацию в бинарном или сериализованном внутреннем формате 1С. Прямое изменение этой строки (UPDATE Params...) чревато разрушением структуры данных, если формат записи изменится в новой версии платформы._ConstXXXX. Имя этой таблицы (XXXX) генерируется динамически и уникально для каждой конфигурации. Чтобы написать универсальный SQL-скрипт, нам пришлось бы сначала парсить таблицу DBSchema, находить нужное имя таблицы константы, а затем выполнять динамический SQL.Поэтому мы рассмотрим более надежные и безопасные методы, которые гарантированно работают и не ломают базу данных.
Самый правильный способ управления настройками базы без входа в конфигуратор — это использование утилиты rac (Remote Administration Client), которая входит в поставку сервера 1С. Этот метод позволяет заблокировать выполнение регламентных заданий на уровне кластера серверов сразу после восстановления базы SQL.
Это решает главную проблему: база не начнет ничего рассылать, пока администратор или разработчик явно не разрешит это.
Алгоритм действий:
Команда для блокировки регламентных заданий выглядит следующим образом:
rac infobase update --cluster= --infobase= --scheduled-jobs-deny=on
Где:
--cluster — идентификатор кластера серверов.--infobase — идентификатор конкретной информационной базы.--scheduled-jobs-deny=on — флаг, устанавливающий блокировку регламентных заданий.Если вы используете аутентификацию администратора кластера, добавьте параметры --cluster-user и --cluster-pwd.
Преимущество этого метода в том, что блокировка устанавливается на уровне службы сервера приложений. Даже если пользователь зайдет в базу и скажет «Это не копия», сервер 1С все равно не запустит фоновые задания, пока администратор не снимет галочку в консоли администрирования.
Разберем интересный подход, который позволяет управлять логикой работы базы через наличие файла на диске. Это удобно, если у вас нет настроенного rac или вы хотите управлять логикой изнутри 1С (например, менять заголовок окна).
Суть метода:
is_copy.lock.Давайте посмотрим, как может выглядеть код в модуле обычного приложения или модуле управляемого приложения в расширении. Нам понадобится событие ПриНачалеРаботыСистемы.
&НаКлиенте
Процедура Расш1_ПриНачалеРаботыСистемы(Отказ)
// Проверяем наличие признака копии
Если ЭтоКопияБазыПоФайлу() Тогда
// Устанавливаем заголовок, чтобы пользователь видел
ОстановитьВыполнение = Ложь;
Попытка
УстановитьЗаголовокКлиентскогоПриложения("!!! ЭТО КОПИЯ БАЗЫ !!!");
Исключение
КонецПопытки;
// Здесь можно вызвать серверный метод для установки безопасного режима
УстановитьБлокировкуВнешнихРесурсовНаСервере();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьБлокировкуВнешнихРесурсовНаСервере()
// Пример для БСП (Библиотека Стандартных Подсистем)
// Устанавливаем параметры блокировки работы с внешними ресурсами
Попытка
// В современных конфигурациях это может отличаться,
// но принцип - установка константы или вызов общего модуля
Константы.ЗапретитьРаботуСВнешнимиРесурсами.Установить(Истина);
Исключение
// Логирование ошибки
КонецПопытки;
КонецПроцедуры
Этот метод хорош тем, что он визуально информирует пользователя. Заголовок окна программы сразу даст понять, где находится бухгалтер.
Если ваши пользователи запускают копию через специальный ярлык (или вы публикуете её на веб-сервере с определенной строкой подключения), можно использовать параметр запуска /C. Это строковый параметр, который можно передать в 1С при старте.
Пример строки запуска:
1cv8.exe ENTERPRISE /S "ServerName\BaseCopy" /C РежимКопии
Теперь доработаем код в модуле приложения (можно также через расширение), чтобы считывать этот параметр. Используем функцию глобального контекста ПараметрЗапуска.
Процедура ПриНачалеРаботыСистемы()
// Анализируем параметр запуска
Если Найти(ПараметрЗапуска, "РежимКопии") > 0 Тогда
// Принудительно глушим вопросы системы
// И устанавливаем признаки безопасности
ОтключитьРегламентныеЗаданияПрограммно();
Сообщить("Система запущена в режиме КОПИИ. Обмены отключены.");
КонецЕсли;
КонецПроцедуры
Если 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("ЭТО КОПИЯ")
Важное примечание: Для работы этого метода в базе должен быть пользователь с правами администратора и заданным паролем, который "зашит" в ваш скрипт обслуживания.
Подведем итоги. Задача «сделать базу копией» сводится к двум целям: технически заблокировать опасные действия и визуально предупредить пользователя.
rac (Метод 1). Это самый надежный способ, так как он работает на уровне кластера серверов 1С и не зависит от кода конфигурации.Комбинация первого и второго метода даст максимальную защиту от случайной отправки данных из тестовой среды в реальный мир.