///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

// Параметры для вызова процедуры ВнешниеКомпонентыКлиент.ПодключитьКомпоненту.
//
// Возвращаемое значение:
//  Структура:
//      * Кэшировать - Булево - (по умолчанию Истина) использовать механизм кэширования компонент на клиенте.
//      * ПредложитьУстановить - Булево - (по умолчанию Истина) предлагать устанавливать компоненту.
//      * ПредложитьЗагрузить - Булево - (по умолчанию Истина) предлагать загрузить компоненту с сайта ИТС.
//      * ТекстПояснения - Строка - для чего нужна компонента и что не будет работать, если ее не устанавливать.
//      * ИдентификаторыСозданияОбъектов - Массив - массив строк идентификаторов создания экземпляров модуля объекта,
//                используется только для компонент, у которых есть несколько идентификаторов создания объектов,
//                при задании параметр Идентификатор будет использоваться только для определения компоненты.
//      * Изолированно - Булево, Неопределено - (по умолчанию Неопределено) если Истина, компонента будет подключена
//                изолированно, в этом случае внешняя компонента загружается в отдельный процесс операционной системы;
//                Ложь - в этом случае внешняя компонента будет выполняться в том же процессе операционной системы,
//                который выполняет код встроенного языка; Неопределено - поддерживается поведение платформы по умолчанию:
//                изолированно - если компонентой поддерживается только этот режим, не изолированно - в остальных случаях.
//                См. https://its.1c.eu/db/v83doc#bookmark:dev:TI000001866
//      * ОбновлятьАвтоматически - Булево - (по умолчанию Истина) при загрузке внешней компоненты устанавливать
//                признак ОбновлятьСПортала1СИТС
//
// Пример:
//
//  ПараметрыПодключения = ВнешниеКомпонентыКлиент.ПараметрыПодключения();
//  ПараметрыПодключения.ТекстПояснения = 
//      НСтр("ru = 'Для использования сканера штрихкодов требуется
//                 |внешняя компонента ""1С:Сканеры штрихкода (NativeApi)"".'");
//
Функция ПараметрыПодключения() Экспорт
	
	Параметры = Новый Структура;
	Параметры.Вставить("Кэшировать", Истина);
	Параметры.Вставить("ПредложитьУстановить", Истина);
	Параметры.Вставить("ПредложитьЗагрузить", Истина);
	Параметры.Вставить("ТекстПояснения", "");
	Параметры.Вставить("ИдентификаторыСозданияОбъектов", Новый Массив);
	Параметры.Вставить("Изолированно", Неопределено);
	Параметры.Вставить("ОбновлятьАвтоматически", Истина);
	
	Возврат Параметры;
	
КонецФункции

// Подключает компоненту, выполненную по технологии Native API или COM на клиентском компьютере.
// Для веб-клиента предлагается диалог, подсказывающий пользователю действия по установке.
// Выполняет проверку возможности исполнения компоненты на текущем клиенте пользователя.
//
// Параметры:
//  Оповещение - ОписаниеОповещения - описание оповещения о подключении со следующими параметрами:
//      * Результат - Структура - результат подключения компоненты:
//          ** Подключено - Булево - признак подключения;
//          ** ПодключаемыйМодуль - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты;
//                                - ФиксированноеСоответствие из КлючИЗначение - экземпляры объектов внешней компоненты,
//                                      указанные в ПараметрыПодключения.ИдентификаторыСозданияОбъектов:
//                                    *** Ключ - Строка - идентификатор внешней компоненты;
//                                    *** Значение - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты.
//          ** ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка.
//      * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения.
//  Идентификатор - Строка - идентификатор объекта внешней компоненты.
//  Версия        - Строка - версия компоненты.
//  ПараметрыПодключения - см. ВнешниеКомпонентыКлиент.ПараметрыПодключения.
//
// Пример:
//
//  Оповещение = Новый ОписаниеОповещения("ПодключитьКомпонентуЗавершение", ЭтотОбъект);
//
//  ПараметрыПодключения = ВнешниеКомпонентыКлиент.ПараметрыПодключения();
//  ПараметрыПодключения.ТекстПояснения = 
//      НСтр("ru = 'Для использования сканера штрихкодов требуется
//                 |внешняя компонента ""1С:Сканеры штрихкода (NativeApi)"".'");
//
//  ВнешниеКомпонентыКлиент.ПодключитьКомпоненту(Оповещение, "InputDevice",, ПараметрыПодключения);
//
//  &НаКлиенте
//  Процедура ПодключитьКомпонентуЗавершение(Результат, ДополнительныеПараметры) Экспорт
//
//      ПодключаемыйМодуль = Неопределено;
//
//      Если Результат.Подключено Тогда 
//          ПодключаемыйМодуль = Результат.ПодключаемыйМодуль;
//      Иначе
//          Если Не ПустаяСтрока(Результат.ОписаниеОшибки) Тогда
//              ПоказатьПредупреждение(, Результат.ОписаниеОшибки);
//          КонецЕсли;
//      КонецЕсли;
//
//      Если ПодключаемыйМодуль <> Неопределено Тогда 
//          // ПодключаемыйМодуль содержит созданный экземпляр подключенной компоненты.
//      КонецЕсли;
//
//      ПодключаемыйМодуль = Неопределено;
//
//  КонецПроцедуры
//
Процедура ПодключитьКомпоненту(Оповещение, Идентификатор, Версия = Неопределено,
	ПараметрыПодключения = Неопределено) Экспорт
	
	Если ПараметрыПодключения = Неопределено Тогда
		ПараметрыПодключения = ПараметрыПодключения();
	КонецЕсли;
	
	Контекст = ОбщегоНазначенияСлужебныйКлиент.КонтекстПодключенияКомпоненты();
	ЗаполнитьЗначенияСвойств(Контекст, ПараметрыПодключения);
	Контекст.Оповещение = Оповещение;
	Контекст.Идентификатор = Идентификатор;
	Контекст.Версия = Версия;
	
	ВнешниеКомпонентыСлужебныйКлиент.ПодключитьКомпоненту(Контекст);
	
