1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2024-11-30 08:36:50 +02:00

Merge pull request #435 from bia-technologies/feature/415

415 / Доработка получения типов из расширения
This commit is contained in:
Koryakin Aleksey 2024-11-21 15:38:45 +03:00 committed by GitHub
commit bd1cf5c48d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 141 additions and 80 deletions

View File

@ -18,6 +18,8 @@
#Область СлужебныйПрограммныйИнтерфейс
#Область РаботаСРаширениями
// МодулиРасширений
// Выполняет чтение метаданных общих модулей, которые предположительно могут являться тестами
//
@ -44,6 +46,55 @@
КонецФункции
Функция РасширенияСеанса() Экспорт
УстановитьПривилегированныйРежим(Истина);
Возврат РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные);
КонецФункции
Функция СсылочныеТипыРасширений() Экспорт
МассивТипов = Новый Массив;
СсылочныеКоллекции = СсылочныеКоллекции();
СобственныйОбъект = Метаданные.СвойстваОбъектов.ПринадлежностьОбъекта.Собственный;
Для Каждого Расширение Из РасширенияСеанса() Цикл
Если НЕ Расширение.ИзменяетСтруктуруДанных() Тогда
Продолжить;
КонецЕсли;
УстановитьБезопасныйРежим(Истина);
// Создание через тип не работает, ошибка - конструктор не найден
МетаданныеРасширения = Вычислить("Новый ОбъектМетаданныхКонфигурация(Расширение.ПолучитьДанные())");
Для Каждого ИмяКоллекции Из СсылочныеКоллекции Цикл
Коллекция = МетаданныеРасширения[ИмяКоллекции];
ИмяЭлемента = ЮТМетаданныеСлужебныйПовтИсп.ТипыМетаданных()[ИмяКоллекции].Имя;
Для Каждого ОбъектМетаданных Из Коллекция Цикл
Если ОбъектМетаданных.ПринадлежностьОбъекта = СобственныйОбъект Тогда
МассивТипов.Добавить(СтрШаблон("%1Ссылка.%2", ИмяЭлемента, ОбъектМетаданных.Имя));
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ОписаниеТипов = Новый ОписаниеТипов(МассивТипов);
Возврат ОписаниеТипов.Типы();
КонецФункции
#КонецОбласти
Функция ИменаМодулейДвижка() Экспорт
УстановитьПривилегированныйРежим(Истина);
@ -258,6 +309,28 @@
КонецФункции
Функция ОписаниеТиповЛюбаяСсылкаПоМетаданным() Экспорт
МассивТипов = Новый Массив;
СсылочныеКоллекции = СсылочныеКоллекции();
Для Каждого ИмяКоллекции Из СсылочныеКоллекции Цикл
Коллекция = Метаданные[ИмяКоллекции];
ИмяЭлемента = ЮТМетаданныеСлужебныйПовтИсп.ТипыМетаданных()[ИмяКоллекции].Имя;
Для Каждого ОбъектМетаданных Из Коллекция Цикл
МассивТипов.Добавить(СтрШаблон("%1Ссылка.%2", ИмяЭлемента, ОбъектМетаданных.Имя));
КонецЦикла;
КонецЦикла;
Возврат Новый ОписаниеТипов(СтрСоединить(МассивТипов, ","));
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@ -422,4 +495,17 @@
КонецПроцедуры
Функция СсылочныеКоллекции()
Возврат ЮТКоллекции.ЗначениеВМассиве("Справочники",
"Документы",
"БизнесПроцессы",
"Задачи",
"ПланыСчетов",
"ПланыОбмена",
"ПланыВидовХарактеристик",
"ПланыВидовРасчета");
КонецФункции
#КонецОбласти

View File

@ -24,68 +24,4 @@
КонецФункции
Функция СсылочныеТипыДобавляемыеРасширениями() Экспорт
СсылочныеТипы = Новый Массив;
ТипыОбъектовМетаданныхСсылочногоТипа = ТипыОбъектовМетаданныхСсылочногоТипа();
УстановитьПривилегированныйРежим(Истина);
РасширенияСеанса = РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные);
Для Каждого Расширение Из РасширенияСеанса Цикл
Если НЕ Расширение.ИзменяетСтруктуруДанных() Тогда
Продолжить;
КонецЕсли;
ОМДРасширения = Новый ОбъектМетаданныхКонфигурация(Расширение.ПолучитьДанные());
Для Каждого ТипОМД Из ТипыОбъектовМетаданныхСсылочногоТипа Цикл
ДополнитьТипы(СсылочныеТипы, ТипОМД, ОМДРасширения);
КонецЦикла;
КонецЦикла;
Возврат СсылочныеТипы;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ДополнитьТипы(СсылочныеТипы, ТипОМД, ОМДРасширения)
ПринадлежностьОбъекта = Метаданные.СвойстваОбъектов.ПринадлежностьОбъекта.Собственный;
Для Каждого ОМД Из ОМДРасширения[ТипОМД] Цикл
Если ОМД.ПринадлежностьОбъекта <> ПринадлежностьОбъекта Тогда
Продолжить;
КонецЕсли;
ИмяПустойСсылкиТипа = ОМД.ПолноеИмя() + ".ПустаяСсылка";
СсылкаДляОпределенияТипа = ПредопределенноеЗначение(ИмяПустойСсылкиТипа);
СсылочныеТипы.Добавить(ТипЗнч(СсылкаДляОпределенияТипа));
КонецЦикла;
КонецПроцедуры
Функция ТипыОбъектовМетаданныхСсылочногоТипа()
ТипыОбъектовМетаданныхСсылочногоТипа = Новый Массив;
ТипыОбъектовМетаданныхСсылочногоТипа.Добавить("Справочники");
ТипыОбъектовМетаданныхСсылочногоТипа.Добавить("Документы");
ТипыОбъектовМетаданныхСсылочногоТипа.Добавить("БизнесПроцессы");
ТипыОбъектовМетаданныхСсылочногоТипа.Добавить("Задачи");
ТипыОбъектовМетаданныхСсылочногоТипа.Добавить("ПланыСчетов");
ТипыОбъектовМетаданныхСсылочногоТипа.Добавить("ПланыОбмена");
ТипыОбъектовМетаданныхСсылочногоТипа.Добавить("ПланыВидовХарактеристик");
ТипыОбъектовМетаданныхСсылочногоТипа.Добавить("ПланыВидовРасчета");
Возврат ТипыОбъектовМетаданныхСсылочногоТипа;
КонецФункции
#КонецОбласти

