Как программно получить наименование информационной базы из окна О программе

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Где хранится наименование информационной базы

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

Для операционных систем семейства Windows стандартный путь к этому файлу выглядит так: %APPDATA%\1C\1CEStart\ibases.v8i.

Алгоритм получения наименования

Чтобы программно «вытащить» название, нам необходимо реализовать следующую последовательность действий:

  1. Определить путь к файлу ibases.v8i на текущем компьютере.
  2. Получить текущую строку соединения информационной базы с помощью встроенной функции платформы.
  3. Прочитать текстовый файл списка баз построчно.
  4. Найти блок данных, в котором строка соединения совпадает с текущей.
  5. Извлечь заголовок этого блока, который и является искомым наименованием.

Программная реализация на языке 1С

Рассмотрим основной пример кода, который выполняет эти действия. Мы будем использовать объект 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).

Для обеспечения максимальной надежности рекомендуется «нормализовать» сравниваемые строки. Рассмотрим, как это сделать:

  1. Приведите обе строки к нижнему или верхнему регистру перед сравнением.
  2. Удалите лишние символы, такие как кавычки (") и пробелы.
  3. Для серверных баз лучше сравнивать отдельно имя сервера и имя базы на сервере.

Пример функции нормализации строки соединения:


Функция НормализоватьСтрокуСоединения(Знач ВхСтрока)
    Результат = ВхСтрока;
    Результат = НРег(Результат);
    Результат = СтрЗаменить(Результат, """", ""); // Удаляем кавычки
    Результат = СтрЗаменить(Результат, " ", "");  // Удаляем пробелы
    Возврат Результат;
КонецФункции

Работа с общими списками баз

В крупных организациях базы часто добавляются не вручную, а через общие списки. В этом случае файл ibases.v8i в профиле пользователя может быть пуст или не содержать нужной базы. Сведения о таких базах находятся во внешних .v8i файлах, пути к которым прописаны в файле 1CEStart.cfg.

Разберем, где искать этот конфигурационный файл. Обычно он находится по адресу %COMMONAPPDATA%\1C\1CEStart\1CEStart.cfg. В нем нужно искать параметр CommonInfoBases. Если ваша задача требует 100% покрытия, вам придется реализовать рекурсивный поиск по всем подключенным файлам списков.

Особенности различных ОС и клиентов

Выясним причину, почему вышеуказанный код может не сработать в некоторых средах:

Альтернативный метод: Параметр запуска

Если вам кажется слишком сложным парсинг конфигурационных файлов, рассмотрим другой подход. Вы можете принудительно передавать имя базы в саму базу при запуске. Для этого в строке запуска (в ярлыке или в настройках списка баз) добавьте параметр /C.

Например: /C "Бухгалтерия_Центральный_Офис".

Внутри кода 1С это значение можно получить с помощью функции ПараметрЗапуска. Однако этот метод требует ручной настройки каждого рабочего места, что не всегда удобно при большом количестве пользователей.

Заключение

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

← На главную