Как в 1С программно определить тип базы и запретить выполнение регламентных заданий в копиях?

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

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

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

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

  1. Для файловой базы строка всегда начинается с фрагмента File="...", где указан локальный или сетевой путь к каталогу с файлом 1Cv8.1CD.
  2. Для клиент-серверной базы (SQL) строка содержит параметры подключения к серверу приложений: Srvr="...";Ref="...";, где в ключе Ref передается точное имя информационной базы в кластере 1С.

Посмотрим на пример функции, определяющей режим работы информационной базы:


Функция БазаЯвляетсяФайловой() Экспорт
    СтрокаСоединения = ВРег(СтрокаСоединенияИнформационнойБазы());
    Возврат (Найти(СтрокаСоединения, "FILE=") > 0);
КонецФункции

Если в кастомном регламентном задании необходимо запускать обработку только в клиент-серверной базе, достаточно добавить проверку в самое начало исполняемой процедуры:


Процедура ВыполнитьОбменДанными() Экспорт
    Если БазаЯвляетсяФайловой() Тогда
        Возврат;
    КонецЕсли;
    
    // Основная логика регламентного задания
КонецПроцедуры

Способ 2. Использование механизмов БСП (Библиотеки Стандартных Подсистем)

В типовых конфигурациях (таких как 1С:ЗУП 3, 1С:ERP, 1С:КА, 1С:УТ) уже реализованы готовые методы и подсистема блокировки работы с внешними ресурсами. Рассмотрим их применение подробнее.

Для быстрой проверки типа базы в общем модуле БСП доступна готовая функция:


Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
    // База файловая
КонецЕсли;

Однако простого разделения на «файловая / клиент-серверная» часто недостаточно. Копия базы для тестирования может быть также развернута на SQL-сервере. В этом случае БСП предлагает подсистему «Блокировка работы с внешними ресурсами». При первом открытии перемещенной или скопированной базы система задает администратору вопрос: «Это копия или база перемещена?». При выборе варианта копии автоматически выставляется блокировка.

Чтобы собственные регламентные задания или интеграции не выполнялись в копиях, проверим состояние блокировки через параметр сеанса или вызов метода БСП:


Процедура МоеРегламентноеЗадание() Экспорт
    Если ПараметрыСеанса.РаботаСВнешнимиРесурсамиЗаблокирована Тогда
        Возврат;
    КонецЕсли;
    
    // Алгоритм интеграции
КонецПроцедуры

Способ 3. Защита в подписках на события

Подписки на события выполняются синхронно в момент записи или проведения документов и справочников. Если обработчик события отправляет данные во внешние системы (HTTP-запросы, почта, сторонние API), его работу также необходимо блокировать в копиях.

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


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

Проверка значения ПараметрыСеанса.РаботаСВнешнимиРесурсамиЗаблокирована работает мгновенно в памяти сервера и не замедляет транзакцию записи объекта.

Способ 4. Сверка с эталонной строкой подключения

Наиболее надежный подход для исключения ошибок интеграций при любых конфигурациях серверов — хранение эталонной строки подключения рабочей базы в константе.

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

Процедура ВыполнитьКритичнуюВыгрузку() Экспорт
    ТекущаяСтрока = ВРег(СтрокаСоединенияИнформационнойБазы());
    ЭталоннаяСтрока = ВРег(Константы.СтрокаПодключенияРабочейБазы.Получить());
    
    Если ТекущаяСтрока <> ЭталоннаяСтрока Тогда
        Возврат; // Запуск происходит в копии базы
    КонецЕсли;
    
    // Выполнение отправки
КонецПроцедуры

Способ 5. Платформенное отключение регламентных заданий без изменения кода

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

  1. Для файловой базы: запускаем толстый или тонкий клиент 1С с дополнительным ключом командной строки /DisableScheduledJobs (или /ЗапретитьРегламентныеЗадания). В этом случае сеанс пользователя не будет инициализировать менеджер фоновых заданий.
  2. Для клиент-серверной базы: в консоли администрирования серверов 1С Предприятия в свойствах тестовой информационной базы устанавливаем флаг «Блокировка регламентных заданий включена».
← На главную