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