К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С: как программно получить имя базы

Как программно получить имя информационной базы 1С: СтрокаСоединенияИнформационнойБазы, имя в кластере, файловый путь. Примеры кода, разбор ошибок и FAQ.

Задача получить имя информационной базы программно возникает регулярно: при формировании заголовков отчётов, при логировании, при обмене между базами, когда нужно понять, из какой именно базы пришли данные, или при выводе подсказки пользователю «вы работаете в тестовой копии». Встроенной функции «ИмяБазы()» во встроенном языке 1С нет, поэтому имя приходится извлекать из строки соединения или из параметров кластера серверов.

Главный источник информации — функция глобального контекста СтрокаСоединенияИнформационнойБазы(). Она возвращает строку подключения в том виде, в каком её видит текущий сеанс, и из этой строки можно разобрать либо путь к файловой базе, либо имя сервера и имя базы в кластере. Дополнительно существует метод ПолучитьИмяИнформационнойБазы() объекта «Администрирование кластера» через COM, но он требует отдельных прав и настройки.

Важно понимать разницу между тремя сущностями, которые часто путают: именем базы в кластере серверов 1С, именем базы данных в СУБД (MS SQL, PostgreSQL) и именем базы в списке стартера 1cv8.exe. Это три разных значения, которые могут совпадать, а могут полностью различаться. Ниже разобраны способы получить каждое из них и типовые ошибки при разборе строки соединения.

Что именно считается «именем базы» в 1С

Прежде чем писать код, определите, какое именно имя нужно. В файловом варианте «имя базы» обычно означает каталог на диске, например D:\Bases\TradeDemo. В клиент-серверном варианте есть имя информационной базы в кластере (параметр Ref), и именно его видит сервер 1С. Отдельно существует имя базы данных на уровне СУБД — оно задаётся при создании базы в консоли кластера и может отличаться от Ref.

Ещё одно значение — имя базы в списке информационных баз пользователя (файл ibases.v8i). Это произвольное название, которое пользователь ввёл при добавлении базы в стартер, и программно изнутри сеанса оно недоступно, потому что хранится на клиентской машине, а не на сервере. Если требуется «красивое» имя для отображения, его обычно хранят в константе или в параметре базы, а не пытаются вычислить.

Получение строки соединения и разбор параметров

Базовый вызов выглядит так:

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

// Результат для файловой базы:

// File="D:\Bases\Trade";

// Результат для серверной базы:

// Srvr="srv-1c";Ref="TradeBase";

Для разбора строки удобно написать универсальную функцию, которая определяет режим работы и извлекает нужный параметр. Строка соединения имеет формат пар «ключ="значение"», разделённых точкой с запятой, поэтому надёжнее искать подстроку File=" или Ref=" и брать текст до закрывающей кавычки.

Функция ИмяТекущейБазы() Экспорт

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

Если СтрНайти(Строка, "File=") > 0 Тогда

// файловый режим — возвращаем путь

