Как получить список информационных баз 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);
				КонецЕсли;					
				
				Если НомСтр >= КоличествоСтрок Тогда
					Прервать;
				КонецЕсли;
				
			КонецЕсли;					
		КонецЦикла;				
	КонецЕсли;			

КонецПроцедуры