При создании тестовых копий рабочих баз 1С:ERP возникает критически важная задача: предотвратить случайную выгрузку или загрузку данных на боевой сайт. Если регламентные задания обмена продолжат выполняться в копии, тестовые данные могут перезаписать актуальные цены, остатки и заказы на рабочем портале 1С-Битрикс.
Разберем основные причины, почему самописные проверки могут не срабатывать, а также рассмотрим надежные способы полной блокировки обмена на тестовых контурах.
Проанализируем типичную ошибку при попытке программно определить имя сервера или базы данных. Разработчики часто пишут условие следующего вида:
// Ошибочный вариант:
Если СтрНайти(СтрокаСоединенияИнформационнойБазы(), "ИмяРабочегоСервера") Тогда
// Запуск обмена
Иначе
Возврат;
КонецЕсли;
Выясним причину, почему такая конструкция не работает. Функция платформы СтрНайти() (или устаревшая Найти()) возвращает число — номер позиции первого вхождения подстроки, либо 0, если подстрока не найдена. В платформе 1С числовое значение не преобразуется автоматически в логический тип Булево.
Попытка выполнить условие Если СтрНайти(...) Тогда приводит к ошибке времени выполнения «Преобразование к типу Булево не может быть выполнено». Если вызов обмена обернут в конструкцию Попытка ... Исключение, код просто перехватывает ошибку, и дальнейшая логика может пойти по непредсказуемому сценарию.
Посмотрим на корректный синтаксис сравнения с числом:
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
Если СтрНайти(СтрокаСоединения, "Srvr=""1c-prod"";Ref=""erp_prod"";") > 0 Тогда
// Это рабочая база: выполняем обмен
Иначе
// Это копия: прерываем выполнение
Возврат;
КонецЕсли;
Конфигурация 1С:ERP построена на базе Библиотеки стандартных подсистем (БСП). В ней присутствует готовый механизм защиты от непреднамеренной работы копии базы с внешними сервисами.
Разберем по шагам, как работает этот функционал:
Если вам требуется добавить проверку в кастомный модуль обмена Битрикс, используйте типовой метод БСП перед выполнением любых сетевых запросов:
Если БлокировкаРаботыСВнешнимиРесурсами.РаботаСВнешнимиРесурсамиЗаблокирована() Тогда
// Работа с сайтом заблокирована для копии
Возврат;
КонецЕсли;
Рассмотрим надежный программный способ контроля. Чтобы не «зашивать» имя сервера жестко в код конфигурации, заведем константу, например, СтрокаСоединенияРабочейБазы (тип Строка).
СтрокаСоединенияИнформационнойБазы().
ТекущаяСтрока = СтрокаСоединенияИнформационнойБазы();
ЭталоннаяСтрока = Константы.СтрокаСоединенияРабочейБазы.Получить();
Если Не ЗначениеЗаполнено(ЭталоннаяСтрока) Или ТекущаяСтрока <> ЭталоннаяСтрока Тогда
ЗаписьЖурналаРегистрации(
"Обмен с сайтом",
УровеньЖурналаРегистрации.Предупреждение,,,
"Попытка запуска обмена на непроизводственной базе: " + ТекущаяСтрока
);
Возврат;
КонецЕсли;
При разворачивании бэкапа на тестовом сервере значение СтрокаСоединенияИнформационнойБазы() изменится, проверка вернет Ложь, и обмен будет безопасно прерван.
Помимо проверок на уровне программного кода 1С, рекомендуется использовать системные меры защиты:
127.0.0.1 в файле hosts. В этом случае даже при ручном запуске разработчиком обмен завершится сетевой ошибкой и не затронет боевой сайт.