Как получить список информационных баз 1С?
--Павел Лазарев 17:12, 7 сентября 2010 (MSD)
Работающий код. Список баз строится в виде дерева, на верхнем уровне которого - платформа "8.2" или "8.1", затем - дерево каталогов как настроено в утилите запуска 1С.
Источник кода получения списка баз - помощник настройки обменов из типовых. Доработано для вывода сразу по всем платформам и в виде дерева с каталогами.
<source lang=1c> Процедура ОбновитьБазы() Базы.Строки.Очистить();
тзБазы = ПолучитьСписокИБ(); тзБазы.Колонки.Добавить("Уровень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); КонецЕсли;
Если НомСтр >= КоличествоСтрок Тогда Прервать; КонецЕсли;
КонецЕсли; КонецЦикла; КонецЕсли;
КонецПроцедуры
</source>