Разработка и Конфигурация · 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);
КонецЕсли;
КонецФункции
Строка = СтрокаСоединенияИнформационнойБазы();
Если СтрНайти(Строка, "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Получите строку соединения через СтрокаСоединенияИнформационнойБазы()
- 2Извлеките параметр Ref (или путь File для файловой базы)
- 3Сравните значение с именем рабочей базы
- 4При несовпадении выведите предупреждение пользователю или запишите событие в журнал
Имя базы данных в СУБД через COM-администрирование
Имя базы в MS SQL Server или PostgreSQL не входит в строку соединения, которую видит сеанс. Чтобы его получить, нужно подключиться к агенту сервера 1С через COM-объект V83.COMConnector или через административный интерфейс (rac/ras) и прочитать свойства информационной базы — там есть поле имени базы данных (DBName).
Этот способ требует: установленной COM-компоненты той же версии платформы, учётной записи с правами администратора кластера и выполнения кода на машине, где COM-объект зарегистрирован. В типовых прикладных решениях такой подход применяют редко — обычно в инструментах администрирования и мониторинга.
Хранение «красивого» имени и типовые ошибки
Если цель — показать пользователю понятное название вроде «Бухгалтерия (рабочая)», технические идентификаторы не подходят. Практичное решение — завести константу «НазваниеИнформационнойБазы» или использовать подсистему БСП, где аналогичный параметр уже предусмотрен, и заполнять её при развёртывании копии. Это надёжнее, чем пытаться вычислить имя.
Частые ошибки при программном получении имени:
Проверка результата и отладка
Самый быстрый способ проверить, что возвращает функция в конкретной базе, — выполнить код в консоли кода (или через «Выполнить произвольный код» в инструментах разработчика) и вывести строку соединения целиком. Это сразу покажет, в каком режиме работает база и какие параметры доступны.
Как проверить результат
Присутствует File= или Srvr=/Ref= с ожидаемыми значениями
Строка пустая или содержит неожиданный сервер — проверьте, где выполняется код
Совпадает с именем информационной базы в консоли серверов 1С
Не совпадает — возможно, вы смотрите имя базы данных СУБД, а не Ref
Функция возвращает то же имя, что и в интерактивном сеансе
Другое значение — код выполняется в другом контексте или на другом сервере кластера
При отладке полезно логировать полную строку соединения в журнал регистрации один раз при старте обработки — это снимает большинство вопросов вида «почему в копии показывается другое имя».
Если имя базы нужно только для заголовков отчётов и печатных форм, не вычисляйте его каждый раз — сохраните значение в константе при первом запуске и читайте оттуда. Это быстрее и защищает от сюрпризов при переносе базы на другой сервер.
FAQ
Есть ли в 1С встроенная функция «ИмяБазы()»?
Нет, такой функции во встроенном языке не существует. Имя извлекают разбором результата СтрокаСоединенияИнформационнойБазы() либо через COM-интерфейс администрирования кластера.
Как получить имя базы, которое видит пользователь в списке при запуске?
Изнутри сеанса — никак: это имя хранится в файле ibases.v8i на клиентском компьютере и не передаётся на сервер. Для отображения понятного названия используйте константу или настройку в самой базе.
Почему СтрокаСоединенияИнформационнойБазы() возвращает пустую строку?
Чаще всего код выполняется в контексте внешнего соединения или COM-подключения, где строка соединения текущего сеанса недоступна. Перенесите вызов в серверную процедуру основного сеанса.
Как отличить файловую базу от серверной программно?
Проверьте наличие подстроки «File=» в строке соединения: если она есть — база файловая, если есть «Srvr=» и «Ref=» — клиент-серверная. Также можно использовать функцию ИнформационнаяБазаФайловая().
Меняется ли имя Ref при копировании базы?
При создании копии администратор задаёт новое имя базы в кластере вручную, поэтому Ref у копии обычно другой. Если копию развернули под тем же именем на другом сервере, Ref совпадёт — тогда различать базы нужно по параметру Srvr или по отдельной настройке.
Что важно запомнить
Имя базы в 1С получают разбором СтрокаСоединенияИнформационнойБазы(): путь для файловой базы (File) или имя в кластере (Ref) для серверной. Имя базы данных в СУБД доступно только через административный интерфейс кластера. Для отображения пользователю храните понятное название в константе, а не вычисляйте его.