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

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

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

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

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

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

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

Как устроена строка соединения информационной базы

Функция СтрокаСоединенияИнформационнойБазы() доступна и на толстом, и на тонком клиенте (для текущего сеанса), и на сервере. Она возвращает строку вида File="C:\Bases\Trade"; для файлового варианта или Srvr="Server1";Ref="trade_base"; для клиент-серверного.

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

Важно понимать: строка соединения возвращает технический идентификатор, а не «дружелюбное» имя, которое пользователь видит в списке баз при запуске. Имя из списка баз (ibases.v8i) хранится на компьютере пользователя и программно из серверного кода недоступно.

Получение имени файловой базы из пути к каталогу

Для файловой базы «именем» обычно считают имя каталога, в котором лежит файл 1Cv8.1CD. Алгоритм простой: получить строку соединения, извлечь значение параметра File, убрать кавычки и взять последний элемент пути.

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

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

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

// Файловый вариант: File="C:\Bases\Trade";

Путь = СтрЗаменить(СтрокаСоединения, "File=", "");

Путь = СтрЗаменить(Путь, ";", "");

Путь = СтрЗаменить(Путь, """", "");

Путь = СтрЗаменить(Путь, "/", "\");

ЧастиПути = СтрРазделить(Путь, "\");

Возврат ЧастиПути[ЧастиПути.ВГраница()];

Иначе

Возврат "";

КонецЕсли;

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

Для базы по пути C:\Bases\Trade функция вернёт строку «Trade». Такой подход удобен, когда каталоги баз названы осмысленно, что встречается не всегда — иногда каталог называется «1» или «base», и тогда имя будет неинформативным.

Обратите внимание на обработку разделителей: путь может содержать как прямые, так и обратные слеши, особенно если база опубликована на Linux или путь скопирован из разных источников. Приведение к одному разделителю перед разбиением делает код устойчивым.

Получение имени базы в клиент-серверном варианте

В клиент-серверном режиме строка соединения содержит параметр Ref — имя информационной базы в кластере серверов. Это наиболее близкий аналог «имени базы», так как именно его администратор задаёт при создании базы в консоли кластера.

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

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

Позиция = СтрНайти(СтрокаСоединения, "Ref=");

Если Позиция = 0 Тогда

Возврат ""; // не клиент-серверный вариант

КонецЕсли;

Подстрока = Сред(СтрокаСоединения, Позиция + 5);

Подстрока = СтрЗаменить(Подстрока, ";", "");

Возврат СтрЗаменить(Подстрока, """", "");

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

Для строки Srvr="srv1c";Ref="ut_prod"; результатом будет «ut_prod». Учтите, что это имя в кластере 1С, а не имя базы данных в СУБД (PostgreSQL, MS SQL) — эти имена могут совпадать, но не обязаны.

bsl
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
// File="C:\Bases\Trade";  — файловый вариант
// Srvr="srv1c";Ref="ut_prod";  — клиент-серверный вариант

Универсальная функция для обоих режимов

На практике удобно иметь одну функцию в общем модуле, которая сама определяет режим работы и возвращает имя базы независимо от варианта развёртывания. Это избавляет от проверок в каждом месте вызова.

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

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

СтрокаСоединения = СтрЗаменить(СтрокаСоединения, """", "");

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

Результат = Сред(СтрокаСоединения, СтрНайти(СтрокаСоединения, "Ref=") + 4);

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

Путь = Сред(СтрокаСоединения, СтрНайти(СтрокаСоединения, "File=") + 5);

Путь = СтрЗаменить(СтрЗаменить(Путь, ";", ""), "/", "\");

Части = СтрРазделить(Путь, "\");

Результат = Части[Части.ВГраница()];

Иначе

Результат = "";

КонецЕсли;

Возврат СтрЗаменить(Результат, ";", "");

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

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

Альтернатива: хранение имени базы в константе

Техническое имя из строки соединения не всегда подходит для вывода пользователю: «ut_prod_copy_02» мало о чём говорит бухгалтеру. Поэтому в прикладных решениях имя базы часто хранят в константе, например «НазваниеОрганизации» из стандартных подсистем БСП или собственной константе «ПредставлениеИнформационнойБазы».

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

Комбинированный подход наиболее надёжен: сначала проверяется константа, и только если она пуста, имя извлекается из строки соединения. Тогда администратор может задать красивое имя, а при его отсутствии система покажет техническое.

Маршрут решения

Как выбрать способ

Нужно техническое имя для логов и обменовРазберите СтрокаСоединенияИнформационнойБазы() — File для файловой, Ref для серверной
Нужно понятное имя для пользователей и писемЗаведите константу с представлением базы и читайте её
Нужно отличать рабочую базу от копииСравнивайте текущую строку соединения с эталонной, сохранённой в константе

Где выполнять код: клиент, сервер, фоновые задания

Функция СтрокаСоединенияИнформационнойБазы() доступна в клиентском и серверном контексте, однако есть нюансы. В веб-клиенте и при работе через веб-сервер строка может отличаться от той, что видит толстый клиент, — например, содержать параметры публикации вместо прямого соединения с кластером.

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

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

Типичные ошибки и проверка результата

Самая частая ошибка — забыть убрать кавычки и точку с запятой из извлечённого значения. Параметры строки соединения заключены в двойные кавычки, и если их не удалить, имя будет вида "Trade";, что сломает дальнейшие сравнения и отображение.

Вторая ошибка — предположение, что имя каталога файловой базы всегда осмысленно. Если база лежит в каталоге C:\1C\base, извлечённое «имя» будет «base» для всех баз на этом компьютере. В таких случаях единственный надёжный вариант — константа с представлением.

Третья ошибка — вызов разбора строки на тонком клиенте с последующей передачей пути файловой базы, который интерпретируется на клиентской машине, а не на сервере. Для файловой базы, открытой через веб-сервер, путь в строке соединения относится к серверу, и клиентский код не должен пытаться обращаться к нему как к локальному файлу.

Типичные ошибки
01
Не удалены кавычки и точка с запятой — имя содержит лишние символы и ломает сравнения
02
Ожидание «красивого» имени из списка баз — оно хранится на клиенте и недоступно из кода сервера
03
Разбор пути файловой базы на клиенте при работе через веб-сервер — путь относится к серверу, а не к машине пользователя
04
Использование имени каталога как уникального идентификатора — разные базы могут лежать в одноимённых каталогах
Контрольные точки

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

Вывод функции в сообщении
Норма

Чистое имя без кавычек и точек с запятой, например ut_prod

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

Значение вида "ut_prod"; или пустая строка

Работа в обоих режимах
Норма

Функция корректно возвращает имя и для файловой, и для серверной базы

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

Для одного из режимов возвращается пусто

Сравнение с консолью кластера
Норма

Имя совпадает с именем базы в консоли администрирования

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

Имя не совпадает — возможно, разобран не тот параметр

FAQ: частые вопросы

Можно ли получить имя базы, которое отображается в списке при запуске 1С?

Напрямую из серверного кода — нет. Имя из списка хранится в файле ibases.v8i в профиле пользователя на его компьютере. Теоретически его можно прочитать клиентским кодом из этого файла, но решение будет зависеть от расположения профиля и не работает на сервере. Практичнее хранить представление базы в константе.

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

Параметр Ref в строке соединения — это имя информационной базы в кластере серверов 1С. Имя базы данных в PostgreSQL или MS SQL задаётся отдельно при создании и может отличаться. Получить имя базы данных СУБД из кода 1С штатными средствами нельзя — оно доступно только администратору СУБД.

Работает ли СтрокаСоединенияИнформационнойБазы() на тонком и веб-клиенте?

Да, функция доступна в обоих клиентах для текущего сеанса. Однако при работе через веб-сервер строка может содержать параметры публикации, а не прямое соединение, поэтому надёжнее выполнять разбор в серверном вызове и возвращать клиенту готовый результат.

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

Сохраните строку соединения рабочей базы в константу при настройке. Затем сравнивайте её с текущей строкой соединения: если они не совпадают, база была скопирована или перенесена. В типовых конфигурациях с БСП такой механизм уже встроен — при несовпадении блокируются обмены с внешними системами.

Можно ли получить имя другой базы, не текущей?

Из текущего сеанса — нет, функция возвращает данные только текущего подключения. Чтобы узнать строку соединения другой базы, нужно установить к ней внешнее соединение (COM) и вызвать функцию в контексте того соединения, либо получить список баз кластера через COM-объект администрирования сервера.

Почему функция возвращает пустую строку?

Чаще всего причина в том, что код ищет «Ref=» в файловой базе или «File=» в клиент-серверной — проверьте оба варианта. Также пустой результат возможен при неаккуратной обработке подстрок: убедитесь, что позиции вычисляются после удаления кавычек и что учтён завершающий символ «;».