View File

@ -39,6 +39,32 @@
КонецФункции
// Проверяет версию платформы (без учета режима совместимости)
//
// Параметры:
// ВерсияДляПроверки - Строка - Версия, с которой необходимо сравнить версию платформы
//
// Возвращаемое значение:
// Булево - Версия платформы больше или равна указанной
Функция ВерсияПлатформыБольшеИлиРавна(ВерсияДляПроверки) Экспорт
Возврат ЮТСтроки.СравнитьВерсии(ЮТСлужебныйПовторногоИспользования.ВерсияПлатформы(), ВерсияДляПроверки) >= 0;
КонецФункции
// Проверяет версию платформы (без учета режима совместимости)
//
// Параметры:
// ВерсияДляПроверки - Строка - Версия, с которой необходимо сравнить версию платформы
//
// Возвращаемое значение:
// Булево - Версия платформы меньше указанной
Функция ВерсияПлатформыМеньше(ВерсияДляПроверки) Экспорт
Возврат ЮТСтроки.СравнитьВерсии(ЮТСлужебныйПовторногоИспользования.ВерсияПлатформы(), ВерсияДляПроверки) < 0;
КонецФункции
// Используется английский встроенный язык разработки.
//
// Возвращаемое значение:

View File

@ -144,29 +144,28 @@
Если Кешировать Тогда
Возврат ЮТСлужебныйПовторногоИспользования.ОписаниеТиповЛюбаяСсылка();
Иначе
КонецЕсли;
#Если ВебКлиент Или ТонкийКлиент Тогда
Параметры = Новый Массив(1);
Параметры[0] = Ложь;
Возврат ЮТМетодыСлужебный.ВызватьФункциюКонфигурацииНаСервере("ЮТТипыДанныхСлужебный", "ОписаниеТиповЛюбаяСсылка", Параметры);
#Иначе
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(
"<TypeDescription xmlns=""http://v8.1c.ru/8.1/data/core"">
| <TypeSet xmlns:cc=""http://v8.1c.ru/8.1/data/enterprise/current-config"">cc:AnyRef</TypeSet>
|</TypeDescription>");
ОписаниеТипаЛюбаяСсылка = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
СсылочныеТипыРасширений = ЮТМетодыСлужебныйВызовСервера.СсылочныеТипыДобавляемыеРасширениями();
Если СсылочныеТипыРасширений.Количество() <> 0 Тогда
ОписаниеТипаЛюбаяСсылка = Новый ОписаниеТипов(ОписаниеТипаЛюбаяСсылка, СсылочныеТипыРасширений);
КонецЕсли;
Возврат ОписаниеТипаЛюбаяСсылка;
#КонецЕсли
Если ЮТОкружение.ВерсияПлатформыМеньше("8.3.11") Или ЮТОкружение.ВерсияПлатформыБольшеИлиРавна("8.3.20.1549") Тогда
// До 8.3.11 не было возможности добавлять свои ссылочные объекты
// С версии 8.3.20.1549 AnyRef включает в себя типы из расширений
Результат = AnyRef();
// ИначеЕсли ЮТОкружение.ВерсияПлатформыБольшеИлиРавна("8.3.13") Тогда
// Этот вариант на два порядка медленнее, на конфигурации из проекта 4.485 сек против 0.040 сек (100 итераций, на одной схоже)
// Результат = Новый ОписаниеТипов(AnyRef(), ЮТМетаданныеСлужебныйВызовСервера.СсылочныеТипыРасширений())
Иначе
Результат = ЮТМетаданныеСлужебныйВызовСервера.ОписаниеТиповЛюбаяСсылкаПоМетаданным();
КонецЕсли;
Возврат Результат;
#КонецЕсли
КонецФункции
#Область СистемныеПеречисления
@ -296,4 +295,17 @@
КонецФункции
#Если НЕ ВебКлиент Тогда
Функция AnyRef() Экспорт
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(
"<TypeDescription xmlns=""http://v8.1c.ru/8.1/data/core"">
| <TypeSet xmlns:cc=""http://v8.1c.ru/8.1/data/enterprise/current-config"">cc:AnyRef</TypeSet>
|</TypeDescription>");
Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
КонецФункции
#КонецЕсли
#КонецОбласти

View File

@ -118,7 +118,8 @@
ЮТест.ОжидаетЧто(ЛюбаяСсылка)
.ИмеетТип("ОписаниеТипов")
.Что(ЛюбаяСсылка.СодержитТип(Тип("СправочникСсылка.Банки")));
.Что(ЛюбаяСсылка.СодержитТип(Тип("СправочникСсылка.Банки")), "Содержит тип из конфигурации")
;
КонецПроцедуры