При разработке различных механизмов логирования, систем мониторинга или просто для удобства пользователей часто возникает задача: получить программно то самое наименование информационной базы, которое отображается в окне запуска 1С или в окне О программе. Сложность заключается в том, что это название не хранится внутри самой базы данных (в метаданных или константах), а является локальной настройкой конкретного пользователя, прописанной в его списке информационных баз. Для удобной визуальной идентификации открытых сеансов можно использовать приложение для отображения имени базы в заголовках окон 1С.
В этой статье мы подробно рассмотрим, как извлечь эту информацию, проанализируем структуру конфигурационных файлов 1С и разберем готовые примеры кода для решения этой задачи.
Прежде всего, выясним причину, почему стандартные функции платформы не возвращают это имя напрямую. Название базы, которое мы видим в списке выбора — это всего лишь текстовая метка в файле ibases.v8i. Этот файл располагается в профиле пользователя и содержит список всех подключенных баз с их параметрами (путь к папке, адрес сервера, версия платформы и т.д.).
Для операционных систем семейства Windows стандартный путь к этому файлу выглядит так: %APPDATA%\1C\1CEStart\ibases.v8i.
Чтобы программно «вытащить» название, нам необходимо реализовать следующую последовательность действий:
ibases.v8i на текущем компьютере.Рассмотрим основной пример кода, который выполняет эти действия. Мы будем использовать объект WScript.Shell для корректного определения пути к папке профиля пользователя и ТекстовыйДокумент для анализа файла.
// Определяем путь к списку баз через системные переменные окружения
WshShell = Новый COMОбъект("WScript.Shell");
WshSysEnv = WshShell.Environment("Process");
UserProfile = WshSysEnv.Item("USERPROFILE");
ПутьКФайлуСписка = UserProfile + "\AppData\Roaming\1C\1CEStart\ibases.v8i";
// Получаем текущую строку соединения базы
СтрокаСоединенияИБ = СтрокаСоединенияИнформационнойБазы();
// Читаем файл
СписокБаз = Новый ТекстовыйДокумент;
Попытка
СписокБаз.Прочитать(ПутьКФайлуСписка);
Исключение
Сообщить("Не удалось прочитать файл списка баз: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
ТекущееИмяБазы = "";
ВсегоСтрок = СписокБаз.КоличествоСтрок();
// Перебор строк файла
Для НомерСтроки = 1 По ВсегоСтрок Цикл
ТекущаяСтрока = СписокБаз.ПолучитьСтроку(НомерСтроки);
// Наименование базы в формате .v8i всегда заключено в квадратные скобки
Если Лев(ТекущаяСтрока, 1) = "[" И Прав(ТекущаяСтрока, 1) = "]" Тогда
ТекущееИмяБазы = Сред(ТекущаяСтрока, 2, СтрДлина(ТекущаяСтрока) - 2);
// Если в текущем блоке нашли совпадение по строке соединения
ИначеЕсли Найти(ТекущаяСтрока, СтрокаСоединенияИБ) > 0 Тогда
Сообщить("Наименование базы в списке: " + ТекущееИмяБазы);
Прервать;
КонецЕсли;
КонецЦикла;
Проанализируем ситуацию глубже: метод простого поиска подстроки Найти(ТекущаяСтрока, СтрокаСоединенияИБ) может не сработать в ряде случаев. Проблема в том, что функция СтрокаСоединенияИнформационнойБазы() может возвращать параметры в одном регистре, а файл ibases.v8i содержать их в другом. Также могут различаться кавычки или порядок следования параметров (например, Srvr и Ref).
Для обеспечения максимальной надежности рекомендуется «нормализовать» сравниваемые строки. Рассмотрим, как это сделать:
") и пробелы.Пример функции нормализации строки соединения:
Функция НормализоватьСтрокуСоединения(Знач ВхСтрока)
Результат = ВхСтрока;
Результат = НРег(Результат);
Результат = СтрЗаменить(Результат, """", ""); // Удаляем кавычки
Результат = СтрЗаменить(Результат, " ", ""); // Удаляем пробелы
Возврат Результат;
КонецФункции
В крупных организациях базы часто добавляются не вручную, а через общие списки. В этом случае файл ibases.v8i в профиле пользователя может быть пуст или не содержать нужной базы. Сведения о таких базах находятся во внешних .v8i файлах, пути к которым прописаны в файле 1CEStart.cfg.
Разберем, где искать этот конфигурационный файл. Обычно он находится по адресу %COMMONAPPDATA%\1C\1CEStart\1CEStart.cfg. В нем нужно искать параметр CommonInfoBases. Если ваша задача требует 100% покрытия, вам придется реализовать рекурсивный поиск по всем подключенным файлам списков.
Выясним причину, почему вышеуказанный код может не сработать в некоторых средах:
~/.1C/1cv8/ibases.v8i. Объекты COM (WScript.Shell) там также недоступны, поэтому следует использовать методы получения домашних каталогов через переменные окружения самой системы или средства встроенного языка.Если вам кажется слишком сложным парсинг конфигурационных файлов, рассмотрим другой подход. Вы можете принудительно передавать имя базы в саму базу при запуске. Для этого в строке запуска (в ярлыке или в настройках списка баз) добавьте параметр /C.
Например: /C "Бухгалтерия_Центральный_Офис".
Внутри кода 1С это значение можно получить с помощью функции ПараметрЗапуска. Однако этот метод требует ручной настройки каждого рабочего места, что не всегда удобно при большом количестве пользователей.
Мы рассмотрели наиболее эффективный программный способ получения наименования информационной базы. Несмотря на отсутствие прямой функции в платформе, чтение файла ibases.v8i позволяет точно определить, как именно база называется у конкретного пользователя. Помните о необходимости обработки исключений (файл может быть занят или отсутствовать) и учитывайте особенности работы в различных операционных системах.