Драйверы оборудования / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

// Определяет настройки начального заполнения элементов
//
// Параметры:
//  ПолноеИмяОбъекта - Строка - имя объекта, для которого вызывается заполнение.
//  Настройки - Структура:
//    * ПриНачальномЗаполненииЭлемента - Булево - если Истина, то для каждого элемента будет
//      вызвана процедура индивидуального заполнения ПриНачальномЗаполненииЭлемента.
//    * ПредопределенныеДанные - ТаблицаЗначений - данные заполненные в процедуре ПриНачальномЗаполненииЭлементов.
//
Процедура ПриНастройкеНачальногоЗаполненияЭлементов(ПолноеИмяОбъекта, Настройки) Экспорт
	
	Настройки.ПриНачальномЗаполненииЭлемента = Ложь;
	
КонецПроцедуры

// Процедура заполняет предопределенные элементы в справочнике драйверов оборудования.
//
// Параметры:
//  ДрайверыОборудования - ТаблицаЗначений
//
Процедура ПриНачальномЗаполненииЭлементов(ДрайверыОборудования) Экспорт
	
	ТекущийЯзык = ТекущийЯзык();
	КодЯзыка = ?(ТипЗнч(ТекущийЯзык) = Тип("Строка"), ТекущийЯзык, ТекущийЯзык.КодЯзыка); 
	
	ТаблицаДрайверов = Новый ТаблицаЗначений();
	ТаблицаДрайверов.Колонки.Добавить("Ссылка");
	ТаблицаДрайверов.Колонки.Добавить("ИмяПредопределенныхДанных");
	ТаблицаДрайверов.Колонки.Добавить("ВРегИмяПредопределенныхДанных");
	ТаблицаДрайверов.Индексы.Добавить("ВРегИмяПредопределенныхДанных");
	ТаблицаДрайверов.Колонки.Добавить("СпособПодключения");
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ДрайверыОборудования.Ссылка КАК Ссылка,
		|	ДрайверыОборудования.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
		|	ДрайверыОборудования.СпособПодключения КАК СпособПодключения
		|ИЗ
		|	Справочник.ДрайверыОборудования КАК ДрайверыОборудования
		|ГДЕ
		|	ДрайверыОборудования.ИмяПредопределенныхДанных В(&СписокИмена)";
	
	Запрос.УстановитьПараметр("СписокИмена", ДрайверыОборудования.ВыгрузитьКолонку("ИмяДрайвера"));
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	Пока Выборка.Следующий() Цикл
		НоваяСтрока = ТаблицаДрайверов.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
		НоваяСтрока.ВРегИмяПредопределенныхДанных = ВРег(НоваяСтрока.ИмяПредопределенныхДанных);
	КонецЦикла;
	
	НачатьТранзакцию();
	
	Попытка  
		
		Блокировка = Новый БлокировкаДанных();
		ЭлементБлокировки = Блокировка.Добавить("Справочник.ДрайверыОборудования");
		ЭлементБлокировки.ИсточникДанных = ТаблицаДрайверов;
		ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Ссылка", "Ссылка");
		Блокировка.Заблокировать();
		
		Для Каждого ДрайверОборудования Из ДрайверыОборудования Цикл
			
			ПараметрыДрайвера = МенеджерОборудованияКлиентСервер.ПараметрыСозданияНовогоДрайвера();
			ЗаполнитьЗначенияСвойств(ПараметрыДрайвера, ДрайверОборудования);                           
			
			ПараметрыДрайвера.Предопределенный = Истина;
			
			Если ТипЗнч(ПараметрыДрайвера.ТипОборудования) = Тип("Строка") Тогда     
				ПараметрыДрайвера.ТипОборудования = МенеджерОборудования.ТипОборудованияПоСтроке(ПараметрыДрайвера.ТипОборудования);
			КонецЕсли;
			
			СтрокаТаблицы = ТаблицаДрайверов.Найти(ВРег(ПараметрыДрайвера.ИмяДрайвера),"ВРегИмяПредопределенныхДанных");
			Если СтрокаТаблицы <> Неопределено Тогда
				Драйвер = СтрокаТаблицы.Ссылка.ПолучитьОбъект();
				
				ПараметрыДрайвера.СпособПодключения = СтрокаТаблицы.СпособПодключения;
				МакетДоступен = Ложь;                                
				ИмяМакетаДрайвера = ПараметрыДрайвера.ИмяМакетаДрайвера;
				МенеджерОборудования.ЗаполнитьДанныеМакетов(ПараметрыДрайвера.ИмяДрайвера, ИмяМакетаДрайвера, МакетДоступен, Неопределено, КодЯзыка); 
				Если Не МакетДоступен Тогда
					ПараметрыДрайвера.СпособПодключения = Перечисления.СпособПодключенияДрайвера.ИзИнформационнойБазы;
				КонецЕсли;
				
			Иначе
				Драйвер = Справочники.ДрайверыОборудования.СоздатьЭлемент();
				Драйвер.ИмяПредопределенныхДанных = ПараметрыДрайвера.ИмяДрайвера;     
				
				
				МакетДоступен = Ложь;                                
				ИмяМакетаДрайвера = ПараметрыДрайвера.ИмяМакетаДрайвера;
				МенеджерОборудования.ЗаполнитьДанныеМакетов(ПараметрыДрайвера.ИмяДрайвера, ИмяМакетаДрайвера, МакетДоступен, Неопределено, КодЯзыка); 
				Если НЕ ЗначениеЗаполнено(ПараметрыДрайвера.СпособПодключения) Тогда
					Если МакетДоступен Тогда
						ПараметрыДрайвера.СпособПодключения = Перечисления.СпособПодключенияДрайвера.ИзМакета;
					Иначе                                                                   
						ПараметрыДрайвера.СпособПодключения = Перечисления.СпособПодключенияДрайвера.ИзИнформационнойБазы;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
			
			Если (Драйвер.Наименование <> ПараметрыДрайвера.Наименование)
				Или (Драйвер.ИдентификаторОбъекта <> Строка(ПараметрыДрайвера.ИдентификаторОбъекта))
				Или (Драйвер.ВерсияДрайвера <> Строка(ПараметрыДрайвера.ВерсияДрайвера))
				Или (Драйвер.ИмяМакетаДрайвера <> Строка(ПараметрыДрайвера.ИмяМакетаДрайвера))
				Или (Драйвер.ТипОборудования <> ПараметрыДрайвера.ТипОборудования)
				Или (Драйвер.СпособПодключения <> ПараметрыДрайвера.СпособПодключения)
				Или (Драйвер.СнятСПоддержки <> ПараметрыДрайвера.СнятСПоддержки)        
				Или (Драйвер.БезопасноеПодключение <> ПараметрыДрайвера.БезопасноеПодключение) 
				Или (Драйвер.РекомендуемоеИспользование <> ПараметрыДрайвера.РекомендуемоеИспользование) Тогда 
				Драйвер.Наименование          = ПараметрыДрайвера.Наименование;
				Драйвер.ИдентификаторОбъекта  = ПараметрыДрайвера.ИдентификаторОбъекта;
				Драйвер.ВерсияДрайвера        = ПараметрыДрайвера.ВерсияДрайвера;
				Драйвер.ИмяМакетаДрайвера     = ПараметрыДрайвера.ИмяМакетаДрайвера;
				Драйвер.ТипОборудования       = ПараметрыДрайвера.ТипОборудования;
				Драйвер.СпособПодключения     = ПараметрыДрайвера.СпособПодключения;
				Драйвер.СнятСПоддержки        = ПараметрыДрайвера.СнятСПоддержки;
				Драйвер.БезопасноеПодключение      = ПараметрыДрайвера.БезопасноеПодключение; 
				Драйвер.РекомендуемоеИспользование = ПараметрыДрайвера.РекомендуемоеИспользование;
				Если Драйвер.СнятСПоддержки Тогда  
					Драйвер.СообщениеПриИспользовании = Истина;
				КонецЕсли;
				Драйвер.Записать();
			КонецЕсли;
				
		КонецЦикла;
		
		ЗафиксироватьТранзакцию(); 
		
	Исключение
		ОтменитьТранзакцию();    
		ОбщегоНазначенияБПО.ЗаписатьОшибкуВЖурналРегистрации(
			НСтр("ru = 'Заполнение предопределенных элементов драйвера'", ОбщегоНазначенияБПО.КодОсновногоЯзыка()));
	КонецПопытки;
	
