Как программно узнать имя и расположение информационной базы в 1С?

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

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

Базовый метод: функция СтрокаСоединенияИнформационнойБазы()

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

Данная функция возвращает строку, структура которой напрямую зависит от варианта работы информационной базы:

  1. Файловый режим работы. Строка содержит путь к каталогу с базой данных в формате: File="<путь к каталогу базы>";. Каталог может быть локальным (например, C:\Bases\Trade) или сетевым в формате UNC (\\server\bases\trade).
  2. Клиент-серверный режим работы (SQL). Строка возвращает адрес сервера и логическое имя базы в кластере 1С в формате: Srvr="<имя сервера 1С>";Ref="<имя базы в кластере>";. Обратим внимание, что если порт кластера отличается от стандартного, он будет указан через двоеточие в параметре Srvr.
  3. Веб-клиент или подключение через веб-сервер. При вызове на стороне клиента вернется URL веб-публикации в виде: 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);
        ИмяБазы = СтрЗаменить(ИмяБазы, """", "");
        ИмяБазы = СтрЗаменить(ИмяБазы, ";", "");
        Результат.ИмяБазы = СокрЛП(ИмяБазы);
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

Отличие имени в кластере 1С от имени базы данных в СУБД

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

Важно помнить: стандартными средствами встроенного языка 1С узнать имя базы непосредственно в СУБД невозможно. Если приложению требуется физическое имя базы в SQL, эту информацию получают через внешнее администрирование: с помощью COMConnector (обращаясь к объекту информационной базы и его свойству DbName) или с помощью утилиты командной строки rac через службу RAS.

Определение имени базы из списка запуска (стартера 1С)

Пользовательское наименование, отображаемое в окне запуска программы (стартере), не передается внутрь сеанса автоматически. На разных рабочих местах пользователей одна и та же информационная база может называться совершенно по-разному.

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

  1. Передают наименование базы в строке параметров запуска через ключ /C <ИмяБазы>, после чего в коде обращаются к глобальному свойству ПараметрыЗапуска.
  2. Программно считывают файл конфигурации стартера ibases.v8i на стороне клиента и выполняют сопоставление строки соединения с заголовками секций.

Особенности работы в режиме разделения данных (SaaS)

Проанализируем случай, когда конфигурация работает в облачном режиме с включенным разделением данных. В такой архитектуре параметры Srvr и Ref у всех пользователей и организаций едины, поскольку физически база одна. Для полной и корректной идентификации рабочей среды абонента необходимо учитывать не только строку соединения, но и значения разделителей данных, которые можно получить через соответствующий менеджер разделителей.

← На главную