Разработка и Конфигурация · 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) — эти имена могут совпадать, но не обязаны.
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
// File="C:\Bases\Trade"; — файловый вариант
// Srvr="srv1c";Ref="ut_prod"; — клиент-серверный вариантУниверсальная функция для обоих режимов
На практике удобно иметь одну функцию в общем модуле, которая сама определяет режим работы и возвращает имя базы независимо от варианта развёртывания. Это избавляет от проверок в каждом месте вызова.
Функция ИмяТекущейБазы() Экспорт
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
СтрокаСоединения = СтрЗаменить(СтрокаСоединения, """", "");
Если СтрНайти(СтрокаСоединения, "Ref=") > 0 Тогда
Результат = Сред(СтрокаСоединения, СтрНайти(СтрокаСоединения, "Ref=") + 4);
ИначеЕсли СтрНайти(СтрокаСоединения, "File=") > 0 Тогда
Путь = Сред(СтрокаСоединения, СтрНайти(СтрокаСоединения, "File=") + 5);
Путь = СтрЗаменить(СтрЗаменить(Путь, ";", ""), "/", "\");
Части = СтрРазделить(Путь, "\");
Результат = Части[Части.ВГраница()];
Иначе
Результат = "";
КонецЕсли;
Возврат СтрЗаменить(Результат, ";", "");
КонецФункции
Размещайте такую функцию в общем модуле с признаками «Сервер» и «Вызов сервера», если планируете вызывать её из клиентских форм. Для использования только на сервере (регламентные задания, обмены) достаточно серверного модуля.
Альтернатива: хранение имени базы в константе
Техническое имя из строки соединения не всегда подходит для вывода пользователю: «ut_prod_copy_02» мало о чём говорит бухгалтеру. Поэтому в прикладных решениях имя базы часто хранят в константе, например «НазваниеОрганизации» из стандартных подсистем БСП или собственной константе «ПредставлениеИнформационнойБазы».
В типовых конфигурациях на базе Библиотеки стандартных подсистем есть функциональность «Заголовок системы» и отображение копии базы: подсистема автоматически помечает базу как копию, если строка соединения изменилась после переноса. Можно использовать и свой вариант: константа заполняется один раз администратором, а код читает её через Константы.ПредставлениеИнформационнойБазы.Получить().
Комбинированный подход наиболее надёжен: сначала проверяется константа, и только если она пуста, имя извлекается из строки соединения. Тогда администратор может задать красивое имя, а при его отсутствии система покажет техническое.
Как выбрать способ
Где выполнять код: клиент, сервер, фоновые задания
Функция СтрокаСоединенияИнформационнойБазы() доступна в клиентском и серверном контексте, однако есть нюансы. В веб-клиенте и при работе через веб-сервер строка может отличаться от той, что видит толстый клиент, — например, содержать параметры публикации вместо прямого соединения с кластером.
В фоновых и регламентных заданиях функция работает корректно и возвращает строку соединения той базы, в которой выполняется задание. Это удобно для логирования: в текст сообщения журнала регистрации или письма добавляется имя базы, и администратор сразу видит, откуда пришло уведомление.
Если код выполняется через COM-соединение или внешнее соединение с другой базой, СтрокаСоединенияИнформационнойБазы() внутри внешнего соединения вернёт строку той, внешней базы — это позволяет проверить, куда именно установлено подключение, и предотвратить ошибочную запись данных не в ту базу.
Типичные ошибки и проверка результата
Самая частая ошибка — забыть убрать кавычки и точку с запятой из извлечённого значения. Параметры строки соединения заключены в двойные кавычки, и если их не удалить, имя будет вида "Trade";, что сломает дальнейшие сравнения и отображение.
Вторая ошибка — предположение, что имя каталога файловой базы всегда осмысленно. Если база лежит в каталоге C:\1C\base, извлечённое «имя» будет «base» для всех баз на этом компьютере. В таких случаях единственный надёжный вариант — константа с представлением.
Третья ошибка — вызов разбора строки на тонком клиенте с последующей передачей пути файловой базы, который интерпретируется на клиентской машине, а не на сервере. Для файловой базы, открытой через веб-сервер, путь в строке соединения относится к серверу, и клиентский код не должен пытаться обращаться к нему как к локальному файлу.
Как проверить результат
Чистое имя без кавычек и точек с запятой, например ut_prod
Значение вида "ut_prod"; или пустая строка
Функция корректно возвращает имя и для файловой, и для серверной базы
Для одного из режимов возвращается пусто
Имя совпадает с именем базы в консоли администрирования
Имя не совпадает — возможно, разобран не тот параметр
FAQ: частые вопросы
Можно ли получить имя базы, которое отображается в списке при запуске 1С?
Напрямую из серверного кода — нет. Имя из списка хранится в файле ibases.v8i в профиле пользователя на его компьютере. Теоретически его можно прочитать клиентским кодом из этого файла, но решение будет зависеть от расположения профиля и не работает на сервере. Практичнее хранить представление базы в константе.
Чем отличается имя базы в кластере от имени базы данных в СУБД?
Параметр Ref в строке соединения — это имя информационной базы в кластере серверов 1С. Имя базы данных в PostgreSQL или MS SQL задаётся отдельно при создании и может отличаться. Получить имя базы данных СУБД из кода 1С штатными средствами нельзя — оно доступно только администратору СУБД.
Работает ли СтрокаСоединенияИнформационнойБазы() на тонком и веб-клиенте?
Да, функция доступна в обоих клиентах для текущего сеанса. Однако при работе через веб-сервер строка может содержать параметры публикации, а не прямое соединение, поэтому надёжнее выполнять разбор в серверном вызове и возвращать клиенту готовый результат.
Как определить, что база является копией рабочей?
Сохраните строку соединения рабочей базы в константу при настройке. Затем сравнивайте её с текущей строкой соединения: если они не совпадают, база была скопирована или перенесена. В типовых конфигурациях с БСП такой механизм уже встроен — при несовпадении блокируются обмены с внешними системами.
Можно ли получить имя другой базы, не текущей?
Из текущего сеанса — нет, функция возвращает данные только текущего подключения. Чтобы узнать строку соединения другой базы, нужно установить к ней внешнее соединение (COM) и вызвать функцию в контексте того соединения, либо получить список баз кластера через COM-объект администрирования сервера.
Почему функция возвращает пустую строку?
Чаще всего причина в том, что код ищет «Ref=» в файловой базе или «File=» в клиент-серверной — проверьте оба варианта. Также пустой результат возможен при неаккуратной обработке подстрок: убедитесь, что позиции вычисляются после удаления кавычек и что учтён завершающий символ «;».