КонецПроцедуры

// Процедура заполняет элемент в справочнике драйверов оборудования.
//
// Параметры:
//  ПараметрыСоздания - Структура - параметры создания оборудования.
//
// Возвращаемое значение:
//  СправочникСсылка.ДрайверыОборудования - 
//
Функция СоздатьНовыйЭлемент(ПараметрыСоздания) Экспорт
	
	НовыйЭлемент = Справочники.ДрайверыОборудования.СоздатьЭлемент();
	
	Если ТипЗнч(ПараметрыСоздания.ТипОборудования) = Тип("Строка") Тогда
		ПараметрыСоздания.ТипОборудования = МенеджерОборудования.ТипОборудованияПоСтроке(ПараметрыСоздания.ТипОборудования);
	КонецЕсли;
	
	НовыйЭлемент.ТипОборудования       = ПараметрыСоздания.ТипОборудования;
	НовыйЭлемент.ИдентификаторОбъекта  = ПараметрыСоздания.ИдентификаторОбъекта;
	НовыйЭлемент.Наименование          = ПараметрыСоздания.Наименование;
	НовыйЭлемент.ИмяМакетаДрайвера     = ПараметрыСоздания.ИмяМакетаДрайвера;
	НовыйЭлемент.ВерсияДрайвера        = ПараметрыСоздания.ВерсияДрайвера;
	НовыйЭлемент.СнятСПоддержки        = ПараметрыСоздания.СнятСПоддержки;
	НовыйЭлемент.СпособПодключения     = ПараметрыСоздания.СпособПодключения; 
	НовыйЭлемент.БезопасноеПодключение = ПараметрыСоздания.БезопасноеПодключение;
	Если ПараметрыСоздания.Предопределенный Тогда
		НовыйЭлемент.ИмяПредопределенныхДанных = ПараметрыСоздания.ИмяДрайвера;     
	КонецЕсли;
	
	НовыйЭлемент.Записать();
	
	Возврат НовыйЭлемент.Ссылка;
	
