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

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

При разработке различных утилит или обработок на платформе 1С:Предприятие 8.3, особенно когда речь идет об обычных формах, часто возникает задача получить список всех информационных баз, которые зарегистрированы на клиентском компьютере. Это может быть необходимо для автоматизации выбора базы пользователем, создания специализированных лаунчеров или инструментов для миграции данных. Мы с вами подробно разберем, как решить эту задачу, используя два основных подхода: парсинг конфигурационного файла и взаимодействие через COM-соединение.

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

Мы рассмотрим каждый из методов, обсудим его преимущества и недостатки, а также предоставим детальные примеры кода 1С для их реализации.

Метод 1: Парсинг конфигурационного файла 1cestart.v8i

Один из наиболее распространенных способов хранения информации о зарегистрированных базах 1С — это файл с расширением .v8i. Этот файл обычно называется 1cestart.v8i и располагается в каталоге профиля пользователя по пути %APPDATA%\1C\1CEStart\. Давайте подробнее изучим его структуру и способы извлечения данных.

Структура файла 1cestart.v8i

Файл 1cestart.v8i представляет собой обычный текстовый файл, который имеет INI-подобную структуру. Каждая информационная база описывается отдельной секцией, название которой заключено в квадратные скобки. Внутри секции находятся различные параметры, такие как строка подключения (Connect), уникальный идентификатор (ID), порядок в списке (OrderInList) и другие. Например, для файловой базы структура может выглядеть следующим образом:


[База 1]
Connect=File="C:\1C_Bases\Base1";
ID=e2d93700-47b2-4d24-811c-c2b4c502b0c3
OrderInList=0
Folder=/
External=0
ClientConnectionSpeed=Normal
Version=8.3

Для серверной базы строка Connect будет отличаться:


[Серверная База]
Connect=Srvr="SERVER1";Ref="base_name";
ID=e2d93700-47b2-4d24-811c-c2b4c502b0c3
OrderInList=1
Folder=/
External=0
ClientConnectionSpeed=Normal
Version=8.3

Нашей задачей будет прочитать этот файл построчно и извлечь необходимые параметры: имя базы (из заголовка секции) и строку подключения (из параметра Connect).

Пошаговая реализация парсинга файла 1cestart.v8i