КонецПроцедуры

// Подключает компоненту, выполненную по технологии COM, из реестра Windows в асинхронном режиме.
// (не рекомендуется, для обратной совместимости с компонентами 1С 7.7). 
//
// Параметры:
//  Оповещение - ОписаниеОповещения - описание оповещения о подключении со следующими параметрами:
//      * Результат - Структура - результат подключения компоненты:
//          ** Подключено - Булево - признак подключения.
//          ** ПодключаемыйМодуль - ОбъектВнешнейКомпоненты  - экземпляр объекта внешней компоненты.
//          ** ОписаниеОшибки - Строка - краткое описание ошибки.
//      * ДополнительныеПараметры - Структура - значение, которое было указано при создании объекта ОписаниеОповещения.
//  Идентификатор - Строка - идентификатор объекта внешней компоненты.
//  ИдентификаторСозданияОбъекта - Строка - идентификатор создания экземпляра модуля объекта
//          (только для компонент, у которых идентификатор создания объекта отличается от ProgID).
//
// Пример:
//
//  Оповещение = Новый ОписаниеОповещения("ПодключитьКомпонентуЗавершение", ЭтотОбъект);
//  ВнешниеКомпонентыКлиент.ПодключитьКомпонентуИзРеестраWindows(Оповещение, "SBRFCOMObject", "SBRFCOMExtension");
//
//  &НаКлиенте
//  Процедура ПодключитьКомпонентуЗавершение(Результат, ДополнительныеПараметры) Экспорт
//
//      ПодключаемыйМодуль = Неопределено;
//
//      Если Результат.Подключено Тогда 
//          ПодключаемыйМодуль = Результат.ПодключаемыйМодуль;
//      Иначе 
//          ПоказатьПредупреждение(, Результат.ОписаниеОшибки);
//      КонецЕсли;
//
//      Если ПодключаемыйМодуль <> Неопределено Тогда 
//          // ПодключаемыйМодуль содержит созданный экземпляр подключенной компоненты.
//      КонецЕсли;
//
//      ПодключаемыйМодуль = Неопределено;
//
//  КонецПроцедуры
//
Процедура ПодключитьКомпонентуИзРеестраWindows(Оповещение, Идентификатор,
	ИдентификаторСозданияОбъекта = Неопределено) Экспорт 
	
	Контекст = ВнешниеКомпонентыСлужебныйКлиент.КонтекстПодключенияКомпонентыИзРеестраWindows();
	Контекст.Оповещение = Оповещение;
	Контекст.Идентификатор = Идентификатор;
	Контекст.ИдентификаторСозданияОбъекта = ИдентификаторСозданияОбъекта;
	
	ВнешниеКомпонентыСлужебныйКлиент.ПодключитьКомпонентуИзРеестраWindows(Контекст);
	
КонецПроцедуры

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

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