КонецФункции

// Получает ссылку предопределенного элемента по его полному имени.
//
// Параметры:
//  ПолноеИмяПредопределенного - Строка - имя предопределенного элемента.
//
// Возвращаемое значение:
//  СправочникСсылка.ПодключаемоеОборудование,
//  Неопределено.
//
Функция ПредопределенныйЭлемент(Знач ПолноеИмяПредопределенного) Экспорт
	
	ИмяПредопределенного = ВРег(ПолноеИмяПредопределенного);
	
	Точка = Найти(ИмяПредопределенного, ".");
	ИмяКоллекции = Лев(ИмяПредопределенного, Точка - 1);
	ИмяПредопределенного = Сред(ИмяПредопределенного, Точка + 1);
	
	Точка = Найти(ИмяПредопределенного, ".");
	ИмяТаблицы = Лев(ИмяПредопределенного, Точка - 1);
	ИмяПредопределенного = Сред(ИмяПредопределенного, Точка + 1);
	
	ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1 Ссылка ИЗ &ПолноеИмяТаблицы ГДЕ ИмяПредопределенныхДанных = &ИмяПредопределенного";
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПолноеИмяТаблицы", ИмяКоллекции + "." + ИмяТаблицы);
	
	Запрос = Новый Запрос(ТекстЗапроса);
	Запрос.УстановитьПараметр("ИмяПредопределенного", ИмяПредопределенного);
	
	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда
		Возврат Неопределено;
	Иначе
		Возврат Результат.Выгрузить()[0].Ссылка;
	КонецЕсли;
	
КонецФункции

// Функция возвращает структуру с данными драйвера оборудования
// (со значениями реквизитов элемента справочника).
//
// Параметры:
//  ИдентификаторДрайвера - СправочникСсылка.ДрайверыОборудования - идентификатор драйвера.
//
// Возвращаемое значение:
//  Структура.
//
Функция ДанныеДрайвераОборудования(ИдентификаторДрайвера) Экспорт
	
	ТекущийЯзык = ТекущийЯзык();
	КодЯзыка = ?(ТипЗнч(ТекущийЯзык) = Тип("Строка"), ТекущийЯзык, ТекущийЯзык.КодЯзыка); 
	
	ДанныеДрайвера = Новый Структура();
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ДрайверыОборудованияПереопределяемый.Ссылка КАК Ссылка,
		|	ДрайверыОборудованияПереопределяемый.Наименование КАК Наименование,
		|	ДрайверыОборудованияПереопределяемый.ИдентификаторОбъекта КАК ИдентификаторОбъекта,
		|	ДрайверыОборудованияПереопределяемый.ВерсияДрайвера КАК ВерсияДрайвера,       
		|	ДрайверыОборудованияПереопределяемый.ИмяМакетаДрайвера КАК ИмяМакетаДрайвера,
		|	ДрайверыОборудованияПереопределяемый.СнятСПоддержки КАК СнятСПоддержки, 
		|	ДрайверыОборудованияПереопределяемый.СообщениеПриИспользовании КАК СообщениеПриИспользовании,
		|	ДрайверыОборудованияПереопределяемый.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных,
		|	ДрайверыОборудованияПереопределяемый.ТипОборудования КАК ТипОборудования,
		|	ДрайверыОборудованияПереопределяемый.Предопределенный КАК Предопределенный,
		|	ДрайверыОборудованияПереопределяемый.СпособПодключения КАК СпособПодключения,  
		|	ДрайверыОборудованияПереопределяемый.БезопасноеПодключение КАК БезопасноеПодключение
		|ИЗ
		|	Справочник.ДрайверыОборудования КАК ДрайверыОборудованияПереопределяемый
		|ГДЕ
		|	ДрайверыОборудованияПереопределяемый.Ссылка = &Идентификатор";
	
	Запрос.УстановитьПараметр("Идентификатор", ИдентификаторДрайвера);
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		// Заполним структуру данных устройства.
		ДанныеДрайвера.Вставить("Ссылка"                   , Выборка.Ссылка);
		ДанныеДрайвера.Вставить("Наименование"             , Выборка.Наименование);
		ДанныеДрайвера.Вставить("ИдентификаторОбъекта"     , Выборка.ИдентификаторОбъекта);
		ДанныеДрайвера.Вставить("ВерсияДрайвера"           , Выборка.ВерсияДрайвера);
		ДанныеДрайвера.Вставить("СнятСПоддержки"           , Выборка.СнятСПоддержки);           
		ДанныеДрайвера.Вставить("СообщениеПриИспользовании", Выборка.СообщениеПриИспользовании);  
		ДанныеДрайвера.Вставить("ИмяПредопределенныхДанных", Выборка.ИмяПредопределенныхДанных);
		ДанныеДрайвера.Вставить("ТипыОборудования"         , МенеджерОборудования.ПараметрыТипыОборудования(Выборка.ТипОборудования));  
		ДанныеДрайвера.Вставить("ТипОборудования"          , Выборка.ТипОборудования);  
		ДанныеДрайвера.Вставить("ТипОборудованияИмя"       , XMLСтрока(Выборка.ТипОборудования));   
		ДанныеДрайвера.Вставить("БезопасноеПодключение"    , Выборка.БезопасноеПодключение);   
			
		СпособПодключения = Выборка.СпособПодключения;
		ПодключениеИзМакета = СпособПодключения = Перечисления.СпособПодключенияДрайвера.ИзМакета;
		ПодключениеЛокальноПоИдентификатору = СпособПодключения = Перечисления.СпособПодключенияДрайвера.ЛокальноПоИдентификатору;
		
		ШаблонЛокализации = Неопределено;    
		МакетДоступен = Ложь;
		ИмяДрайвера = Выборка.ИмяПредопределенныхДанных;
		ИмяМакетаДрайвера = Выборка.ИмяМакетаДрайвера;    
		Если Не ПустаяСтрока(ИмяДрайвера) Тогда
			МенеджерОборудования.ЗаполнитьДанныеМакетов(ИмяДрайвера, ИмяМакетаДрайвера, МакетДоступен, ШаблонЛокализации, КодЯзыка); 
		КонецЕсли;
	
		ДанныеДрайвера.Вставить("СпособПодключения"        , СпособПодключения);
		ДанныеДрайвера.Вставить("ПодключениеИзМакета"      , ПодключениеИзМакета);
		ДанныеДрайвера.Вставить("ПодключениеЛокальноПоИдентификатору", ПодключениеЛокальноПоИдентификатору);
		ДанныеДрайвера.Вставить("ИмяМакетаДрайвера"  , ИмяМакетаДрайвера);
		ДанныеДрайвера.Вставить("МакетДоступен"      , МакетДоступен);
		ДанныеДрайвера.Вставить("ШаблонЛокализации"  , ШаблонЛокализации);        
		ТипыОборудования = МенеджерОборудования.ДоступныеТипыНесертифицированногоОборудования();
		Если ТипыОборудования.Найти(Выборка.ТипОборудования) = Неопределено Тогда
			Несертифицированное = Ложь;
		Иначе
			Несертифицированное = Истина;
		КонецЕсли;
		ДанныеДрайвера.Вставить("Несертифицированное"  , Несертифицированное);
		
	КонецЦикла;
	
	Возврат ДанныеДрайвера;
	
КонецФункции

// Функция возвращает драйверы по типу оборудования
//
// Параметры:
//  ТипОборудования - ПеречислениеСсылка.ТипыПодключаемогоОборудования - типы подключаемого оборудования.
//  ТолькоДоступные - Булево - признак только доступных драйверов.
//  СнятыеСПоддержкиДрайвера - Булево - признак отображения снятых с поддержки драйверов.       
//  ТолькоРекомендуемоеИспользование - Булево - признак отображения только рекомендуемых к использованию драйверов.
//
// Возвращаемое значение:
//  Массив Из СправочникСсылка.ДрайверыОборудования
//
Функция ДрайверыПоТипуОборудования(ТипОборудования, ТолькоДоступные = Истина, СнятыеСПоддержкиДрайвера = Ложь, РекомендуемоеИспользование = Истина) Экспорт
	
	СписокДрайверов = Новый СписокЗначений();
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ДрайверыОборудованияПереопределяемый.Ссылка КАК Ссылка,
		|	ДрайверыОборудованияПереопределяемый.Наименование КАК Наименование,
		|	ДрайверыОборудованияПереопределяемый.ТипОборудования КАК ТипОборудования,
		|	ДрайверыОборудованияПереопределяемый.Предопределенный КАК Предопределенный
		|ИЗ
		|	Справочник.ДрайверыОборудования КАК ДрайверыОборудованияПереопределяемый
		|ГДЕ
		|	ДрайверыОборудованияПереопределяемый.ТипОборудования = &ТипОборудования
		|	И (НЕ &ТолькоДоступные
		|			ИЛИ НЕ ДрайверыОборудованияПереопределяемый.ПометкаУдаления)
		|	И (&СнятыеСПоддержки
		|			ИЛИ НЕ ДрайверыОборудованияПереопределяемый.СнятСПоддержки)
		|	И (НЕ &РекомендуемоеИспользование 
		|			ИЛИ ДрайверыОборудованияПереопределяемый.РекомендуемоеИспользование)
		|
		|УПОРЯДОЧИТЬ ПО
		|	ДрайверыОборудованияПереопределяемый.Наименование";
			
	Запрос.УстановитьПараметр("ТолькоДоступные" ,  ТолькоДоступные); 
	Запрос.УстановитьПараметр("СнятыеСПоддержки", СнятыеСПоддержкиДрайвера);     
	Запрос.УстановитьПараметр("РекомендуемоеИспользование", РекомендуемоеИспользование);     
	Запрос.УстановитьПараметр("ТипОборудования" , ТипОборудования); 
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		СписокДрайверов.Добавить(ВыборкаДетальныеЗаписи.Ссылка, ВыборкаДетальныеЗаписи.Наименование);
	КонецЦикла;
	
	Возврат СписокДрайверов;
	