Поз1 = СтрНайти(Строка, """");

Поз2 = СтрНайти(Строка, """", , Поз1 + 1);

Возврат Сред(Строка, Поз1 + 1, Поз2 - Поз1 - 1);

Иначе

// клиент-серверный режим — берём Ref

Поз1 = СтрНайти(Строка, "Ref=""") + 5;

Поз2 = СтрНайти(Строка, """", , Поз1);

Возврат Сред(Строка, Поз1, Поз2 - Поз1);

КонецЕсли;

КонецФункции

bsl
Строка = СтрокаСоединенияИнформационнойБазы();
Если СтрНайти(Строка, "Ref=""") > 0 Тогда
	Поз1 = СтрНайти(Строка, "Ref=""") + 5;
	Поз2 = СтрНайти(Строка, """", , Поз1);
	ИмяБазы = Сред(Строка, Поз1, Поз2 - Поз1);
КонецЕсли;

Файловая база: как получить путь и имя каталога

В файловом варианте единственный идентификатор базы — путь к каталогу, где лежит файл 1Cv8.1CD. Полный путь извлекается из параметра File строки соединения. Если нужно именно «имя» базы, а не весь путь, обычно берут последний сегмент пути — имя каталога.

ПутьБазы = "D:\Bases\TradeDemo"; // из строки соединения

Позиция = СтрНайти(ПутьБазы, "\", НаправлениеПоиска.СКонца);

ИмяКаталога = Сред(ПутьБазы, Позиция + 1); // TradeDemo

Учтите, что путь может быть задан через сетевой ресурс (\\server\share\base) — логика разбора при этом не меняется. Также путь может содержать пробелы и кириллицу, поэтому не используйте разбор по пробелам, только по кавычкам и разделителям каталогов.

Клиент-серверная база: имя в кластере (Ref)

В клиент-серверном варианте строка соединения содержит параметры Srvr (имя сервера 1С) и Ref (имя информационной базы в кластере). Именно Ref чаще всего и нужен, когда говорят «имя базы»: это то название, которое видно в консоли кластера серверов.

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

Если вам нужно проверить, работаете ли вы в тестовой копии, типовой приём — сравнить полученное Ref с эталонным именем рабочей базы и при несовпадении показывать предупреждение в заголовке или при входе.

Как определить тестовую базу программно
  1. 1
    Получите строку соединения через СтрокаСоединенияИнформационнойБазы()
  2. 2
    Извлеките параметр Ref (или путь File для файловой базы)
  3. 3
    Сравните значение с именем рабочей базы
  4. 4
    При несовпадении выведите предупреждение пользователю или запишите событие в журнал

Имя базы данных в СУБД через COM-администрирование

Имя базы в MS SQL Server или PostgreSQL не входит в строку соединения, которую видит сеанс. Чтобы его получить, нужно подключиться к агенту сервера 1С через COM-объект V83.COMConnector или через административный интерфейс (rac/ras) и прочитать свойства информационной базы — там есть поле имени базы данных (DBName).

Этот способ требует: установленной COM-компоненты той же версии платформы, учётной записи с правами администратора кластера и выполнения кода на машине, где COM-объект зарегистрирован. В типовых прикладных решениях такой подход применяют редко — обычно в инструментах администрирования и мониторинга.

Хранение «красивого» имени и типовые ошибки

Если цель — показать пользователю понятное название вроде «Бухгалтерия (рабочая)», технические идентификаторы не подходят. Практичное решение — завести константу «НазваниеИнформационнойБазы» или использовать подсистему БСП, где аналогичный параметр уже предусмотрен, и заполнять её при развёртывании копии. Это надёжнее, чем пытаться вычислить имя.

Частые ошибки при программном получении имени:

Типичные ошибки
01
Разбор строки соединения по фиксированной позиции символов — ломается при смене порядка параметров или добавлении новых. Используйте поиск подстроки с кавычками
02
Смешение Ref и имени базы в СУБД — при автоматическом создании базы из консоли кластера имена могут различаться, и скрипты обслуживания обращаются не к той базе
03
Вызов СтрокаСоединенияИнформационнойБазы() в фоновом задании с ожиданием клиентского пути — фоновое задание выполняется на сервере и видит серверное представление строки
04
Сравнение имён без учёта регистра — Ref регистрозависим в некоторых сценариях сравнения, приводите обе строки к одному регистру

Проверка результата и отладка

Самый быстрый способ проверить, что возвращает функция в конкретной базе, — выполнить код в консоли кода (или через «Выполнить произвольный код» в инструментах разработчика) и вывести строку соединения целиком. Это сразу покажет, в каком режиме работает база и какие параметры доступны.

Контрольные точки

Как проверить результат

Содержимое строки соединения
Норма

Присутствует File= или Srvr=/Ref= с ожидаемыми значениями

Тревожный признак

Строка пустая или содержит неожиданный сервер — проверьте, где выполняется код

Имя Ref против консоли кластера
Норма

Совпадает с именем информационной базы в консоли серверов 1С

Тревожный признак

Не совпадает — возможно, вы смотрите имя базы данных СУБД, а не Ref

Поведение в фоновом задании
Норма

Функция возвращает то же имя, что и в интерактивном сеансе

Тревожный признак

Другое значение — код выполняется в другом контексте или на другом сервере кластера

При отладке полезно логировать полную строку соединения в журнал регистрации один раз при старте обработки — это снимает большинство вопросов вида «почему в копии показывается другое имя».

Если имя базы нужно только для заголовков отчётов и печатных форм, не вычисляйте его каждый раз — сохраните значение в константе при первом запуске и читайте оттуда. Это быстрее и защищает от сюрпризов при переносе базы на другой сервер.
ПЗ
Практическое замечание

FAQ

Есть ли в 1С встроенная функция «ИмяБазы()»?

Нет, такой функции во встроенном языке не существует. Имя извлекают разбором результата СтрокаСоединенияИнформационнойБазы() либо через COM-интерфейс администрирования кластера.

Как получить имя базы, которое видит пользователь в списке при запуске?

Изнутри сеанса — никак: это имя хранится в файле ibases.v8i на клиентском компьютере и не передаётся на сервер. Для отображения понятного названия используйте константу или настройку в самой базе.

Почему СтрокаСоединенияИнформационнойБазы() возвращает пустую строку?

Чаще всего код выполняется в контексте внешнего соединения или COM-подключения, где строка соединения текущего сеанса недоступна. Перенесите вызов в серверную процедуру основного сеанса.

Как отличить файловую базу от серверной программно?

Проверьте наличие подстроки «File=» в строке соединения: если она есть — база файловая, если есть «Srvr=» и «Ref=» — клиент-серверная. Также можно использовать функцию ИнформационнаяБазаФайловая().

Меняется ли имя Ref при копировании базы?

При создании копии администратор задаёт новое имя базы в кластере вручную, поэтому Ref у копии обычно другой. Если копию развернули под тем же именем на другом сервере, Ref совпадёт — тогда различать базы нужно по параметру Srvr или по отдельной настройке.

Итог

Что важно запомнить

Имя базы в 1С получают разбором СтрокаСоединенияИнформационнойБазы(): путь для файловой базы (File) или имя в кластере (Ref) для серверной. Имя базы данных в СУБД доступно только через административный интерфейс кластера. Для отображения пользователю храните понятное название в константе, а не вычисляйте его.