Как получить список информационных баз 1С?
--Павел Лазарев 17:12, 7 сентября 2010 (MSD)
Работающий код. Список баз строится в виде дерева, на верхнем уровне которого - платформа "8.2" или "8.1", затем - дерево каталогов как настроено в утилите запуска 1С.
Источник кода получения списка баз - помощник настройки обменов из типовых. Доработано для вывода сразу по всем платформам и в виде дерева с каталогами.
Процедура ОбновитьБазы()
Базы.Строки.Очистить();
тзБазы = ПолучитьСписокИБ();
тзБазы.Колонки.Добавить("Уровень1");
тзБазы.Колонки.Добавить("Уровень2");
тзБазы.Колонки.Добавить("Уровень3");
тзБазы.Колонки.Добавить("Уровень4");
тзБазы.Колонки.Добавить("Уровень5");
тзБазы.Колонки.Добавить("Уровень6");
Для каждого строка из тзБазы Цикл
мзУровни = мзИзСтрокиСРазделителями(строка.Папка, "/");
НомерУровня = 1;
Для каждого уровень из мзУровни Цикл
Если НомерУровня > 6 Тогда
Прервать;
КонецЕсли;
Имя = "Уровень" + Строка(НомерУровня);
строка[Имя] = уровень;
НомерУровня = НомерУровня + 1;
КонецЦикла;
КонецЦикла;
тзПлатформы = тзБазы.Скопировать();
тзПлатформы.Свернуть("Платформа");
Для каждого строкаПлатформа из тзПлатформы Цикл
платформа = строкаПлатформа.Платформа;
ЗаполнитьУровень(Базы, тзБазы, платформа, Новый Массив, "");
КонецЦикла;
текСтрока = Базы.Строки.Найти(ТекущийПуть, "Путь", Истина);
Если текСтрока <> Неопределено Тогда
ЭлементыФормы.Базы.ТекущаяСтрока = текСтрока;
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьУровень(корень, тзБазы, платформа, пУровни, ЗначениеУровня)
мзУровни = Новый Массив;
Для каждого уровень из пУровни Цикл
мзУровни.Добавить(уровень);
КонецЦикла;
новыйКорень = корень.Строки.Добавить();
Если ЗначениеЗаполнено(ЗначениеУровня) Тогда
мзУровни.Добавить(ЗначениеУровня);
новыйКорень.Имя = ЗначениеУровня;
Иначе
новыйКорень.Имя = платформа;
КонецЕсли;
ИмяТекущийУровень = "Уровень" + Строка(мзУровни.Количество() + 1);
стОтбор = Новый Структура("Платформа", платформа);
НомерУровня = 1;
Для каждого уровень из мзУровни Цикл
стОтбор.Вставить("Уровень" + Строка(НомерУровня), уровень);
НомерУровня = НомерУровня + 1;
КонецЦикла;
тзУровень = тзБазы.СкопироватьКолонки();
мзСтроки = тзБазы.НайтиСтроки(стОтбор);
Для каждого строкаБаза из мзСтроки Цикл
Если ЗначениеЗаполнено(строкаБаза[ИмяТекущийУровень]) Тогда
строкаУровень = тзУровень.Добавить();
ЗаполнитьЗначенияСвойств(строкаУровень, строкаБаза);
Иначе
ветка = новыйКорень.Строки.Добавить();
ЗаполнитьЗначенияСвойств(ветка, строкаБаза);
КонецЕсли;
КонецЦикла;
тзУровень.Свернуть(ИмяТекущийУровень);
Для каждого строкаУровень из тзУровень Цикл
ЗаполнитьУровень(новыйКорень, тзБазы, платформа, мзУровни, строкаУровень[ИмяТекущийУровень]);
КонецЦикла;
КонецПроцедуры
// Функция создает массив из строки с разделителями
//
// Параметры
// Знач стр - исходная строка
// Разделитель = ","
//
// Возвращаемое значение:
// - массив
//
Функция мзИзСтрокиСРазделителями(Знач стр, Разделитель = ",") Экспорт
Список = Новый Массив;
стр = СокрЛП(стр);
Если Найти(стр, Разделитель) = 0 Тогда
Если Не ПустаяСтрока(стр) Тогда Список.Добавить(СокрЛП(стр)); КонецЕсли;
Возврат Список;
КонецЕсли;
стр = стрЗаменить(стр, Разделитель, Символы.ПС);
ВсегоСтрок = СтрЧислоСтрок(стр);
Для ъ = 1 По ВсегоСтрок Цикл
текСтрока = СокрЛП(СтрПолучитьСтроку(стр, ъ));
Если ПустаяСтрока(текСтрока) И ъ = ВсегоСтрок Тогда Прервать; КонецЕсли; //Если последняя строка пустая, то не добавляем.
Если ПустаяСтрока(текСтрока) И ъ = 1 Тогда Продолжить; КонецЕсли; //Если первая строка пустая, то не добавляем.
Список.Добавить(текСтрока);
КонецЦикла;
Возврат Список;
КонецФункции
// Процедура получает из реестра путь к каталогам текущего пользователя
// а по указанному пути получает список зарегистрированных ИБ
//
Функция ПолучитьСписокИБ() Экспорт
ТаблицаПути = Новый ТаблицаЗначений;
ТаблицаПути.Колонки.Добавить("Платформа",,, 8);
ТаблицаПути.Колонки.Добавить("Имя",,, 50);
ТаблицаПути.Колонки.Добавить("Путь",,, 50);
ТаблицаПути.Колонки.Добавить("Папка",,, 50);
ТаблицаПути.Очистить();
Попытка
ScrptCtrl=Новый COMObject("MSScriptControl.ScriptControl");
ScrptCtrl.Language="vbscript";
ScrptCtrl.AddCode("
|Function Get1CV8Titles()
| const HKEY_CURRENT_USER = &H80000001
| Set oReg=GetObject(""winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv"")
| strKeyPath = ""Volatile Environment""
| oReg.EnumValues HKEY_CURRENT_USER, strKeyPath, arrValues
| strInfo=vbNullString
| Get1CV8Titles = strInfo
| On Error Resume Next
| For i = LBound(arrValues) To UBound(arrValues)
| call oReg.GetStringValue(HKEY_CURRENT_USER,strKeyPath,arrValues(i),Value)
| if (arrValues(i) = ""APPDATA"") then
| strInfo=Value
| end if
| Next
| Get1CV8Titles = strInfo
|End Function
|");
//Если ВерсияПлатформы = "81" Тогда
//Пути к базам 8.1
//пути к локальным базам
Путь=СокрЛП(ScrptCtrl.Run("Get1CV8Titles")) + "\1C\1Cv81\ibases.v8i";
Файл = Новый Файл(Путь);
Если Файл.Существует() Тогда
РазложитьПуть(ТаблицаПути, "8.1", Путь);
КонецЕсли;
//пути к общим базам
Путь=СокрЛП(ScrptCtrl.Run("Get1CV8Titles")) + "\1C\1Cv81\ibases.v8l";
Файл = Новый Файл(Путь);
Если Файл.Существует() Тогда
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(Путь);
КоличествоСтрок = ТекстовыйДокумент.КоличествоСтрок();
Если КоличествоСтрок <> 0 Тогда
Для НомСтр = 1 По КоличествоСтрок Цикл
Путь = ТекстовыйДокумент.ПолучитьСтроку(НомСтр);
Файл = Новый Файл(Путь);
Если Файл.Существует() Тогда
РазложитьПуть(ТаблицаПути, "8.1", Путь);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
//Иначе
//Пути к базам 8.2
//пути к локальным базам
Путь=СокрЛП(ScrptCtrl.Run("Get1CV8Titles")) + "\1C\1CEStart\ibases.v8i";
Файл = Новый Файл(Путь);
Если Файл.Существует() Тогда
РазложитьПуть(ТаблицаПути, "8.2", Путь);
КонецЕсли;
//пути к общим базам
Путь=СокрЛП(ScrptCtrl.Run("Get1CV8Titles")) + "\1C\1CEStart\ibases.v8l";
Файл = Новый Файл(Путь);
Если Файл.Существует() Тогда
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(Путь);
КоличествоСтрок = ТекстовыйДокумент.КоличествоСтрок();
Если КоличествоСтрок <> 0 Тогда
Для НомСтр = 1 По КоличествоСтрок Цикл
Путь = ТекстовыйДокумент.ПолучитьСтроку(НомСтр);
Файл = Новый Файл(Путь);
Если Файл.Существует() Тогда
РазложитьПуть(ТаблицаПути, "8.2", Путь);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
//КонецЕсли;
Исключение
Предупреждение(ОписаниеОшибки());
КонецПопытки;
ТаблицаПути.Свернуть("Платформа, Имя, Путь, Папка"); //, Пользователь, Пароль",);
ТаблицаПути.Сортировать("Платформа Убыв, Папка, Имя");
Возврат ТаблицаПути;
КонецФункции //ПолучитьСписокИБ
Процедура РазложитьПуть(ТаблицаПути, Платформа, Путь)
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.Прочитать(Путь);
Если ТекстовыйДокумент.КоличествоСтрок() <> 0 Тогда
КоличествоСтрок = ТекстовыйДокумент.КоличествоСтрок();
Для НомСтр = 1 По КоличествоСтрок Цикл
ИмяИБ = "";
ПутьИБ = "";
Папка = "";
ТекСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомСтр);
Если Лев(ТекСтрока,1) = "[" И Прав(ТекСтрока,1) = "]" Тогда
ИмяИБ = Сред(ТекСтрока,2,СтрДлина(ТекСтрока)-2);
НомСтр = НомСтр + 1;
ТекСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомСтр);
Если Найти(ТекСтрока, "Connect=File=") <> 0 Тогда
//ПутьИБ = Сред(ТекСтрока,15, СтрДлина(ТекСтрока)-16);
ПутьИБ = Сред(ТекСтрока, 9, СтрДлина(ТекСтрока)- 9);
НоваяСтрока = ТаблицаПути.Добавить();
НоваяСтрока.Имя = ИмяИБ;
НоваяСтрока.Путь = ПутьИБ;
НоваяСтрока.Платформа = Платформа;
//ТекСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомСтр + 1); // ID
//ТекСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомСтр + 2); // OrderList
ТекСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомСтр + 3); // Folder
НоваяСтрока.Папка = Сред(текСтрока, 8);
ИначеЕсли Найти(ТекСтрока, "Connect=Srvr=") <> 0 Тогда
ПутьИБ = Сред(ТекСтрока, 9, СтрДлина(ТекСтрока)- 9);
НоваяСтрока = ТаблицаПути.Добавить();
НоваяСтрока.Имя = ИмяИБ;
НоваяСтрока.Путь = ПутьИБ;
НоваяСтрока.Платформа = Платформа;
//ТекСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомСтр + 1); // ID
//ТекСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомСтр + 2); // OrderList
ТекСтрока = ТекстовыйДокумент.ПолучитьСтроку(НомСтр + 3); // Folder
НоваяСтрока.Папка = Сред(текСтрока, 8);
КонецЕсли;
Если НомСтр >= КоличествоСтрок Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры