Files
SSL/SSL/src/CommonModules/ВнешниеКомпонентыСлужебный/Module.bsl
T
2018-08-31 11:49:00 +03:00

782 lines
44 KiB
Plaintext

#Область СлужебныйПрограммныйИнтерфейс
// Представление компоненты для журнала регистрации
//
Функция ПредставлениеКомпоненты(Идентификатор, Версия) Экспорт
Если ЗначениеЗаполнено(Версия) Тогда
ПредставлениеКомпоненты = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = '%1 (версии %2)'"),
Идентификатор,
Версия);
Иначе
ПредставлениеКомпоненты = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = '%1 (последней версии)'"),
Идентификатор,
Версия);
КонецЕсли;
Возврат ПредставлениеКомпоненты;
КонецФункции
// Проверят доступна ли загрузка внешних компонент с портала.
//
// Возвращаемое значение:
// Булево - признак доступности.
//
Функция ДоступнаЗагрузкаСПортала() Экспорт
Если ОбщегоНазначения.ПодсистемаСуществует("ИнтернетПоддержкаПользователей.ПолучениеВнешнихКомпонент") Тогда
МодульПолучениеВнешнихКомпонент = ОбщегоНазначения.ОбщийМодуль("ПолучениеВнешнихКомпонент");
Возврат МодульПолучениеВнешнихКомпонент.ДоступнаЗагрузкаВнешнихКомпонент();
КонецЕсли;
Возврат Ложь;
КонецФункции
// Разбирает файл компоненты для получения служебной информации о компоненте
//
// Параметры:
// АдресХранилищаФайла - Строка - адрес хранилища, в котором расположены двоичные данные файла компоненты.
// ВыполнятьРазборИнфоФайла - Булево - (необязательный) требуется ли дополнительно анализировать
// данные файла INFO.XML, если он есть.
// ПараметрыПоискаДополнительнойИнформации - Соответствие - (необязательный)
// См. ВнешниеКомпонентыКлиент.ПараметрыЗагрузки.
//
// Возвращаемое значение:
// Структура - состав информации.
// * Разобрано - Булево - признак успешного разбора компоненты.
// * Реквизиты - Структура - разобранные реквизиты компоненты.
// ** Windows_x86 - Булево
// ** Windows_x86_64 - Булево
// ** Linux_x86 - Булево
// ** Linux_x86_64 - Булево
// ** Windows_x86_Firefox - Булево
// ** Linux_x86_Firefox - Булево
// ** Linux_x86_64_Firefox - Булево
// ** Windows_x86_MSIE - Булево
// ** Windows_x86_64_MSIE - Булево
// ** Windows_x86_Chrome - Булево
// ** Linux_x86_Chrome - Булево
// ** Linux_x86_64_Chrome - Булево
// ** MacOS_x86_64_Safari - Булево
// ** Идентификатор - Строка
// ** Наименование - Строка
// ** Версия - Строка
// ** ДатаВерсии - Дата
// ** ИмяФайла - Строка
// * ДвоичныеДанные - ДвоичныеДанные - выгрузка файла компоненты.
// * ДополнительнаяИнформация - Соответствие - информация, полученная по переданным параметрам поиска.
// * ОписаниеОшибки - Строка - текст ошибки, в случае, если не разобрано.
//
Функция ИнформацияОКомпонентеИзФайла(АдресХранилищаФайла, ВыполнятьРазборИнфоФайла = Истина,
Знач ПараметрыПоискаДополнительнойИнформации = Неопределено) Экспорт
Если ПараметрыПоискаДополнительнойИнформации = Неопределено Тогда
ПараметрыПоискаДополнительнойИнформации = Новый Соответствие;
КонецЕсли;
// Значения заполнения по умолчанию.
Реквизиты = РеквизитыКомпоненты();
// Дополнительная запрашиваемая информация.
ДополнительнаяИнформация = Новый Соответствие;
// Получение и загрузка двоичных данных компоненты.
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилищаФайла);
// Очищаем выделенную память в хранилище
УдалитьИзВременногоХранилища(АдресХранилищаФайла);
// Контроль соответствия компоненты.
НайденМанифест = Ложь;
// Разбор данных архива компоненты.
Попытка
Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения();
ЧтениеАрхива = Новый ЧтениеZipФайла(Поток);
Исключение
ТекстОшибки = НСтр("ru = 'В файле отсутствует информация о компоненте.'");
Результат = РезультатРазбораКомпоненты();
Результат.ОписаниеОшибки = ТекстОшибки;
Возврат Результат;
КонецПопытки;
ВременныйКаталог = ОбщегоНазначения.СоздатьВременныйКаталог("ExtComp");
Для Каждого ЭлементАрхива Из ЧтениеАрхива.Элементы Цикл
Если ЭлементАрхива.Зашифрован Тогда
// Очищаем временные файлы и освобождаем память.
ОбщегоНазначения.УдалитьВременныйКаталог(ВременныйКаталог);
ЧтениеАрхива.Закрыть();
Поток.Закрыть();
ТекстОшибки = НСтр("ru = 'ZIP-архив не должен быть зашифрован.'");
Результат = РезультатРазбораКомпоненты();
Результат.ОписаниеОшибки = ТекстОшибки;
Возврат Результат;
КонецЕсли;
Попытка
// Поиск и разбор манифеста.
Если НРег(ЭлементАрхива.ИсходноеПолноеИмя) = "manifest.xml" Тогда
Реквизиты.ДатаВерсии = ЭлементАрхива.ВремяИзменения;
ЧтениеАрхива.Извлечь(ЭлементАрхива, ВременныйКаталог);
ВременныйФайлXML = ВременныйКаталог + ПолучитьРазделительПути() + ЭлементАрхива.ПолноеИмя;
РазобратьМанифестКомпоненты(ВременныйФайлXML, Реквизиты);
НайденМанифест = Истина;
КонецЕсли;
Если НРег(ЭлементАрхива.ИсходноеПолноеИмя) = "info.xml" И ВыполнятьРазборИнфоФайла Тогда
ЧтениеАрхива.Извлечь(ЭлементАрхива, ВременныйКаталог);
ВременныйФайлXML = ВременныйКаталог + ПолучитьРазделительПути() + ЭлементАрхива.ПолноеИмя;
РазобратьИнфоКомпоненты(ВременныйФайлXML, Реквизиты);
КонецЕсли;
Для Каждого ПараметрПоиска Из ПараметрыПоискаДополнительнойИнформации Цикл
ИмяФайлаXML = ПараметрПоиска.Значение.ИмяФайлаXML;
Если ЭлементАрхива.ИсходноеПолноеИмя = ИмяФайлаXML Тогда
КлючДополнительнойИнформации = ПараметрПоиска.Ключ;
ВыражениеXPath = ПараметрПоиска.Значение.ВыражениеXPath;
ЧтениеАрхива.Извлечь(ЭлементАрхива, ВременныйКаталог);
ВременныйФайлXML = ВременныйКаталог + ПолучитьРазделительПути() + ЭлементАрхива.ПолноеИмя;
ДокументDOM = ДокументDOM(ВременныйФайлXML);
ЗначениеXPath = ВычислитьВыражениеXPath(ВыражениеXPath, ДокументDOM);
ДополнительнаяИнформация.Вставить(КлючДополнительнойИнформации, ЗначениеXPath);
КонецЕсли;
КонецЦикла;
Исключение
Результат = РезультатРазбораКомпоненты();
Результат.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ошибка при разборе файла %1
|%2'"),
ЭлементАрхива.ИсходноеПолноеИмя,
КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
Возврат Результат;
КонецПопытки;
КонецЦикла;
// Очищаем временные файлы и освобождаем память.
ОбщегоНазначения.УдалитьВременныйКаталог(ВременныйКаталог);
ЧтениеАрхива.Закрыть();
Поток.Закрыть();
// Контроль соответствия компоненты.
Если Не НайденМанифест Тогда
ТекстОшибки = НСтр("ru = 'В архиве компоненты отсутствует обязательный файл MANIFEST.XML.'");
Результат = РезультатРазбораКомпоненты();
Результат.ОписаниеОшибки = ТекстОшибки;
Возврат Результат;
КонецЕсли;
Результат = РезультатРазбораКомпоненты();
Результат.Разобрано = Истина;
Результат.Реквизиты = Реквизиты;
Результат.ДвоичныеДанные = ДвоичныеДанные;
Результат.ДополнительнаяИнформация = ДополнительнаяИнформация;
Возврат Результат;
КонецФункции
#Область ОбработчикиСобытийПодсистемКонфигурации
// См. ГрупповоеИзменениеОбъектовПереопределяемый.ПриОпределенииОбъектовСРедактируемымиРеквизитами.
Процедура ПриОпределенииОбъектовСРедактируемымиРеквизитами(Объекты) Экспорт
Объекты.Вставить(Метаданные.Справочники.ВнешниеКомпоненты.ПолноеИмя(), "РеквизитыРедактируемыеВГрупповойОбработке");
КонецПроцедуры
// См. ВыгрузкаЗагрузкаДанныхПереопределяемый.ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки.
Процедура ПриЗаполненииТиповИсключаемыхИзВыгрузкиЗагрузки(Типы) Экспорт
Типы.Добавить(Метаданные.Справочники.ВнешниеКомпоненты);
КонецПроцедуры
// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхГлавному.
Процедура ПриОтправкеДанныхГлавному(ЭлементДанных, ОтправкаЭлемента, Получатель) Экспорт
Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ВнешниеКомпоненты") Тогда
ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать;
КонецЕсли;
КонецПроцедуры
// См. СтандартныеПодсистемыСервер.ПриОтправкеДанныхПодчиненному.
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза, Получатель) Экспорт
Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ВнешниеКомпоненты") Тогда
ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать;
КонецЕсли;
КонецПроцедуры
// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтГлавного.
Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт
Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ВнешниеКомпоненты") Тогда
ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать;
КонецЕсли;
КонецПроцедуры
// См. СтандартныеПодсистемыСервер.ПриПолученииДанныхОтПодчиненного.
Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад, Отправитель) Экспорт
Если ТипЗнч(ЭлементДанных) = Тип("СправочникОбъект.ВнешниеКомпоненты") Тогда
ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ИнформацияОСохраненнойКомпоненте
Функция ДоступнаЗагрузкаИзФайла()
Возврат Пользователи.ЭтоПолноправныйПользователь(,, Ложь);
КонецФункции
// Параметры:
// Параметры - Структура - параметры подготовки.
// * Идентификатор - Строка - идентификатор объекта внешнего компонента.
// * Версия - Строка, Неопределено - версия компоненты.
//
// Возвращаемое значение:
// Структура - РезультатИнформацииОСохраненнойКомпоненте()
//
Функция ИнформацияОСохраненнойКомпоненте(Идентификатор, Версия = Неопределено) Экспорт
Результат = РезультатИнформацииОСохраненнойКомпоненте();
// Шаг поиска компоненты.
СсылкаИзХранилища = Справочники.ВнешниеКомпоненты.НайтиПоИдентификатору(Идентификатор, Версия);
Если ОбщегоНазначения.РазделениеВключено()
И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаВМоделиСервиса.ВнешниеКомпонентыВМоделиСервиса") Тогда
МодульСправочникиОбщиеВнешниеКомпоненты = ОбщегоНазначения.ОбщийМодуль("Справочники.ОбщиеВнешниеКомпоненты");
СсылкаИзОбщегоХранилища = МодульСправочникиОбщиеВнешниеКомпоненты.НайтиПоИдентификатору(Идентификатор, Версия);
Если СсылкаИзХранилища.Пустая() Тогда
Если СсылкаИзОбщегоХранилища.Пустая() Тогда
Результат.Состояние = "НеНайдена";
Иначе
Результат.Состояние = "НайденаВОбщемХранилище";
Результат.Ссылка = СсылкаИзОбщегоХранилища;
КонецЕсли;
Иначе
Если СсылкаИзОбщегоХранилища.Пустая() Тогда
Результат.Состояние = "НайденаВХранилище";
Результат.Ссылка = СсылкаИзХранилища;
Иначе
Если ЗначениеЗаполнено(Версия) Тогда
// Особый случай: компонента есть и в общем хранилище и в хранилище области,
// При этом одной и той же версии. Приоритет компоненте области.
Результат.Состояние = "НайденаВХранилище";
Результат.Ссылка = СсылкаИзХранилища;
Иначе
ВерсияХранилища = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаИзХранилища, "ДатаВерсии");
ВерсияОбщегоХранилища = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаИзОбщегоХранилища, "ДатаВерсии");
Если ВерсияОбщегоХранилища > ВерсияХранилища Тогда
Результат.Состояние = "НайденаВОбщемХранилище";
Результат.Ссылка = СсылкаИзОбщегоХранилища;
Иначе
// Особый случай: компонента есть и в общем хранилище и в хранилище области,
// При этом если они оказались одной и той же версии. Приоритет компоненте области.
Результат.Состояние = "НайденаВХранилище";
Результат.Ссылка = СсылкаИзХранилища;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе
Если СсылкаИзХранилища.Пустая() Тогда
Результат.Состояние = "НеНайдена";
Иначе
Результат.Состояние = "НайденаВХранилище";
Результат.Ссылка = СсылкаИзХранилища;
КонецЕсли
КонецЕсли;
// Шаг анализа используемой компоненты
Если Результат.Состояние = "НеНайдена" Тогда
Возврат Результат;
КонецЕсли;
Реквизиты = РеквизитыКомпоненты();
Если Результат.Состояние = "НайденаВХранилище" Тогда
Реквизиты.Вставить("Использование");
// Требуется для определения статуса ОтключенаАдминистратором.
// Есть только у компонент областей.
КонецЕсли;
Если Результат.Состояние = "НайденаВОбщемХранилище" Тогда
Реквизиты.Удалить("ИмяФайла");
// У общих компонент нет признака.
КонецЕсли;
РеквизитыОбъекта = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Результат.Ссылка, Реквизиты);
ЗаполнитьЗначенияСвойств(Результат.Реквизиты, РеквизитыОбъекта);
Результат.Местоположение = ПолучитьНавигационнуюСсылку(Результат.Ссылка, "ХранилищеКомпоненты");
Если Результат.Состояние = "НайденаВХранилище" Тогда
Если РеквизитыОбъекта.Использование <> Перечисления.ВариантыИспользованияВнешнихКомпонент.Используется Тогда
Результат.Состояние = "ОтключенаАдминистратором";
КонецЕсли;
КонецЕсли;
Возврат Результат
КонецФункции
Функция РезультатИнформацииОСохраненнойКомпоненте()
Результат = Новый Структура;
Результат.Вставить("Ссылка");
Результат.Вставить("Реквизиты", РеквизитыКомпоненты());
Результат.Вставить("Местоположение");
Результат.Вставить("Состояние");
// Варианты:
// * НеНайдена
// * НайденаВХранилище
// * НайденаВОбщемХранилище
// * ОтключенаАдминистратором
Результат.Вставить("ДоступнаЗагрузкаИзФайла", ДоступнаЗагрузкаИзФайла());
Результат.Вставить("ДоступнаЗагрузкаСПортала", ДоступнаЗагрузкаСПортала());
Возврат Результат;
КонецФункции
Функция РеквизитыКомпоненты()
Реквизиты = Новый Структура;
Реквизиты.Вставить("Windows_x86");
Реквизиты.Вставить("Windows_x86_64");
Реквизиты.Вставить("Linux_x86");
Реквизиты.Вставить("Linux_x86_64");
Реквизиты.Вставить("Windows_x86_Firefox");
Реквизиты.Вставить("Linux_x86_Firefox");
Реквизиты.Вставить("Linux_x86_64_Firefox");
Реквизиты.Вставить("Windows_x86_MSIE");
Реквизиты.Вставить("Windows_x86_64_MSIE");
Реквизиты.Вставить("Windows_x86_Chrome");
Реквизиты.Вставить("Linux_x86_Chrome");
Реквизиты.Вставить("Linux_x86_64_Chrome");
Реквизиты.Вставить("MacOS_x86_64_Safari");
Реквизиты.Вставить("Идентификатор");
Реквизиты.Вставить("Наименование");
Реквизиты.Вставить("Версия");
Реквизиты.Вставить("ДатаВерсии");
Реквизиты.Вставить("ИмяФайла");
Возврат Реквизиты;
КонецФункции
#КонецОбласти
#Область РазборКомпонентыИзФайла
Функция РезультатРазбораКомпоненты()
Результат = Новый Структура;
Результат.Вставить("Разобрано", Ложь);
Результат.Вставить("Реквизиты", Новый Структура);
Результат.Вставить("ДвоичныеДанные", Неопределено);
Результат.Вставить("ДополнительнаяИнформация", Новый Соответствие);
Результат.Вставить("ОписаниеОшибки", "");
Возврат Результат;
КонецФункции
Процедура РазобратьМанифестКомпоненты(ФайлXML, Реквизиты)
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ФайлXML);
ЧтениеXML.ПерейтиКСодержимому();
Если ЧтениеXML.Имя = "bundle" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.Имя = "component" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ОперационнаяСистема = НРег(ЧтениеXML.ЗначениеАтрибута("os"));
ТипКомпоненты = НРег(ЧтениеXML.ЗначениеАтрибута("type"));
АрхитектураПлатформы = НРег(ЧтениеXML.ЗначениеАтрибута("arch"));
ПрограммаПросмотра = НРег(ЧтениеXML.ЗначениеАтрибута("client"));
Если ОперационнаяСистема = "windows" И АрхитектураПлатформы = "i386"
И (ТипКомпоненты = "native" Или ТипКомпоненты = "com") Тогда
Реквизиты.Windows_x86 = Истина;
Продолжить;
КонецЕсли;
Если ОперационнаяСистема = "windows" И АрхитектураПлатформы = "x86_64"
И (ТипКомпоненты = "native" Или ТипКомпоненты = "com") Тогда
Реквизиты.Windows_x86_64 = Истина;
Продолжить;
КонецЕсли;
Если ОперационнаяСистема = "linux" И АрхитектураПлатформы = "i386"
И ТипКомпоненты = "native" Тогда
Реквизиты.Linux_x86 = Истина;
Продолжить;
КонецЕсли;
Если ОперационнаяСистема = "linux" И АрхитектураПлатформы = "x86_64"
И ТипКомпоненты = "native" Тогда
Реквизиты.Linux_x86_64 = Истина;
Продолжить;
КонецЕсли;
Если ОперационнаяСистема = "windows" И АрхитектураПлатформы = "i386"
И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "firefox" Тогда
Реквизиты.Windows_x86_Firefox = Истина;
Продолжить;
КонецЕсли;
Если ОперационнаяСистема = "linux" И АрхитектураПлатформы = "i386"
И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "firefox" Тогда
Реквизиты.Linux_x86_Firefox = Истина;
Продолжить;
КонецЕсли;
Если ОперационнаяСистема = "linux" И АрхитектураПлатформы = "x86_64"
И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "firefox" Тогда
Реквизиты.Linux_x86_64_Firefox = Истина;
Продолжить;
КонецЕсли;
Если ОперационнаяСистема = "windows" И АрхитектураПлатформы = "i386"
И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "msie" Тогда
Реквизиты.Windows_x86_MSIE = Истина;
Продолжить;
КонецЕсли;
Если ОперационнаяСистема = "windows" И АрхитектураПлатформы = "x86_64"
И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "msie" Тогда
Реквизиты.Windows_x86_64_MSIE = Истина;
Продолжить;
КонецЕсли;
Если ОперационнаяСистема = "windows" И АрхитектураПлатформы = "i386"
И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "chrome" Тогда
Реквизиты.Windows_x86_Chrome = Истина;
Продолжить;
КонецЕсли;
Если ОперационнаяСистема = "linux" И АрхитектураПлатформы = "i386"
И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "chrome" Тогда
Реквизиты.Linux_x86_Chrome = Истина;
Продолжить;
КонецЕсли;
Если ОперационнаяСистема = "linux" И АрхитектураПлатформы = "x86_64"
И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "chrome" Тогда
Реквизиты.Linux_x86_64_Chrome = Истина;
Продолжить;
КонецЕсли;
Если ОперационнаяСистема = "macos"
И (АрхитектураПлатформы = "x86_64" Или АрхитектураПлатформы = "universal")
И ТипКомпоненты = "plugin" И ПрограммаПросмотра = "safari" Тогда
Реквизиты.MacOS_x86_64_Safari = Истина;
Продолжить;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ЧтениеXML.Закрыть();
КонецПроцедуры
Процедура РазобратьИнфоКомпоненты(ФайлXML, Реквизиты)
ИнфоРазобран = Ложь;
// Пытаемся разобрать по формату БПО.
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ФайлXML);
ЧтениеXML.ПерейтиКСодержимому();
Если ЧтениеXML.Имя = "drivers" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.Имя = "component" И ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Идентификатор = ЧтениеXML.ЗначениеАтрибута("progid");
Реквизиты.Идентификатор = Сред(Идентификатор, СтрНайти(Идентификатор, ".") + 1);
Реквизиты.Наименование = ЧтениеXML.ЗначениеАтрибута("name");
Реквизиты.Версия = ЧтениеXML.ЗначениеАтрибута("version");
ИнфоРазобран = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ЧтениеXML.Закрыть();
Если Не ИнфоРазобран Тогда
// Пытаемся разобрать по формату БЭД.
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ФайлXML);
info = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
Реквизиты.Идентификатор = info.progid;
Реквизиты.Наименование = info.name;
Реквизиты.Версия = info.version;
ЧтениеXML.Закрыть();
КонецЕсли;
КонецПроцедуры
Функция ВычислитьВыражениеXPath(Выражение, ДокументDOM)
ЗначениеXPath = Неопределено;
Разыменователь = ДокументDOM.СоздатьРазыменовательПИ();
РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(Выражение, ДокументDOM, Разыменователь);
УзелРезультата = РезультатXPath.ПолучитьСледующий();
Если ТипЗнч(УзелРезультата) = Тип("АтрибутDOM") Тогда
ЗначениеXPath = УзелРезультата.Значение;
КонецЕсли;
Возврат ЗначениеXPath
КонецФункции
Функция ДокументDOM(ПутьКФайлу)
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ПутьКФайлу);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
ЧтениеXML.Закрыть();
Возврат ДокументDOM;
КонецФункции
#КонецОбласти
#Область ЗагрузкаСПортала
Процедура ПроверитьДоступностьЗагрузкиСПортала()
Если Не ДоступнаЗагрузкаСПортала() Тогда
ВызватьИсключение
НСтр("ru = 'Обновление внешних компонент не доступно.
|Требуется подсистема обновления внешних компонент библиотеки интернет поддержки.'");
КонецЕсли;
КонецПроцедуры
Процедура НоваяКомпонентаСПортала(ПараметрыПроцедуры, АдресРезультата) Экспорт
Идентификатор = ПараметрыПроцедуры.Идентификатор;
Версия = ПараметрыПроцедуры.Версия;
ПроверитьДоступностьЗагрузкиСПортала();
МодульПолучениеВнешнихКомпонент = ОбщегоНазначения.ОбщийМодуль("ПолучениеВнешнихКомпонент");
ОписаниеВнешнихКомпонент = МодульПолучениеВнешнихКомпонент.ОписаниеВнешнихКомпонент();
ОписаниеВнешнейКомпоненты = ОписаниеВнешнихКомпонент.Добавить();
ОписаниеВнешнейКомпоненты.Идентификатор = Идентификатор;
ОписаниеВнешнейКомпоненты.Версия = Версия;
Если Не ЗначениеЗаполнено(Версия) Тогда
РезультатОперации = МодульПолучениеВнешнихКомпонент.АктуальныеВерсииВнешнихКомпонент(ОписаниеВнешнихКомпонент);
Иначе
РезультатОперации = МодульПолучениеВнешнихКомпонент.ВерсииВнешнихКомпонент(ОписаниеВнешнихКомпонент);
КонецЕсли;
Если ЗначениеЗаполнено(РезультатОперации.КодОшибки) Тогда
ТекстИсключения = ?(Пользователи.ЭтоПолноправныйПользователь(),
РезультатОперации.ИнформацияОбОшибке,
РезультатОперации.СообщениеОбОшибке);
ВызватьИсключение ТекстИсключения;
КонецЕсли;
Если РезультатОперации.ДанныеВнешнихКомпонент.Количество() = 0 Тогда
ТекстИсключения = НСтр("ru = 'На Портале 1С:ИТС внешняя компонента не обнаружена.'");
ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'",
ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,,, ТекстИсключения);
ВызватьИсключение ТекстИсключения;
КонецЕсли;
СтрокаРезультата = РезультатОперации.ДанныеВнешнихКомпонент[0]; // Фокусировка на первой строке результата.
КодОшибки = СтрокаРезультата.КодОшибки;
Если ЗначениеЗаполнено(КодОшибки) Тогда
ИнформацияОбОшибке = "";
Если КодОшибки = "ОтсутствуетКомпонента" Тогда
ИнформацияОбОшибке = НСтр("ru = 'В сервисе внешних компонент не обнаружена внешняя компонента'");
ИначеЕсли КодОшибки = "ОтсутствуетВерсия" Тогда
ИнформацияОбОшибке = НСтр("ru = 'В сервисе внешних компонент не обнаружена требуемая версия внешней компоненты'");
ИначеЕсли КодОшибки = "ФайлНеЗагружен" Тогда
ИнформацияОбОшибке = НСтр("ru = 'При попытке загрузить файл внешней компоненты из сервиса, возникла ошибка'");
ИначеЕсли КодОшибки = "АктуальнаяВерсия" Тогда
ИнформацияОбОшибке =
НСтр("ru = 'Скорее всего произошла ошибка сервера при загрузке компоненты.
|Получен код ошибки: АктуальнаяВерсия, однако в ИБ компоненты не обнаружено.'");
КонецЕсли;
ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'При загрузке внешней компоненты %1 возникала ошибка:
|%2'"),
ПредставлениеКомпоненты(Идентификатор, Версия),
ИнформацияОбОшибке);
ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'",
ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,,,
ТекстОшибки);
ВызватьИсключение ТекстОшибки;
КонецЕсли;
Информация = ИнформацияОКомпонентеИзФайла(СтрокаРезультата.АдресФайла, Ложь);
Если Не Информация.Разобрано Тогда
ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'",
ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка, , , Информация.ОписаниеОшибки);
ВызватьИсключение Информация.ОписаниеОшибки;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
НачатьТранзакцию();
Попытка
// Создание экземпляра компоненты.
Объект = Справочники.ВнешниеКомпоненты.СоздатьЭлемент();
Объект.Заполнить(Неопределено); // Конструктор по умолчанию.
ЗаполнитьЗначенияСвойств(Объект, Информация.Реквизиты); // По данным манифеста.
ЗаполнитьЗначенияСвойств(Объект, СтрокаРезультата); // По данным с сайта.
Объект.ОписаниеОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Загружена с Портала 1С:ИТС. %1.'"),
ТекущаяДатаСеанса());
Объект.ДополнительныеСвойства.Вставить("ДвоичныеДанныеКомпоненты", Информация.ДвоичныеДанные);
Если Не ЗначениеЗаполнено(Версия) Тогда // Если запрос конкретной версии - пропускаем.
Объект.ОбновлятьСПортала1СИТС = Объект.ЭтоКомпонентаПоследнейВерсии();
КонецЕсли;
Объект.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ЗаписьЖурналаРегистрации(НСтр("ru = 'Обновление внешних компонент'",
ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка,,,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Процедура ОбновитьКомпонентыСПортала(ПараметрыПроцедуры, АдресРезультата) Экспорт
МассивСсылок = ПараметрыПроцедуры.МассивСсылок;
ПроверитьДоступностьЗагрузкиСПортала();
МодульПолучениеВнешнихКомпонент = ОбщегоНазначения.ОбщийМодуль("ПолучениеВнешнихКомпонент");
ОписаниеВнешнихКомпонент = МодульПолучениеВнешнихКомпонент.ОписаниеВнешнихКомпонент();
Для Каждого Ссылка Из МассивСсылок Цикл
Реквизиты = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "Идентификатор, Версия");
ОписаниеКомпоненты = ОписаниеВнешнихКомпонент.Добавить();
ОписаниеКомпоненты.Идентификатор = Реквизиты.Идентификатор;
ОписаниеКомпоненты.Версия = Реквизиты.Версия;
КонецЦикла;
РезультатОперации = МодульПолучениеВнешнихКомпонент.АктуальныеВерсииВнешнихКомпонент(ОписаниеВнешнихКомпонент);
Если ЗначениеЗаполнено(РезультатОперации.КодОшибки) Тогда
ТекстИсключения = ?(Пользователи.ЭтоПолноправныйПользователь(),
РезультатОперации.ИнформацияОбОшибке,
РезультатОперации.СообщениеОбОшибке);
ВызватьИсключение ТекстИсключения;
КонецЕсли;
ВнешниеКомпонентыСервер.ОбновитьВнешниеКомпоненты(РезультатОперации.ДанныеВнешнихКомпонент, АдресРезультата);
КонецПроцедуры
#КонецОбласти
#КонецОбласти