При разработке прикладных решений и сервисных обработок нередко возникает задача программно определить, где физически находится текущая информационная база. Это необходимо для логирования, формирования путей выгрузки, интеграции со сторонними системами или разграничения функционала между рабочей и тестовой средой. Разберем, как получить имя и адрес базы с помощью встроенного языка 1С:Предприятия.
Для решения поставленной задачи в платформе предусмотрена глобальная функция СтрокаСоединенияИнформационнойБазы(). Проанализируем ее синтаксис и возвращаемые значения.
Данная функция возвращает строку, структура которой напрямую зависит от варианта работы информационной базы:
File="<путь к каталогу базы>";. Каталог может быть локальным (например, C:\Bases\Trade) или сетевым в формате UNC (\\server\bases\trade).Srvr="<имя сервера 1С>";Ref="<имя базы в кластере>";. Обратим внимание, что если порт кластера отличается от стандартного, он будет указан через двоеточие в параметре Srvr.ws="<URL веб-публикации>";.Посмотрим на простой пример получения строки подключения:
СтрокаПодключения = СтрокаСоединенияИнформационнойБазы();
Сообщить(СтрокаПодключения);
Разберем важный нюанс работы в управляемом приложении. Если пользователи подключаются к базе через веб-сервер (в тонком или веб-клиенте), клиентский вызов функции вернет лишь адрес веб-сервиса (параметр ws). Если вам требуется узнать именно физическое расположение (путь к каталогу или параметры кластера серверов Srvr и Ref), вызов функции необходимо обязательно производить в серверном контексте.
Посмотрим, как организовать процедуру с директивой &НаСервере:
&НаСервере
Функция ПолучитьПараметрыПодключенияНаСервере()
Возврат СтрокаСоединенияИнформационнойБазы();
КонецФункции
Штатная функция возвращает общую строку параметров, однако на практике требуется выделить конкретное имя базы или путь к файлу. Рассмотрим, как разобрать полученную строку на составляющие.
Если в конфигурации используется Библиотека стандартных подсистем (БСП), можно применить готовый метод СтроковыеФункцииКлиентСервер.ПараметрыИзСтроки(). Если же требуется универсальный алгоритм без привязки к БСП, напишем собственную процедуру анализа строки:
&НаСервере
Функция РазобратьСтрокуСоединения()
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
Результат = Новый Структура;
Результат.Вставить("Режим", "");
Результат.Вставить("ПутьИлиСервер", "");
Результат.Вставить("ИмяБазы", "");
// Проверяем файловый режим
ПозицияFile = СтрНайти(СтрокаСоединения, "File=");
Если ПозицияFile > 0 Тогда
Результат.Режим = "Файловый";
Путь = Сред(СтрокаСоединения, ПозицияFile + 5);
Путь = СтрЗаменить(Путь, """", "");
Путь = СтрЗаменить(Путь, ";", "");
Результат.ПутьИлиСервер = СокрЛП(Путь);
Возврат Результат;
КонецЕсли;
// Проверяем клиент-серверный режим
ПозицияSrvr = СтрНайти(СтрокаСоединения, "Srvr=");
ПозицияRef = СтрНайти(СтрокаСоединения, "Ref=");
Если ПозицияSrvr > 0 И ПозицияRef > 0 Тогда
Результат.Режим = "Клиент-серверный";
// Извлекаем имя сервера
Сервер = Сред(СтрокаСоединения, ПозицияSrvr + 5, ПозицияRef - (ПозицияSrvr + 5));
Сервер = СтрЗаменить(Сервер, """", "");
Сервер = СтрЗаменить(Сервер, ";", "");
Результат.ПутьИлиСервер = СокрЛП(Сервер);
// Извлекаем имя базы в кластере
ИмяБазы = Сред(СтрокаСоединения, ПозицияRef + 4);
ИмяБазы = СтрЗаменить(ИмяБазы, """", "");
ИмяБазы = СтрЗаменить(ИмяБазы, ";", "");
Результат.ИмяБазы = СокрЛП(ИмяБазы);
КонецЕсли;
Возврат Результат;
КонецФункции
Выясним частую причину путаницы среди разработчиков: параметр Ref возвращает имя информационной базы в том виде, в котором она зарегистрирована в консоли администрирования кластера 1С. Это имя не обязательно совпадает с физическим именем базы данных на сервере SQL.
Важно помнить: стандартными средствами встроенного языка 1С узнать имя базы непосредственно в СУБД невозможно. Если приложению требуется физическое имя базы в SQL, эту информацию получают через внешнее администрирование: с помощью COMConnector (обращаясь к объекту информационной базы и его свойству DbName) или с помощью утилиты командной строки rac через службу RAS.
Пользовательское наименование, отображаемое в окне запуска программы (стартере), не передается внутрь сеанса автоматически. На разных рабочих местах пользователей одна и та же информационная база может называться совершенно по-разному.
Если для бизнес-логики необходимо знать именно строковое представление из списка запуска, обычно применяют следующие подходы:
/C <ИмяБазы>, после чего в коде обращаются к глобальному свойству ПараметрыЗапуска.ibases.v8i на стороне клиента и выполняют сопоставление строки соединения с заголовками секций.Проанализируем случай, когда конфигурация работает в облачном режиме с включенным разделением данных. В такой архитектуре параметры Srvr и Ref у всех пользователей и организаций едины, поскольку физически база одна. Для полной и корректной идентификации рабочей среды абонента необходимо учитывать не только строку соединения, но и значения разделителей данных, которые можно получить через соответствующий менеджер разделителей.