// Возвращает структуру параметров для описания правил поиска дополнительной информации в составе внешней компоненты,
// см. процедуру ЗагрузитьКомпонентуИзФайла.
//
// Возвращаемое значение:
//  Структура:
//      * ИмяФайлаXML - Строка - (необязательный) имя файла в составе компоненты, из которого будет извлечена информация.
//      * ВыражениеXPath - Строка - (необязательный) XPath путь до информации в файле.
//
// Пример:
//
//  ПараметрыЗагрузки = ВнешниеКомпонентыКлиент.ПараметрыПоискаДополнительнойИнформации();
//  ПараметрыЗагрузки.ИмяФайлаXML = "INFO.XML";
//  ПараметрыЗагрузки.ВыражениеXPath = "//drivers/component/@type";
//
Функция ПараметрыПоискаДополнительнойИнформации() Экспорт
	
	Параметры = Новый Структура;
	Параметры.Вставить("ИмяФайлаXML", "");
	Параметры.Вставить("ВыражениеXPath", "");
	
	Возврат Параметры;
	
КонецФункции

// Структура параметров для процедуру ВнешниеКомпонентыКлиент.ЗагрузитьКомпонентуИзФайла.
//
// Возвращаемое значение:
//  Структура:
//      * Идентификатор - Строка -(необязательный)  идентификатор объекта внешней компоненты.
//      * Версия - Строка - (необязательный) версия компоненты.
//      * ПараметрыПоискаДополнительнойИнформации - Соответствие из КлючИЗначение - (необязательный) параметры:
//          ** Ключ - Строка - идентификатор дополнительной запрошенной информации.
//          ** Значение - см. ПараметрыПоискаДополнительнойИнформации.
// Пример:
//
//  ПараметрыЗагрузки = ВнешниеКомпонентыКлиент.ПараметрыЗагрузки();
//  ПараметрыЗагрузки.Идентификатор = "InputDevice";
//  ПараметрыЗагрузки.Версия = "8.1.7.10";
//
Функция ПараметрыЗагрузки() Экспорт
	
	Параметры = Новый Структура;
	Параметры.Вставить("Идентификатор", Неопределено);
	Параметры.Вставить("Версия", Неопределено);
	Параметры.Вставить("ПараметрыПоискаДополнительнойИнформации", Новый Соответствие);
	
	Возврат Параметры;
	
КонецФункции

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

#Область ДляВызоваИзДругихПодсистем

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

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

// Подключает компоненту, выполненную по технологии COM, из реестра Windows в асинхронном режиме.
// (не рекомендуется, для обратной совместимости с компонентами 1С 7.7). 
//
// Параметры:
//  Идентификатор - Строка - идентификатор объекта внешней компоненты.
//  ИдентификаторСозданияОбъекта - Строка - идентификатор создания экземпляра модуля объекта
//          (только для компонент, у которых идентификатор создания объекта отличается от ProgID).
//
//  Возвращаемое значение:
//  	Структура - результат подключения компоненты:
//          * Подключено - Булево - признак подключения;
//          * ПодключаемыйМодуль - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты;
//                                - ФиксированноеСоответствие из КлючИЗначение - экземпляры объектов внешней компоненты,
//                                      указанные в ПараметрыПодключения.ИдентификаторыСозданияОбъектов:
//                                    *** Ключ - Строка - идентификатор внешней компоненты;
//                                    *** Значение - ОбъектВнешнейКомпоненты - экземпляр объекта внешней компоненты.
//          * ОписаниеОшибки - Строка - краткое описание ошибки. При отмене пользователем пустая строка.
//
Асинх Функция ПодключитьКомпонентуИзРеестраWindowsАсинх(Идентификатор,
	ИдентификаторСозданияОбъекта = Неопределено) Экспорт 
	
	Контекст = ВнешниеКомпонентыСлужебныйКлиент.КонтекстПодключенияКомпонентыИзРеестраWindows();
	Контекст.Идентификатор = Идентификатор;
	Контекст.ИдентификаторСозданияОбъекта = ИдентификаторСозданияОбъекта;
	
	Возврат Ждать ВнешниеКомпонентыСлужебныйКлиент.ПодключитьКомпонентуИзРеестраWindowsАсинх(Контекст);
	
КонецФункции

// Конец ПоддержкаОборудования

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

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

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

Процедура ПоказатьВнешниеКомпоненты() Экспорт
	
	ОткрытьФорму("Справочник.ВнешниеКомпоненты.ФормаСписка");
	
КонецПроцедуры

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