КонецФункции

// СтандартныеПодсистемы.УправлениеДоступом
// См. УправлениеДоступомПереопределяемый.ПриЗаполненииСписковСОграничениемДоступа.
//
// Параметры:
//  Ограничение - Структура:
//    * Текст                             - Строка - ограничение доступа для пользователей.
//                                          Если пустая строка, значит, доступ разрешен.
//    * ТекстДляВнешнихПользователей      - Строка - ограничение доступа для внешних пользователей.
//                                          Если пустая строка, значит, доступ запрещен.
//    * ПоВладельцуБезЗаписиКлючейДоступа - Неопределено - определить автоматически.
//                                        - Булево - если Ложь, то всегда записывать ключи доступа,
//                                          если Истина, тогда не записывать ключи доступа,
//                                          а использовать ключи доступа владельца (требуется,
//                                          чтобы ограничение было строго по объекту-владельцу).
//   * ПоВладельцуБезЗаписиКлючейДоступаДляВнешнихПользователей - Неопределено, Булево - также
//                                          как у параметра ПоВладельцуБезЗаписиКлючейДоступа.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
	
	Менеджер = "Справочник.ДрайверыОборудования";
	МенеджерОборудованияВызовСервераПереопределяемый.ПриЗаполненииОграниченияДоступа(Менеджер, Ограничение);
	
КонецПроцедуры
// Конец СтандартныеПодсистемы.УправлениеДоступом

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

// Возвращает массив идентификаторов всех драйверов Библиотеки 
// 
// Возвращаемое значение:
//   Массив из Строка - массив содержащий идентификаторы драйверов
Функция ИдентификаторыДрайверов() Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Идентификаторы = Новый Массив();
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ДрайверыОборудования.ИдентификаторОбъекта КАК Идентификатор
		|ИЗ
		|	Справочник.ДрайверыОборудования КАК ДрайверыОборудования
		|ГДЕ
		|	ДрайверыОборудования.Предопределенный
		|	И НЕ ДрайверыОборудования.СнятСПоддержки";
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Идентификаторы.Добавить(Выборка.Идентификатор);
	КонецЦикла;
	
	МенеджерОборудованияВызовСервераПереопределяемый.ПриПолученииИдентификаторовДрайверов(Идентификаторы);
	
	Возврат Идентификаторы;
	
КонецФункции

