При разработке и сопровождении конфигураций 1С часто возникает задача определить, в какой именно базе выполняется программный код: в продуктивной (рабочей) или в тестовой копии. Это необходимо для того, чтобы предотвратить выполнение фоновых заданий, отправку реальных писем клиентам, выгрузку данных на сайт или вызовы внешних веб-сервисов из тестовых баз, развернутых из резервных копий.
Разберем особенности платформы 1С:Предприятие, доступные методы идентификации баз и типовые подходы к решению этой задачи.
Проанализируем устройство платформы 1С. Встроенного глобального идентификатора, который был бы жестко зашит в структуру базы данных и одновременно позволял различать продуктивную базу и ее копию, в языке 1С нет. Идентификатор базы на уровне кластера серверов 1С существует, однако штатно из пользовательского сеанса он недоступен (к нему можно обратиться только через административные интерфейсы RAC/RAS или COM). При этом при разворачивании базы из файла .dt или бэкапа СУБД в новую базу кластера создается новый внутренний идентификатор, а данные внутри самой базы остаются полной копией оригинала.
Идентификаторы, хранящиеся в локальном файле ibases.v8i на компьютере пользователя, относятся лишь к настройкам списка баз конкретного пользователя и не могут служить надежным признаком самой базы (особенно при работе через веб-клиент или с разных рабочих мест).
Поэтому на практике применяются программные алгоритмы проверки параметров подключения и окружения.
Самый распространенный способ — анализ системной функции СтрокаСоединенияИнформационнойБазы(). Функция возвращает строку с параметрами подключения к серверу 1С и имени базы в кластере (для клиент-серверного варианта) или путь к каталогу (для файлового варианта).
Посмотрим на пример базовой функции проверки:
Функция ЭтоРабочаяБаза() Экспорт
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
// Проверяем наличие ключевых параметров рабочей базы
Если СтрНайти(ВРег(СтрокаСоединения), "SRVR=""PROD-SERVER""") > 0
И СтрНайти(ВРег(СтрокаСоединения), "REF=""ERP_PROD""") > 0 Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
Разберем важные нюансы этого подхода:
ВРег().prod-server.domain.local), так и по прямому IP-адресу (192.168.1.10). Чтобы избежать ложных срабатываний, надежнее проверять исключительно имя базы (параметр Ref), если имена баз на продуктивном и тестовом серверах различаются, либо нормализовать адрес сервера.Если требуется присвоить базе постоянный уникальный номер (например, для обмена данными), создадим служебную константу или однострочный регистр сведений.
Разберем по шагам логику работы:
Новый УникальныйИдентификатор() и записываем его строковое представление в константу ИдентификаторИнформационнойБазы.Посмотрим на пример первичной инициализации идентификатора:
Процедура ПроверитьИнициализациюИдентификатораБазы() Экспорт
ИдентификаторТекущий = Константы.ИдентификаторИнформационнойБазы.Получить();
Если ПустаяСтрока(ИдентификаторТекущий) Тогда
НовыйГУИД = Строка(Новый УникальныйИдентификатор());
Константы.ИдентификаторИнформационнойБазы.Установить(НовыйГУИД);
КонецЕсли;
КонецПроцедуры
Важно: этот способ фиксирует идентификатор экземпляра, но если сделать прямую копию базы через бэкап СУБД, значение константы перенесется в копию. Поэтому для распознавания копии его необходимо дополнять проверкой параметров размещения.
В Библиотеке стандартных подсистем (БСП) реализован комплексный алгоритм контроля перемещения базы:
DoNotCopy.txt. При копировании каталога или несовпадении пути система фиксирует факт перемещения.РаботаСВнешнимиРесурсамиЗаблокирована, а к заголовку программы добавляется префикс [КОПИЯ]. Все регламентные задания по отправке почты, обмену по API и синхронизации проверяют этот флаг и завершают выполнение без ошибок.Пример проверки состояния блокировки в коде фонового задания:
Если РегламентныеЗаданияСервер.РаботаСВнешнимиРесурсамиЗаблокирована() Тогда
ЗаписьЖурналаРегистрации(
"Интеграция",
УровеньЖурналаРегистрации.Предупреждение,
,
,
"Выполнение регламентного задания отменено: база является копией."
);
Возврат;
КонецЕсли;
Для надежного разграничения продуктивных и тестовых сред на уровне инфраструктуры можно использовать переменные окружения операционной системы сервера приложений 1С.
Разберем логику:
ENVIRONMENT_TYPE=PRODUCTION.STAGE или DEV.WScript.Shell или параметры среды. Если признак продуктивной среды не подтвержден, база автоматически переходит в тестовый режим, независимо от того, какие IP-адреса используют клиенты.Для простых задач и самописных конфигураций достаточно использовать функцию СтрокаСоединенияИнформационнойБазы() с нормализацией регистра и проверкой имени базы. Для масштабных систем рекомендуется использовать типовые механизмы БСП (контроль перемещения базы и блокировку работы с внешними ресурсами), что гарантирует защиту продуктивных данных от случайного вмешательства из тестовых копий.