Мы предлагаем рассмотреть подробный пример функции, которая будет выполнять эту задачу. Для начала нам потребуется определить путь к файлу 1cestart.v8i, используя системные переменные окружения.

  1. Определение пути к файлу: Мы воспользуемся объектом WScript.Shell для получения значения переменной окружения %APPDATA%, что гарантирует корректное определение пути независимо от операционной системы и настроек пользователя.
  2. Чтение файла: После получения полного пути мы проверим существование файла и, если он есть, прочитаем его содержимое с помощью объекта ТекстовыйДокумент.
  3. Парсинг содержимого: Мы будем перебирать строки документа, выявляя строки, начинающиеся с [ и Connect=. Важно аккуратно извлечь имя базы и строку подключения, учитывая форматирование (кавычки, точку с запятой).

Давайте посмотрим на пример кода:


// Функция для проверки существования файла
Функция ФайлСуществует(ПолныйПутьКФайлу)
    Файл = Новый Файл(ПолныйПутьКФайлу);
    Возврат Файл.Существует();
КонецФункции

// Основная функция для получения списка информационных баз
Функция ПолучитьСписокИнформационныхБазИзФайла()
    Перем СписокБаз;
    СписокБаз = Новый СписокЗначений; // Будем хранить пары: СтрокаПодключения -> ИмяБазы

    Попытка
        // 1. Получаем путь к AppData с помощью WScript.Shell
        WshShell = Новый COMОбъект("WScript.Shell");
        ПутьКПрофилю = WshShell.ExpandEnvironmentStrings("%APPDATA%");
        ПутьКФайлуБаз = ПутьКПрофилю + "\1C\1CEStart\1cestart.v8i";
    Исключение
        Сообщить("Не удалось инициализировать WScript.Shell или получить путь к AppData: " + ОписаниеОшибки());
        Возврат СписокБаз;
    КонецПопытки;

    Если ФайлСуществует(ПутьКФайлуБаз) Тогда
        ТекстовыйДокумент = Новый ТекстовыйДокумент;
        Попытка
            ТекстовыйДокумент.Прочитать(ПутьКФайлуБаз, КодировкаТекста.UTF8); // Важно указать правильную кодировку
        Исключение
            Сообщить("Ошибка при чтении файла " + ПутьКФайлуБаз + ": " + ОписаниеОшибки());
            Возврат СписокБаз;
        КонецПопытки;

        ТекстоваяСтрока = "";
        ИмяБазы = "";
        СтрокаПодключенияБазы = "";
        
        // 2. Итерируемся по строкам документа для парсинга
        Для Индекс = 0 По ТекстовыйДокумент.КоличествоСтрок() - 1 Цикл
            ТекстоваяСтрока = ТекстовыйДокумент.ПолучитьСтроку(Индекс);
            ТекстоваяСтрока = СокрЛП(ТекстоваяСтрока); // Удаляем лишние пробелы по краям

            // Определяем начало новой секции (имя базы)
            Если СтрНачинаетсяС(ТекстоваяСтрока, "[") И СтрЗаканчивается(ТекстоваяСтрока, "]") Тогда
                ИмяБазы = Сред(ТекстоваяСтрока, 2, СтрДлина(ТекстоваяСтрока) - 2); // Извлекаем имя без скобок
                СтрокаПодключенияБазы = ""; // Сбрасываем строку подключения для новой базы
            // Ищем строку с подключением
            ИначеЕсли СтрНачинаетсяС(ТекстоваяСтрока, "Connect=") Тогда
                СтрокаПодключенияБазыПолная = Сред(ТекстоваяСтрока, СтрДлина("Connect=") + 1);
                
                // Обработка файловых баз: Connect=File="C:\path\to\base";
                Если СтрНачинаетсяС(СтрокаПодключенияБазыПолная, "File=") Тогда
                    // Ищем путь между кавычками
                    НачалоКавычки = СтрНайти(СтрокаПодключенияБазыПолная, """", 1);
                    КонецКавычки = СтрНайти(СтрокаПодключенияБазыПолная, """", НачалоКавычки + 1);
                    Если НачалоКавычки > 0 И КонецКавычки > НачалоКавычки Тогда
                        СтрокаПодключенияБазы = Сред(СтрокаПодключенияБазыПолная, НачалоКавычки + 1, КонецКавычки - НачалоКавычки - 1);
                    КонецЕсли;
                // Обработка серверных баз: Connect=Srvr="SERVER1";Ref="base_name";
                ИначеЕсли СтрНачинаетсяС(СтрокаПодключенияБазыПолная, "Srvr=") Тогда
                    // Здесь мы можем взять всю строку подключения как есть,
                    // либо парсить по серверам и именам баз на сервере.
                    // Для простоты пока возьмем как есть, но это можно доработать.
                    СтрокаПодключенияБазы = СтрокаПодключенияБазыПолная; 
                КонецЕсли;

                // Добавляем найденную базу в список, если имя и строка подключения определены
                Если НЕ ПустаяСтрока(ИмяБазы) И НЕ ПустаяСтрока(СтрокаПодключенияБазы) Тогда
                    СписокБаз.Добавить(СтрокаПодключенияБазы, ИмяБазы);
                    ИмяБазы = ""; // Сбрасываем, чтобы избежать дублирования, если есть другие параметры до следующей базы
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    Иначе
        Сообщить("Файл списка информационных баз не найден: " + ПутьКФайлуБаз);
    КонецЕсли;
    
    Возврат СписокБаз;
КонецФункции

Преимущества метода парсинга файла:

  1. Не требует дополнительных компонентов или установки COM-соединения.
  2. Работает "из коробки" на любом клиентском компьютере, где установлен 1С:Предприятие.
  3. Относительно прост в понимании и реализации, если вы знакомы с работой с текстовыми файлами.

Недостатки метода парсинга файла:

  1. Зависимость от формата файла 1cestart.v8i. При изменении формата в будущих версиях платформы код может перестать работать.
  2. Парсинг строк может быть громоздким и требует тщательной обработки различных вариантов строк подключения (файловые, серверные, различные пути).
  3. Не обрабатывает базы, зарегистрированные только в реестре (например, через ключи HKCU\Software\1C\1CEStart\V8).

Метод 2: Использование COM-соединения к платформе 1С

Альтернативный и зачастую более элегантный способ получить список информационных баз — это использовать COM-соединение к самой платформе 1С:Предприятие. Этот метод позволяет обратиться к объекту COMConnector, который предоставляет доступ к функциональности платформы извне.

Принцип работы COM-соединения

Объект V83.COMConnector (или V82.COMConnector для версии 8.2) — это COM-сервер, который устанавливается вместе с платформой 1С. Он предоставляет программный интерфейс для взаимодействия с платформой. Одним из методов этого интерфейса является GetInfoBases(), который возвращает коллекцию объектов InfoBase, каждый из которых представляет собой зарегистрированную информационную базу со всеми ее свойствами.

Пошаговая реализация с помощью COM-соединения

Мы предлагаем рассмотреть подробный пример функции, которая использует COMConnector:


Функция ПолучитьСписокИнформационныхБазЧерезCOM()
    Перем СписокБаз;
    СписокБаз = Новый СписокЗначений;

    Попытка
        // 1. Создаем объект COMConnector для текущей версии платформы
        // Можно указать конкретную версию, например "V83.COMConnector"
        // или универсально "V8.COMConnector" (будет использоваться последняя установленная)
        COMОбъект1С = Новый COMОбъект("V83.COMConnector"); 

        // 2. Получаем список информационных баз
        СписокБД = COMОбъект1С.GetInfoBases();

        // 3. Итерируемся по полученной коллекции объектов InfoBase
        Для Каждого ЭлементСпискаБД Из СписокБД Цикл
            // Объект InfoBase содержит полезные свойства: Name, ConnectString, Version, ClientConnectionSpeed и т.д.
            ИмяБазы = ЭлементСпискаБД.Name;
            СтрокаПодключения = ЭлементСпискаБД.ConnectString;
            
            Если НЕ ПустаяСтрока(ИмяБазы) И НЕ ПустаяСтрока(СтрокаПодключения) Тогда
                СписокБаз.Добавить(СтрокаПодключения, ИмяБазы);
            КонецЕсли;
        КонецЦикла;
    Исключение
        Сообщить("Ошибка при работе с COM-соединением: " + ОписаниеОшибки());
        Сообщить("Возможные причины: COMConnector не установлен или не зарегистрирован, или произошла другая ошибка.");
    КонецПопытки;

    Возврат СписокБаз;
КонецФункции

Важные моменты при использовании COM-соединения:

  1. Регистрация COM-сервера: Для работы COMConnector он должен быть корректно установлен и зарегистрирован в системе. Обычно это происходит автоматически при установке платформы 1С. Если возникают ошибки, убедитесь, что компонента зарегистрирована (regsvr32 "путь_к_bin\comcntr.dll").
  2. Версия платформы: В конструкторе Новый COMОбъект("V83.COMConnector") мы указываем версию V83. Если на компьютере установлена другая версия (например, V82), то нужно использовать соответствующий идентификатор. Можно использовать универсальный V8.COMConnector, который выберет последнюю установленную версию.
  3. Права доступа: Для успешного создания COM-объекта могут потребоваться соответствующие права пользователя.

Преимущества метода COM-соединения:

  1. Универсальность и надежность: Метод не зависит от внутренней структуры файлов .v8i или реестра, поскольку оперирует высокоуровневым программным интерфейсом платформы.
  2. Простота использования: Метод GetInfoBases() сразу возвращает готовые объекты с полным набором свойств, что значительно упрощает парсинг и обработку данных.
  3. Актуальность: Информация о базах всегда будет актуальной, так как метод обращается к тому же механизму, что и стандартный диалог запуска 1С.

Недостатки метода COM-соединения:

  1. Необходимость установки COM-компонента: Для работы на клиентской машине должен быть установлен и зарегистрирован соответствующий COM-компонент платформы 1С.
  2. Нагрузка: Создание COM-объекта и получение списка может занимать некоторое время, особенно если запущено много экземпляров платформы или если список баз очень большой.
  3. Зависимость от версии: Хотя можно использовать универсальный V8.COMConnector, иногда требуется явное указание версии (например, V83.COMConnector), что может вызвать проблемы при обновлении платформы.

Сравнение методов и выбор оптимального решения

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

  1. Парсинг файла 1cestart.v8i: Этот метод является автономным и не требует наличия зарегистрированного COM-сервера. Он идеально подходит, если вам нужна максимально независимая реализация, или если вы столкнулись с ограничениями на использование COM-компонентов в вашей среде. Однако, помните о потенциальной хрупкости кода при изменении формата файла .v8i и о необходимости тщательного парсинга строк.
  2. Использование COM-соединения: Этот метод более "изящен" и надежен в плане получения данных, поскольку он использует официальный программный интерфейс платформы. Он предоставляет доступ к полноценным объектам InfoBase, что упрощает дальнейшую работу с информацией о базах. Если установка и регистрация COM-компонента на клиентской машине не является проблемой, этот подход, безусловно, предпочтительнее благодаря своей универсальности и простоте использования.

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

Дополнительные аспекты, которые следует учесть:

Мы надеемся, что это подробное руководство поможет вам успешно реализовать функциональность получения списка информационных баз в ваших решениях на 1С:Предприятие 8.3.

← На главную