При работе с информационными базами 1С на платформе 8.3 часто возникает необходимость создания тестовых копий. Одной из критических проблем в таких случаях является случайный запуск регламентных заданий в копии, которые могут начать рассылать реальные письма клиентам, выгружать данные на сайт или обмениваться информацией с внешними системами. В конфигурациях, построенных на базе Библиотеки стандартных подсистем (БСП), предусмотрены штатные механизмы защиты, однако для самописных заданий они требуют правильной настройки. В этой статье мы подробно разберем, как гарантированно предотвратить выполнение вашего кода в копии базы.
Для начала проанализируем, как система понимает, что она запущена не в основной базе. БСП при старте сравнивает текущие параметры подключения (имя сервера СУБД и имя базы данных) с теми, которые были зафиксированы ранее. Если параметры изменились, система выводит пользователю диалоговое окно с вопросом: «Информационная база перемещена или восстановлена из копии?».
Если пользователь выбирает ответ «Это копия информационной базы», система устанавливает специальный признак блокировки. Важно понимать, что сама по себе платформа 1С не останавливает все регламентные задания автоматически только из-за этого выбора. БСП блокирует «работу с внешними ресурсами». Чтобы ваше самописное задание подчинилось этому правилу, необходимо внести изменения в его программный код.
Рассмотрим наиболее правильный и «чистый» способ с точки зрения архитектуры БСП. Чтобы ваше задание корректно завершалось в копии, в самом начале его основной процедуры необходимо вызвать метод проверки. Проанализируем пример кода:
Процедура МоеРегламентноеЗадание() Экспорт
// Проверка БСП: если база признана копией, выполнение будет прервано
// и в журнал регистрации запишется соответствующее событие.
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания();
// Далее идет полезная нагрузка задания
ВыполнитьПолезныеДействия();
КонецПроцедуры
Функция ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания() проверяет значение параметра сеанса РаботаСВнешнимиРесурсамиЗаблокирована. Если блокировка включена, функция инициирует исключение, выполнение задания прекращается, а в консоли заданий оно получит статус «Ошибка» (или будет просто остановлено в зависимости от версии БСП).
Для того чтобы самописное задание полноценно интегрировалось в экосистему БСП (например, чтобы его можно было настраивать через стандартную форму «Регламентные и фоновые задания»), его нужно зарегистрировать. Выясним, как это сделать:
РегламентныеЗаданияПереопределяемый.ПриОпределенииНастроекРегламентныхЗаданий добавим описание нашего задания.Это позволит системе «узнать» ваше задание и применять к нему общие правила блокировки более гибко. Если этого не сделать, вызов ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания() все равно будет работать (так как он проверяет глобальный параметр сеанса), но управление заданием через интерфейс будет ограничено.
Иногда возникают ситуации, когда использование механизмов БСП невозможно или требуется дополнительная «защита от дурака», которая не зависит от того, что ответил пользователь в диалоговом окне. В этом случае мы можем реализовать проверку строки соединения информационной базы. Рассмотрим пример функции:
Функция ЭтоРабочаяБаза()
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
// Определяем эталонные параметры (должны соответствовать рабочей базе)
ЭталонСервер = "PROD-SERVER";
ЭталонБаза = "Accounting_Production";
// Анализируем строку (упрощенный пример поиска подстрок)
Если Найти(ВРег(СтрокаСоединения), ВРег(ЭталонСервер)) > 0
И Найти(ВРег(СтрокаСоединения), ВРег(ЭталонБаза)) > 0 Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
При использовании этого метода важно учитывать несколько нюансов, которые мы обнаружили в практике:
Server1 и SERVER1). Всегда приводите строки к верхнему регистру функцией ВРег().Разберем подробнее, что происходит, когда в БСП установлена блокировка внешних ресурсов. Система не просто «выключает» задания. Она перехватывает попытки обращения к определенным объектам. Блокируются:
Почта, ИнтернетПочта).Важный момент: если ваше задание выполняет внутренние расчеты (например, пересчет итогов или очистку логов), оно может продолжать работать даже в копии, если вы явно не добавили проверку в код. Если такие расчеты в копии нежелательны (например, они создают большую нагрузку на сервер), проверка через ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания() обязательна.
Посмотрим на ситуацию со стороны системного администратора. Если вы восстанавливаете базу из бэкапа MSSQL, свойство «Блокировка регламентных заданий» в консоли кластера 1С не устанавливается автоматически. Проанализируем правильный алгоритм развертывания копии:
Также полезно знать о параметре запуска конфигуратора /AllowExecuteScheduledJobs -Off. С его помощью можно гарантированно выключить задания до того, как кто-либо зайдет в базу и нажмет кнопку в окне БСП.
Подводя итог, выделим «Best Practice» для разработчика на БСП:
1. Всегда вставляйте ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания() первой строкой в код любого регламентного задания.
2. Если задание критически опасное (например, финансовые транзакции с внешними API), добавьте вторую линию защиты в виде проверки ПараметрыСеанса.РаботаСВнешнимиРесурсамиЗаблокирована или сверки СтрокаСоединенияИнформационнойБазы() с константой, где хранится имя рабочей базы.
3. Помните, что признак «Копия» в БСП — это не только техническая настройка, но и результат осознанного выбора пользователя при первом запуске. Если администратор по ошибке ответит «Это рабочая база», все механизмы БСП будут считать базу рабочей, и только ручная проверка строки соединения сможет спасти ситуацию.