При активной разработке, тестировании и создании резервных копий баз 1С часто возникает критическая проблема: в файловых или тестовых копиях баз начинают выполняться регламентные задания и подписки на события. Это может привести к отправке ошибочных уведомлений клиентам, дублированию выгрузок на сайты, повторному обмену с внешними сервисами или отправке фиктивных отчетов. Разберем подробно, как программно определить тип базы, получить параметры подключения и защитить внешние контуры от нежелательного выполнения фоновых алгоритмов.
Если конфигурация разрабатывается без использования библиотек или требуется базовое платформенное решение, проанализируем функцию СтрокаСоединенияИнформационнойБазы(). Данная функция возвращает параметры текущего подключения к информационной базе:
File="...", где указан локальный или сетевой путь к каталогу с файлом 1Cv8.1CD.Srvr="...";Ref="...";, где в ключе Ref передается точное имя информационной базы в кластере 1С.Посмотрим на пример функции, определяющей режим работы информационной базы:
Функция БазаЯвляетсяФайловой() Экспорт
СтрокаСоединения = ВРег(СтрокаСоединенияИнформационнойБазы());
Возврат (Найти(СтрокаСоединения, "FILE=") > 0);
КонецФункции
Если в кастомном регламентном задании необходимо запускать обработку только в клиент-серверной базе, достаточно добавить проверку в самое начало исполняемой процедуры:
Процедура ВыполнитьОбменДанными() Экспорт
Если БазаЯвляетсяФайловой() Тогда
Возврат;
КонецЕсли;
// Основная логика регламентного задания
КонецПроцедуры
В типовых конфигурациях (таких как 1С:ЗУП 3, 1С:ERP, 1С:КА, 1С:УТ) уже реализованы готовые методы и подсистема блокировки работы с внешними ресурсами. Рассмотрим их применение подробнее.
Для быстрой проверки типа базы в общем модуле БСП доступна готовая функция:
Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда
// База файловая
КонецЕсли;
Однако простого разделения на «файловая / клиент-серверная» часто недостаточно. Копия базы для тестирования может быть также развернута на SQL-сервере. В этом случае БСП предлагает подсистему «Блокировка работы с внешними ресурсами». При первом открытии перемещенной или скопированной базы система задает администратору вопрос: «Это копия или база перемещена?». При выборе варианта копии автоматически выставляется блокировка.
Чтобы собственные регламентные задания или интеграции не выполнялись в копиях, проверим состояние блокировки через параметр сеанса или вызов метода БСП:
Процедура МоеРегламентноеЗадание() Экспорт
Если ПараметрыСеанса.РаботаСВнешнимиРесурсамиЗаблокирована Тогда
Возврат;
КонецЕсли;
// Алгоритм интеграции
КонецПроцедуры
Подписки на события выполняются синхронно в момент записи или проведения документов и справочников. Если обработчик события отправляет данные во внешние системы (HTTP-запросы, почта, сторонние API), его работу также необходимо блокировать в копиях.
Проанализируем пример безопасного обработчика события при проведении документа:
Процедура ОбработкаПроведенияОтправкаДанных(Источник, Отказ, РежимПроведения) Экспорт
// Проверяем блокировку ресурсов и режим базы
Если ОбщегоНазначения.ИнформационнаяБазаФайловая()
ИЛИ ПараметрыСеанса.РаботаСВнешнимиРесурсамиЗаблокирована Тогда
Возврат;
КонецЕсли;
// Отправка данных во внешнюю систему
КонецПроцедуры
Проверка значения ПараметрыСеанса.РаботаСВнешнимиРесурсамиЗаблокирована работает мгновенно в памяти сервера и не замедляет транзакцию записи объекта.
Наиболее надежный подход для исключения ошибок интеграций при любых конфигурациях серверов — хранение эталонной строки подключения рабочей базы в константе.
СтрокаПодключенияРабочейБазы (тип Строка).СтрокаСоединенияИнформационнойБазы().
Процедура ВыполнитьКритичнуюВыгрузку() Экспорт
ТекущаяСтрока = ВРег(СтрокаСоединенияИнформационнойБазы());
ЭталоннаяСтрока = ВРег(Константы.СтрокаПодключенияРабочейБазы.Получить());
Если ТекущаяСтрока <> ЭталоннаяСтрока Тогда
Возврат; // Запуск происходит в копии базы
КонецЕсли;
// Выполнение отправки
КонецПроцедуры
Если требуется полностью исключить запуск любых регламентных заданий в тестовой среде:
/DisableScheduledJobs (или /ЗапретитьРегламентныеЗадания). В этом случае сеанс пользователя не будет инициализировать менеджер фоновых заданий.