Процедура ЗарегистрироватьНесертифицированныеДрайверы(ДрайверыОборудования) Экспорт
	
	// ++ НеМобильноеПриложение
	Если Не ОбщегоНазначенияБПО.ИспользуетсяНесертифицированноеОборудование() Тогда
		Возврат 
	КонецЕсли;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ДрайверыОборудования.Ссылка КАК Ссылка,
		|	ДрайверыОборудования.Наименование КАК Наименование,
		|	ДрайверыОборудования.ТипОборудования КАК ТипОборудования,
		|	ДрайверыОборудования.ИдентификаторОбъекта КАК ИдентификаторОбъекта,
		|	ДрайверыОборудования.ВерсияДрайвера КАК ВерсияДрайвера,
		|	ДрайверыОборудования.ИмяМакетаДрайвера КАК ИмяМакетаДрайвера,
		|	ДрайверыОборудования.СетевойРежим КАК СетевойРежим,
		|	ДрайверыОборудования.СерверныйРежим КАК СерверныйРежим,
		|	ДрайверыОборудования.СнятСПоддержки КАК СнятСПоддержки,
		|	ДрайверыОборудования.ЛокальныйРежим КАК ЛокальныйРежим
		|ИЗ
		|	Справочник.ДрайверыОборудования КАК ДрайверыОборудования
		|ГДЕ
		|	ДрайверыОборудования.ТипОборудования В(&ТипыПрочегоОборудования)";
	
	ТипыОборудования =  МенеджерОборудования.ДоступныеТипыНесертифицированногоОборудования();
	Запрос.УстановитьПараметр("ТипыПрочегоОборудования", ТипыОборудования);
	

	Результат = Запрос.Выполнить();
	ТаблицаДрайверов = Результат.Выгрузить();
	
	Для Каждого Драйвер Из ДрайверыОборудования Цикл // Структура
		
		Если Не РеквизитыДрайвераЗаполнены(Драйвер) Тогда
			#Если НЕ МобильноеПриложениеСервер Тогда
				ТекстСообщения = НСтр("ru = 'Не корректно заполнены реквизиты драйвера ""%1"".
				|Для регистрации должны быть заполнены: Тип оборудования, Наименование, Идентификатор объекта, Имя макета.'");
				ТекстСообщения = СтрШаблон(ТекстСообщения, Драйвер.Наименование);
				МодульОборудованиеНесертифицированноеКлиентСервер = ОбщегоНазначенияБПО.ОбщийМодуль("ОборудованиеНесертифицированноеКлиентСервер");
				ЗаписьЖурналаРегистрации(МодульОборудованиеНесертифицированноеКлиентСервер.СобытиеЖурналаРегистрации(),
				УровеньЖурналаРегистрации.Ошибка,,, ТекстСообщения);
			#КонецЕсли
			Продолжить;
		КонецЕсли;
		
		Строка = ТаблицаДрайверов.Найти(Драйвер.ИдентификаторОбъекта, "ИдентификаторОбъекта");
		Если Строка = Неопределено Тогда
			ДрайверОбъект = Справочники.ДрайверыОборудования.СоздатьЭлемент();
			ЗаполнитьЗначенияСвойств(ДрайверОбъект, Драйвер);
			ДрайверОбъект.СпособПодключения = Перечисления.СпособПодключенияДрайвера.ИзМакета;
			ДрайверОбъект.Записать();
		Иначе
			Если ОбъектыИдентичны(Строка, Драйвер, Результат.Колонки, "Ссылка") Тогда
				Продолжить;
			КонецЕсли;
			ДрайверОбъект = Строка.Ссылка.ПолучитьОбъект();
			ЗаполнитьЗначенияСвойств(ДрайверОбъект, Драйвер);
			ДрайверОбъект.Записать();
		КонецЕсли
	КонецЦикла;
	// -- НеМобильноеПриложение
	
КонецПроцедуры

#КонецОбласти

// ++ НеМобильноеПриложение
#Область СлужебныеПроцедурыИФункции

Функция ОбъектыИдентичны(Объект1, Объект2, Колонки, Исключения = "")
	
	МассивИсключений = СтрРазделить(Исключения, ",", Ложь);
	Для Каждого Поле Из Колонки Цикл
		ИмяПоля = СокрЛП(Поле.Имя);
		Если МассивИсключений.Найти(ИмяПоля)<>Неопределено Тогда
			Продолжить;
		КонецЕсли;
		Если Объект1[ИмяПоля] <> Объект2[ИмяПоля] Тогда
			Возврат Ложь;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Истина;
	
КонецФункции

// Параметры:
//  Драйвер - Структура
//
// Возвращаемое значение:
//  Булево
Функция РеквизитыДрайвераЗаполнены(Драйвер)
	
	Возврат ЗначениеЗаполнено(Драйвер.ТипОборудования) И
		ЗначениеЗаполнено(Драйвер.Наименование) И
		ЗначениеЗаполнено(Драйвер.ИдентификаторОбъекта) И
		ЗначениеЗаполнено(Драйвер.ИмяМакетаДрайвера);
	
КонецФункции

#КонецОбласти                
// -- НеМобильноеПриложение

#КонецЕсли

Связанные материалы