3_1_5_208

This commit is contained in:
Компания 1С committed 2021-09-30 23:11:00 +03:00
1 parent 8e46accf22
commit f3d355688f
117 files changed
+4061 -1442

No files matched your search

@@ -47,15 +47,45 @@
#Область ВнешниеКомпоненты
// Контекст подключения компоненты.
//
// Возвращаемое значение:
// Структура - контекст подключения компоненты:
// * Оповещение - Неопределено, ОписаниеОповещения - оповещение.
// * Идентификатор - Строка - идентификатор объекта компоненты, идентификатор внешней компоненты.
// * Версия - Неопределено, Строка - версия компоненты.
// * Местоположение - Строка - местоположение макета или ссылка на внешнюю компоненту.
// * ИсходноеМестоположение - Строка - местоположение начального вызова, для хранения кэша.
// * Кэшировать - Булево - признак сохранения подключенной компоненты в кэше.
// * ПредложитьУстановить - Булево - предлагать устанавливать компоненту.
// * ПредложитьЗагрузить - Булево - предлагать загружать компоненту с сайта ИТС.
// * ТекстПояснения - Строка - для чего нужна компонента и что не будет работать, если ее не устанавливать.
// * ИдентификаторыСозданияОбъектов - Массив -идентификатор создания экземпляра модуля объекта,
// используется только для компонент, у которых есть несколько идентификаторов создания объектов,
// при задании параметр Идентификатор будет игнорироваться.
// * ВыполненПоискНовойВерсии - Булево - поиск новой версии компоненты производился.
//
Функция КонтекстПодключенияКомпоненты() Экспорт
Контекст = Новый Структура;
Контекст.Вставить("Оповещение", Неопределено);
Контекст.Вставить("Идентификатор", Неопределено);
Контекст.Вставить("Версия", "");
Контекст.Вставить("Местоположение", "");
Контекст.Вставить("ИсходноеМестоположение", "");
Контекст.Вставить("Кэшировать", Истина);
Контекст.Вставить("ПредложитьУстановить", Истина);
Контекст.Вставить("ПредложитьЗагрузить", Ложь);
Контекст.Вставить("ТекстПояснения", "");
Контекст.Вставить("ИдентификаторыСозданияОбъектов", Новый Массив);
Контекст.Вставить("ВыполненПоискНовойВерсии", Ложь);
Возврат Контекст;
КонецФункции
// Параметры:
// Контекст - Структура:
// * Оповещение - ОписаниеОповещения
// * Идентификатор - Строка
// * Местоположение - Строка
// * Кэшировать - Булево
// * ПредложитьУстановить - Булево
// * ТекстПояснения - Строка
// * ИдентификаторыСозданияОбъектов - Массив из Строка
// Контекст - см. КонтекстПодключенияКомпоненты.
//
Процедура ПодключитьКомпоненту(Контекст) Экспорт
@@ -64,10 +94,9 @@
Если КомпонентаСодержитЕдинственныйКлассОбъектов Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось подключить внешнюю компоненту на клиенте
|%1
НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" в клиентском приложении
|по причине:
|Не допустимо одновременно не указывать Идентификатор и ИдентификаторыСозданияОбъектов'"),
|Недопустимо одновременно не указывать Идентификатор и ИдентификаторыСозданияОбъектов.'"),
Контекст.Местоположение);
Иначе
// В случае, когда в компоненте есть несколько классов объектов
@@ -77,51 +106,64 @@
КонецЕсли;
КонецЕсли;
Если Не МестоположениеКомпонентыКорректно(Контекст.Местоположение) Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" на клиенте
|по причине:
|указано некорректное местоположение внешней компоненты
|%2'"),
Контекст.Идентификатор,
Контекст.Местоположение);
КонецЕсли;
ПроверитьМестоположениеКомпоненты(Контекст.Идентификатор, Контекст.Местоположение);
Если Контекст.Кэшировать Тогда
ПодключаемыйМодуль = ПолучитьОбъектКомпонентыИзКэша(Контекст.Местоположение);
Если ПодключаемыйМодуль <> Неопределено Тогда
ПодключитьКомпонентуОповеститьОПодключении(ПодключаемыйМодуль, Контекст);
Если Не Контекст.ВыполненПоискНовойВерсии Тогда
Если Контекст.Кэшировать Тогда
ПодключаемыйМодуль = ПолучитьОбъектКомпонентыИзКэша(Контекст.Местоположение);
Если ПодключаемыйМодуль <> Неопределено Тогда
ПодключитьКомпонентуОповеститьОПодключении(ПодключаемыйМодуль, Контекст);
Возврат;
КонецЕсли;
КонецЕсли;
// Проверка факта подключения внешней компоненты в этом сеансе ранее.
СимволическоеИмя = ПолучитьСимволическоеИмяКомпонентыИзКэша(Контекст.Местоположение);
Если СимволическоеИмя <> Неопределено Тогда
// Если в кэше уже есть символическое имя - значит к этому сеансу ранее компонента уже подключалась.
Подключено = Истина;
Контекст.Вставить("СимволическоеИмя", СимволическоеИмя);
ПодключитьКомпонентуПослеПопыткиПодключения(Подключено, Контекст);
Возврат;
КонецЕсли;
// Поиск более свежей версии компоненты в макетах и справочнике.
Если ЭтоМакет(Контекст.Местоположение) Тогда
Контекст.ИсходноеМестоположение = Контекст.Местоположение;
Оповещение = Новый ОписаниеОповещения("ПодключитьПослеПоискаВнешнейКомпоненты", ЭтотОбъект, Контекст);
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда
МодульВнешниеКомпонентыСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль(
"ВнешниеКомпонентыСлужебныйКлиент");
КонтекстПроверкиКомпоненты = КонтекстПодключенияКомпоненты();
КонтекстПроверкиКомпоненты.Идентификатор = Контекст.Идентификатор;
КонтекстПроверкиКомпоненты.Версия = Неопределено;
КонтекстПроверкиКомпоненты.ПредложитьУстановить = Контекст.ПредложитьУстановить;
КонтекстПроверкиКомпоненты.ПредложитьЗагрузить = Контекст.ПредложитьЗагрузить;
КонтекстПроверкиКомпоненты.ТекстПояснения = Контекст.ТекстПояснения;
КонтекстПроверкиКомпоненты.ИсходноеМестоположение = Контекст.ИсходноеМестоположение;
КонтекстПроверкиКомпоненты.ИдентификаторыСозданияОбъектов = Контекст.ИдентификаторыСозданияОбъектов;
МодульВнешниеКомпонентыСлужебныйКлиент.ПроверитьДоступностьКомпоненты(Оповещение,
КонтекстПроверкиКомпоненты);
Иначе
ВыполнитьОбработкуОповещения(Оповещение, Неопределено);
КонецЕсли;
Возврат;
КонецЕсли;
КонецЕсли;
// Проверка факта подключения внешней компоненты в этом сеансе ранее.
СимволическоеИмя = ПолучитьСимволическоеИмяКомпонентыИзКэша(Контекст.Местоположение);
// Генерация уникального имени.
СимволическоеИмя = "С" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
Контекст.Вставить("СимволическоеИмя", СимволическоеИмя);
Если СимволическоеИмя = Неопределено Тогда
// Генерация уникального имени.
СимволическоеИмя = "С" + СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
Контекст.Вставить("СимволическоеИмя", СимволическоеИмя);
Оповещение = Новый ОписаниеОповещения(
"ПодключитьКомпонентуПослеПопыткиПодключения", ЭтотОбъект, Контекст,
"ПодключитьКомпонентуПриОбработкеОшибки", ЭтотОбъект);
НачатьПодключениеВнешнейКомпоненты(Оповещение, Контекст.Местоположение, СимволическоеИмя);
Иначе
// Если в кэше уже есть символическое имя - значит к этому сеансу ранее компонента уже подключалась.
Подключено = Истина;
Контекст.Вставить("СимволическоеИмя", СимволическоеИмя);
ПодключитьКомпонентуПослеПопыткиПодключения(Подключено, Контекст);
КонецЕсли;
Оповещение = Новый ОписаниеОповещения(
"ПодключитьКомпонентуПослеПопыткиПодключения", ЭтотОбъект, Контекст,
"ПодключитьКомпонентуПриОбработкеОшибки", ЭтотОбъект);
НачатьПодключениеВнешнейКомпоненты(Оповещение, Контекст.Местоположение, СимволическоеИмя);
КонецПроцедуры
// Продолжение процедуры ПодключитьКомпоненту.
@@ -155,18 +197,11 @@
// * Оповещение - ОписаниеОповещения
// * Местоположение - Строка
// * ТекстПояснения - Строка
// * Идентификатор - Строка
//
Процедура УстановитьКомпоненту(Контекст) Экспорт
Если Не МестоположениеКомпонентыКорректно(Контекст.Местоположение) Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось установить внешнюю компоненту ""%1"" на клиенте
|%2
|по причине:
|Не допустимо устанавливать компоненты из указанного местоположения.'"),
Контекст.Идентификатор,
Контекст.Местоположение);
КонецЕсли;
ПроверитьМестоположениеКомпоненты(Контекст.Идентификатор, Контекст.Местоположение);
// Проверка факта подключения внешней компоненты в этом сеансе ранее.
СимволическоеИмя = ПолучитьСимволическоеИмяКомпонентыИзКэша(Контекст.Местоположение);
@@ -492,13 +527,39 @@
#Область ВнешниеКомпоненты
// Продолжение процедуры ПодключитьКомпоненту.
//
// Параметры:
// Результат - см. ВнешниеКомпонентыСлужебныйКлиент.РезультатДоступностиКомпоненты
// Контекст - см. ОбщегоНазначенияСлужебныйКлиент.КонтекстПодключенияКомпоненты
//
Процедура ПодключитьПослеПоискаВнешнейКомпоненты(Результат, Контекст) Экспорт
Контекст.ВыполненПоискНовойВерсии = Истина;
Если Результат.КомпонентаПоследнейВерсии = Неопределено Тогда
КомпонентаПоследнейВерсии = СтандартныеПодсистемыВызовСервера.КомпонентаПоследнейВерсии(
Контекст.Идентификатор, Контекст.ИсходноеМестоположение, Результат);
Иначе
КомпонентаПоследнейВерсии = Результат.КомпонентаПоследнейВерсии;
КонецЕсли;
Контекст.Местоположение = КомпонентаПоследнейВерсии.Местоположение;
Контекст.Версия = КомпонентаПоследнейВерсии.Версия;
ПодключитьКомпоненту(Контекст);
КонецПроцедуры
// Продолжение процедуры ПодключитьКомпоненту.
Процедура ПодключитьКомпонентуПослеПопыткиПодключения(Подключено, Контекст) Экспорт
Если Подключено Тогда
// Сохранение факта подключения внешней компоненты к этому сеансу.
ЗаписатьСимволическоеИмяКомпонентыВКэш(Контекст.Местоположение, Контекст.СимволическоеИмя);
ИсходноеМестоположение = ?(ЗначениеЗаполнено(Контекст.ИсходноеМестоположение),
Контекст.ИсходноеМестоположение, Контекст.Местоположение);
ЗаписатьСимволическоеИмяКомпонентыВКэш(ИсходноеМестоположение, Контекст.СимволическоеИмя);
ПодключаемыйМодуль = Неопределено;
@@ -512,7 +573,7 @@
КонецПопытки;
Если Контекст.Кэшировать Тогда
ЗаписатьОбъектКомпонентыВКэш(Контекст.Местоположение, ПодключаемыйМодуль)
ЗаписатьОбъектКомпонентыВКэш(ИсходноеМестоположение, ПодключаемыйМодуль)
КонецЕсли;
ПодключитьКомпонентуОповеститьОПодключении(ПодключаемыйМодуль, Контекст);
@@ -565,6 +626,7 @@
КонтекстУстановки.Вставить("Оповещение", Оповещение);
КонтекстУстановки.Вставить("Местоположение", Контекст.Местоположение);
КонтекстУстановки.Вставить("ТекстПояснения", Контекст.ТекстПояснения);
КонтекстУстановки.Вставить("Идентификатор", Контекст.Идентификатор);
УстановитьКомпоненту(КонтекстУстановки);
@@ -768,18 +830,25 @@
КонецФункции
Функция МестоположениеКомпонентыКорректно(Местоположение)
Процедура ПроверитьМестоположениеКомпоненты(Идентификатор, Местоположение)
Если ЭтоМакет(Местоположение) Тогда
Возврат;
КонецЕсли;
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ВнешниеКомпоненты") Тогда
МодульВнешниеКомпонентыСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ВнешниеКомпонентыСлужебныйКлиент");
Если МодульВнешниеКомпонентыСлужебныйКлиент.ЭтоКомпонентаИзХранилища(Местоположение) Тогда
Возврат Истина;
КонецЕсли;
МодульВнешниеКомпонентыСлужебныйКлиент.ПроверитьМестоположениеКомпоненты(Идентификатор, Местоположение);
Иначе
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось подключить внешнюю компоненту ""%1"" в клиентском приложении
|по причине:
|указано некорректное местоположение внешней компоненты
|%2'"),
Идентификатор, Местоположение);
КонецЕсли;
Возврат ЭтоМакет(Местоположение);
КонецФункции
КонецПроцедуры
Функция ЭтоМакет(Местоположение)