Как получить список информационных баз 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>