При разработке различных утилит или обработок на платформе 1С:Предприятие 8.3, особенно когда речь идет об обычных формах, часто возникает задача получить список всех информационных баз, которые зарегистрированы на клиентском компьютере. Это может быть необходимо для автоматизации выбора базы пользователем, создания специализированных лаунчеров или инструментов для миграции данных. Мы с вами подробно разберем, как решить эту задачу, используя два основных подхода: парсинг конфигурационного файла и взаимодействие через COM-соединение.
Начнем с того, что выясним, почему эта задача не всегда очевидна. В отличие от управляемых форм, где некоторые метаданные могут быть более доступны, на обычных формах прямой функциональности для получения списка баз нет. Платформа 1С хранит информацию о зарегистрированных базах не внутри конфигурации, а во внешних файлах или в системном реестре. Именно к этим источникам нам и предстоит обратиться.
Мы рассмотрим каждый из методов, обсудим его преимущества и недостатки, а также предоставим детальные примеры кода 1С для их реализации.
Один из наиболее распространенных способов хранения информации о зарегистрированных базах 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, используя системные переменные окружения.
WScript.Shell для получения значения переменной окружения %APPDATA%, что гарантирует корректное определение пути независимо от операционной системы и настроек пользователя.ТекстовыйДокумент.[ и 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=") Тогда
// Здесь мы можем взять всю строку подключения как есть,
// либо парсить по серверам и именам баз на сервере.
// Для простоты пока возьмем как есть, но это можно доработать.
СтрокаПодключенияБазы = СтрокаПодключенияБазыПолная;
КонецЕсли;
// Добавляем найденную базу в список, если имя и строка подключения определены
Если НЕ ПустаяСтрока(ИмяБазы) И НЕ ПустаяСтрока(СтрокаПодключенияБазы) Тогда
СписокБаз.Добавить(СтрокаПодключенияБазы, ИмяБазы);
ИмяБазы = ""; // Сбрасываем, чтобы избежать дублирования, если есть другие параметры до следующей базы
КонецЕсли;
КонецЕсли;
КонецЦикла;
Иначе
Сообщить("Файл списка информационных баз не найден: " + ПутьКФайлуБаз);
КонецЕсли;
Возврат СписокБаз;
КонецФункции
Преимущества метода парсинга файла:
Недостатки метода парсинга файла:
1cestart.v8i. При изменении формата в будущих версиях платформы код может перестать работать.HKCU\Software\1C\1CEStart\V8).Альтернативный и зачастую более элегантный способ получить список информационных баз — это использовать COM-соединение к самой платформе 1С:Предприятие. Этот метод позволяет обратиться к объекту COMConnector, который предоставляет доступ к функциональности платформы извне.
Принцип работы COM-соединения
Объект V83.COMConnector (или V82.COMConnector для версии 8.2) — это COM-сервер, который устанавливается вместе с платформой 1С. Он предоставляет программный интерфейс для взаимодействия с платформой. Одним из методов этого интерфейса является GetInfoBases(), который возвращает коллекцию объектов InfoBase, каждый из которых представляет собой зарегистрированную информационную базу со всеми ее свойствами.
Мы предлагаем рассмотреть подробный пример функции, которая использует 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-соединения:
COMConnector он должен быть корректно установлен и зарегистрирован в системе. Обычно это происходит автоматически при установке платформы 1С. Если возникают ошибки, убедитесь, что компонента зарегистрирована (regsvr32 "путь_к_bin\comcntr.dll").Новый COMОбъект("V83.COMConnector") мы указываем версию V83. Если на компьютере установлена другая версия (например, V82), то нужно использовать соответствующий идентификатор. Можно использовать универсальный V8.COMConnector, который выберет последнюю установленную версию.Преимущества метода COM-соединения:
.v8i или реестра, поскольку оперирует высокоуровневым программным интерфейсом платформы.GetInfoBases() сразу возвращает готовые объекты с полным набором свойств, что значительно упрощает парсинг и обработку данных.Недостатки метода COM-соединения:
V8.COMConnector, иногда требуется явное указание версии (например, V83.COMConnector), что может вызвать проблемы при обновлении платформы.Мы с вами рассмотрели два мощных подхода к решению задачи получения списка информационных баз 1С. Давайте суммируем наши наблюдения, чтобы помочь вам выбрать наиболее подходящий вариант для вашей конкретной ситуации.
.v8i и о необходимости тщательного парсинга строк.InfoBase, что упрощает дальнейшую работу с информацией о базах. Если установка и регистрация COM-компонента на клиентской машине не является проблемой, этот подход, безусловно, предпочтительнее благодаря своей универсальности и простоте использования.В большинстве случаев, если нет жестких ограничений на использование COM-компонентов, метод с COM-соединением будет более предпочтительным выбором для программиста. Он обеспечивает более стабильный и удобный доступ к информации, минимизируя риски, связанные с изменениями внутренней структуры файлов платформы. Однако, если требуется максимальная "легковесность" и отсутствие внешних зависимостей, парсинг файла остается вполне рабочим решением.
Дополнительные аспекты, которые следует учесть:
Попытка-Исключение. Мы всегда рекомендуем использовать их для надежной работы ваших решений, поскольку внешние файлы могут отсутствовать, быть повреждены или COM-объект может быть недоступен.СписокЗначений легко отобразить в элементе управления "Поле списка" на обычной форме, предоставив пользователю возможность выбрать нужную базу.Мы надеемся, что это подробное руководство поможет вам успешно реализовать функциональность получения списка информационных баз в ваших решениях на 1С:Предприятие 8.3.