diff --git "a/example/src/CommonModules/\320\224\320\265\320\274\320\276_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\320\241\320\265\321\200\320\262\320\270\321\201\320\260/Module.bsl" "b/example/src/CommonModules/\320\224\320\265\320\274\320\276_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\320\241\320\265\321\200\320\262\320\270\321\201\320\260/Module.bsl" index 586a05d..7e79214 100644 --- "a/example/src/CommonModules/\320\224\320\265\320\274\320\276_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\320\241\320\265\321\200\320\262\320\270\321\201\320\260/Module.bsl" +++ "b/example/src/CommonModules/\320\224\320\265\320\274\320\276_\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\320\241\320\265\321\200\320\262\320\270\321\201\320\260/Module.bsl" @@ -2,6 +2,8 @@ #Область СлужебныйПрограммныйИнтерфейс +#Область ОбработчикиЗапросов + // Создать заявку. // // Параметры: @@ -122,18 +124,10 @@ // HTTPСервисОтвет - Ответ Функция ПолучитьПроект(Запрос, МетаданныеСервиса) Экспорт - ПараметрАйдиПроекта = СервисыОбщее.НовыйПараметрЗапроса("project_id", "ИД", Истина); - ПараметрКод = СервисыОбщее.НовыйПараметрЗапроса("code", "Число"); - ПараметрУдален = СервисыОбщее.НовыйПараметрЗапроса("deleted", "Булево"); - ПараметрСтатус = СервисыОбщее.НовыйПараметрЗапроса("status"); - ПараметрСтатус.ВозможныеЗначения.Добавить("active"); - ПараметрСтатус.ВозможныеЗначения.Добавить("disabled"); - - ОжидаемыеПараметры = Новый Массив(); - ОжидаемыеПараметры.Добавить(ПараметрАйдиПроекта); - ОжидаемыеПараметры.Добавить(ПараметрКод); - ОжидаемыеПараметры.Добавить(ПараметрУдален); - ОжидаемыеПараметры.Добавить(ПараметрСтатус); + ОжидаемыеПараметры = ОбщегоНазначенияХТТП.ДополнитьМассив( + ПараметрыШаблона_projects_single(), + ПараметрыМетода_ПолучитьПроект() + ); // Массив ПараметрыЗапроса = СервисыОбщее.ПараметрыЗапроса( Запрос, @@ -211,11 +205,65 @@ Возврат XMLСтрока(Значение); КонецЕсли; КонецФункции +#КонецОбласти + + +#Область OAS + +// Параметры шаблонов URL. +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение - Параметры шаблонов URL: +// * Ключ - ОбъектМетаданныхШаблонURLHTTPСервиса +// * Значение - Массив из см. СервисыОбщее.НовыйПараметрЗапроса +Функция ПараметрыШаблоновURL() Экспорт + Результат = Новый Соответствие(); + Результат.Вставить(Метаданные.HTTPСервисы.Демо_.ШаблоныURL.projects_single, ПараметрыШаблона_projects_single()); + Возврат Результат; +КонецФункции + +// Параметры методов. +// +// Возвращаемое значение: +// Соответствие из КлючИЗначение - Параметры шаблонов URL: +// * Ключ - ОбъектМетаданныхМетодHTTPСервиса +// * Значение - Массив из см. СервисыОбщее.НовыйПараметрЗапроса +Функция ПараметрыМетодов() Экспорт + Результат = Новый Соответствие(); + Результат.Вставить(Метаданные.HTTPСервисы.Демо_.ШаблоныURL.projects_single.Методы.GET, ПараметрыМетода_ПолучитьПроект()); + Возврат Результат; +КонецФункции + +#КонецОбласти #КонецОбласти #Область СлужебныеПроцедурыИФункции +#Область СпецификацииМетодов + +Функция ПараметрыМетода_ПолучитьПроект() + ОжидаемыеПараметры = Новый Массив(); + ПараметрКод = СервисыОбщее.НовыйПараметрЗапроса("code", "Число"); + ПараметрУдален = СервисыОбщее.НовыйПараметрЗапроса("deleted", "Булево"); + ПараметрСтатус = СервисыОбщее.НовыйПараметрЗапроса("status"); + ПараметрСтатус.ВозможныеЗначения.Добавить("active"); + ПараметрСтатус.ВозможныеЗначения.Добавить("disabled"); + ОжидаемыеПараметры.Добавить(ПараметрКод); + ОжидаемыеПараметры.Добавить(ПараметрУдален); + ОжидаемыеПараметры.Добавить(ПараметрСтатус); + Возврат ОжидаемыеПараметры; +КонецФункции + +Функция ПараметрыШаблона_projects_single() + ОжидаемыеПараметры = Новый Массив(); + ПараметрАйдиПроекта = СервисыОбщее.НовыйПараметрЗапроса("project_id", "ИД", Истина); + ОжидаемыеПараметры.Добавить(ПараметрАйдиПроекта); + Возврат ОжидаемыеПараметры; +КонецФункции + +#КонецОбласти + // Общие параметры преобразования. // // Параметры: diff --git a/example/src/Configuration/Configuration.mdo b/example/src/Configuration/Configuration.mdo index 9b1c7e4..2965ece 100644 --- a/example/src/Configuration/Configuration.mdo +++ b/example/src/Configuration/Configuration.mdo @@ -50,4 +50,5 @@ Catalog.Демо_Проекты Document.Демо_Заявка Document.Демо_Сообщение + DataProcessor.ГенераторСхемыКонфигурации diff --git "a/example/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\241\321\205\320\265\320\274\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Form.form" "b/example/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\241\321\205\320\265\320\274\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Form.form" new file mode 100644 index 0000000..8b7cd95 --- /dev/null +++ "b/example/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\241\321\205\320\265\320\274\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Form.form" @@ -0,0 +1,154 @@ + + + + Реквизит1 + 1 + true + true + + true + + + Реквизит1 + + + Реквизит1РасширеннаяПодсказка + 3 + true + true + + true + + Label + true + true + + Left + + + + Реквизит1КонтекстноеМеню + 2 + true + true + + true + + true + + InputField + Enter + true + Left + true + + true + true + true + true + true + true + true + + + + СобратьСхему + 4 + true + true + + true + + + СобратьСхемуРасширеннаяПодсказка + 5 + true + true + + true + + Label + true + true + + Left + + + UsualButton + Form.Command.СобратьСхему + Auto + true + true + UserCmds + Auto + + + ФормаКоманднаяПанель + -1 + true + true + + true + + Left + true + + true + true + Vertical + true + true + true + true + true + + Объект + 1 + + DataProcessorObject.ГенераторСхемыКонфигурации + + + true + + + true + +
true
+
+ + Реквизит1 + 2 + + String + + + + true + + + true + + + + СобратьСхему + + <key>ru</key> + <value>Собрать схему</value> + + 1 + + true + + + + СобратьСхему + + + Auto + + + + + + +
diff --git "a/example/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\241\321\205\320\265\320\274\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Module.bsl" "b/example/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\241\321\205\320\265\320\274\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Module.bsl" new file mode 100644 index 0000000..4a38d94 --- /dev/null +++ "b/example/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\241\321\205\320\265\320\274\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/Forms/\320\244\320\276\321\200\320\274\320\260/Module.bsl" @@ -0,0 +1,91 @@ + +&НаКлиенте +Процедура СобратьСхему(Команда) + СобратьСхемуНаСервере(); +КонецПроцедуры + +&НаСервере +Процедура СобратьСхемуНаСервере() + Генератор = ГенераторOAS.НовыйГенераторСхемы(); + Генератор + .ДобавитьИнфо("Тестовая схема", "1.0") + .ДобавитьКонтакт("daabramov", , "i@dima-abramov.ru") + .ДобавитьЛицензию("MIT") + .ДобавитьСервер("http://localhost/api"); + + ПараметрыШаблонов = Демо_КонтроллерСервиса.ПараметрыШаблоновURL(); + ПараметрыМетодов = Демо_КонтроллерСервиса.ПараметрыМетодов(); + + Для Каждого Шаблон Из Метаданные.HTTPСервисы.Демо_.ШаблоныURL Цикл + + Генератор.ДобавитьПуть(Шаблон.Шаблон, Шаблон.Синоним, Шаблон.Комментарий); + + ПараметрыПути = ПараметрыШаблонов.Получить(Шаблон); + Если ПараметрыПути <> Неопределено Тогда + Для Каждого Параметр Из ПараметрыПути Цикл + Генератор.ДобавитьПараметр(Параметр.Имя, "path", Истина, ТипПараметраСхемыПоОписанию(Параметр, Генератор)); + КонецЦикла; + КонецЕсли; + + Для Каждого Метод Из Шаблон.Методы Цикл + + Генератор.ДобавитьМетод(НРег(Строка(Метод.HTTPМетод)), Метод.Синоним, Метод.Комментарий); + + ПараметрыМетода = ПараметрыМетодов.Получить(Метод); + Если ПараметрыМетода <> Неопределено Тогда + Для Каждого Параметр Из ПараметрыМетода Цикл + Генератор.ДобавитьПараметр( + Параметр.Имя, + "query", + Параметр.Обязательный, + ТипПараметраСхемыПоОписанию(Параметр, Генератор) + ); + КонецЦикла; + КонецЕсли; + + КонецЦикла; + + КонецЦикла; + + Реквизит1 = Генератор.ПолучитьСхему(); + +КонецПроцедуры + +// Тип параметра схемы по описанию. +// +// Параметры: +// Параметр - см. СервисыОбщее.НовыйПараметрЗапроса +// ГенераторСхемы - ОбработкаОбъект.ГенераторOAS +// +// Возвращаемое значение: +&НаСервере +Функция ТипПараметраСхемыПоОписанию(Параметр, ГенераторСхемы) + + Результат = ГенераторСхемы.ДоступныеТипы[Врег(Параметр.Тип)]; + + Если Параметр.ВозможныеЗначения.Количество() > 0 Тогда + Результат = Новый Структура(Результат); + Результат.Вставить("enum", Параметр.ВозможныеЗначения); + Возврат Новый ФиксированнаяСтруктура(Результат); + Иначе + Возврат Результат; + КонецЕсли; + +КонецФункции + +&НаСервере +Функция ПараметрыВПути(Шаблон) + ПараметрыВПути = Новый Массив; + СоставПути = СтрРазделить(Шаблон, "/", Ложь); + + Для Каждого Элемент Из СоставПути Цикл + + Если Лев(Элемент, 1) = "{" И Прав(Элемент, 1) = "}" Тогда + ПараметрыВПути.Добавить(Сред(Элемент, 2, СтрДлина(Элемент) - 2)); + КонецЕсли; + + КонецЦикла; + + Возврат ПараметрыВПути; + +КонецФункции diff --git "a/example/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\241\321\205\320\265\320\274\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\241\321\205\320\265\320\274\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.mdo" "b/example/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\241\321\205\320\265\320\274\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\241\321\205\320\265\320\274\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.mdo" new file mode 100644 index 0000000..3ae82b1 --- /dev/null +++ "b/example/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\241\321\205\320\265\320\274\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200\320\241\321\205\320\265\320\274\321\213\320\232\320\276\320\275\321\204\320\270\320\263\321\203\321\200\320\260\321\206\320\270\320\270.mdo" @@ -0,0 +1,23 @@ + + + + + + + ГенераторСхемыКонфигурации + + ru + Генератор схемы конфигурации + + true + DataProcessor.ГенераторСхемыКонфигурации.Form.Форма + + Форма + + ru + Форма + + PersonalComputer + MobileDevice + + diff --git "a/example/src/HTTPServices/\320\224\320\265\320\274\320\276_/\320\224\320\265\320\274\320\276_.mdo" "b/example/src/HTTPServices/\320\224\320\265\320\274\320\276_/\320\224\320\265\320\274\320\276_.mdo" index 4297463..c295ee9 100644 --- "a/example/src/HTTPServices/\320\224\320\265\320\274\320\276_/\320\224\320\265\320\274\320\276_.mdo" +++ "b/example/src/HTTPServices/\320\224\320\265\320\274\320\276_/\320\224\320\265\320\274\320\276_.mdo" @@ -14,6 +14,7 @@ ru Projects + Работа со списком проектов POST @@ -39,6 +40,7 @@ ru Requests + Работа со списком запросов POST @@ -64,6 +66,7 @@ ru Projects single + Работа с конкретным проектом GET @@ -80,6 +83,7 @@ ru Projects single files + Работы с файлами проекта GET diff --git "a/src/src/CommonModules/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/Module.bsl" "b/src/src/CommonModules/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/Module.bsl" new file mode 100644 index 0000000..058fbee --- /dev/null +++ "b/src/src/CommonModules/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/Module.bsl" @@ -0,0 +1,26 @@ +// @strict-types +// @skip-check constructor-function-return-section + +#Область ПрограммныйИнтерфейс + +// Новый генератор схемы. +// +// Возвращаемое значение: +// ОбработкаОбъект.ГенераторOAS - Новый генератор схемы +Функция НовыйГенераторСхемы() Экспорт + Возврат Обработки.ГенераторOAS.Создать(); +КонецФункции + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Код процедур и функций + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + + + +#КонецОбласти diff --git "a/src/src/CommonModules/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS.mdo" "b/src/src/CommonModules/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS.mdo" new file mode 100644 index 0000000..08419b2 --- /dev/null +++ "b/src/src/CommonModules/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS.mdo" @@ -0,0 +1,11 @@ + + + ГенераторOAS + + ru + Генератор OAS + + true + true + true + diff --git "a/src/src/CommonModules/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260HTTP\320\227\320\260\320\277\321\200\320\276\321\201\320\276\320\262/Module.bsl" "b/src/src/CommonModules/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260HTTP\320\227\320\260\320\277\321\200\320\276\321\201\320\276\320\262/Module.bsl" index cfe55b4..c9dcace 100644 --- "a/src/src/CommonModules/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260HTTP\320\227\320\260\320\277\321\200\320\276\321\201\320\276\320\262/Module.bsl" +++ "b/src/src/CommonModules/\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260HTTP\320\227\320\260\320\277\321\200\320\276\321\201\320\276\320\262/Module.bsl" @@ -58,10 +58,7 @@ ИтоговыйТекстОшибки = ?( ОбработкаЗапросовПовтИсп.ВыводитьПодробноеОписаниеОшибок(), - СтрШаблон( - "%1", - ПодробныйТекстОшибки - ), + ПодробныйТекстОшибки, "" ); diff --git "a/src/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\245\320\242\320\242\320\237/Module.bsl" "b/src/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\245\320\242\320\242\320\237/Module.bsl" index 125d3fc..bf8d7f1 100644 --- "a/src/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\245\320\242\320\242\320\237/Module.bsl" +++ "b/src/src/CommonModules/\320\236\320\261\321\211\320\265\320\263\320\276\320\235\320\260\320\267\320\275\320\260\321\207\320\265\320\275\320\270\321\217\320\245\320\242\320\242\320\237/Module.bsl" @@ -345,6 +345,40 @@ КонецПроцедуры +// Дополняет массив МассивПриемник значениями из массива МассивИсточник. +// +// Параметры: +// МассивПриемник - Массив - массив, в который необходимо добавить значения. +// МассивИсточник - Массив - массив значений для заполнения. +// ТолькоУникальныеЗначения - Булево - если истина, то в массив будут включены только уникальные значения. +// +Процедура ДополнитьМассив(МассивПриемник, МассивИсточник, ТолькоУникальныеЗначения = Ложь) Экспорт + + Если ТолькоУникальныеЗначения Тогда + + УникальныеЗначения = Новый Соответствие; + + Для Каждого Значение Из МассивПриемник Цикл + УникальныеЗначения.Вставить(Значение, Истина); + КонецЦикла; + + Для Каждого Значение Из МассивИсточник Цикл + Если УникальныеЗначения[Значение] = Неопределено Тогда + МассивПриемник.Добавить(Значение); + УникальныеЗначения.Вставить(Значение, Истина); + КонецЕсли; + КонецЦикла; + + Иначе + + Для Каждого Значение Из МассивИсточник Цикл + МассивПриемник.Добавить(Значение); + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + #КонецОбласти #Область СлужебныеПроцедурыИФункции diff --git "a/src/src/CommonModules/\320\241\320\265\321\200\320\262\320\270\321\201\321\213\320\236\320\261\321\211\320\265\320\265/Module.bsl" "b/src/src/CommonModules/\320\241\320\265\321\200\320\262\320\270\321\201\321\213\320\236\320\261\321\211\320\265\320\265/Module.bsl" index 5e3e554..4b419a5 100644 --- "a/src/src/CommonModules/\320\241\320\265\321\200\320\262\320\270\321\201\321\213\320\236\320\261\321\211\320\265\320\265/Module.bsl" +++ "b/src/src/CommonModules/\320\241\320\265\321\200\320\262\320\270\321\201\321\213\320\236\320\261\321\211\320\265\320\265/Module.bsl" @@ -44,7 +44,7 @@ // Возвращаемое значение: // Соответствие из КлючИЗначение - Параметры запроса: // * Ключ - Строка -// * Значение - Строка,Булево,Число +// * Значение - Строка,Булево,Число,Дата Функция ПараметрыЗапроса(Запрос, ПроверяемыеПараметры) Экспорт ПараметрыЗапроса = Новый Соответствие(); @@ -93,6 +93,20 @@ Исключение ВызватьИсключениеПроверки(СтрШаблон("failed to convert value [%1] to number", ЗначениеПараметра)); КонецПопытки; + ИначеЕсли Тип = "ДАТА" Тогда + Попытка + Дата = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "date"), ЗначениеПараметра); + ПараметрыЗапроса.Вставить(ЗапрашиваемыйПараметр.Имя, Дата.Значение); + Исключение + ВызватьИсключениеПроверки(СтрШаблон("value [%1] is not date", ЗначениеПараметра)); + КонецПопытки; + ИначеЕсли Тип = "ДАТА_ВРЕМЯ" Тогда + Попытка + Дата = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("http://www.w3.org/2001/XMLSchema", "dateTime"), ЗначениеПараметра); + ПараметрыЗапроса.Вставить(ЗапрашиваемыйПараметр.Имя, Дата.Значение); + Исключение + ВызватьИсключениеПроверки(СтрШаблон("value [%1] is not dateTime", ЗначениеПараметра)); + КонецПопытки; ИначеЕсли Тип = "ИД" Тогда Попытка ФабрикаXDTO.Создать(ФабрикаXDTO.Тип("https://github.com/Daabramov/1c-http-framework", "guid"), ЗначениеПараметра); @@ -115,14 +129,14 @@ // // Параметры: // Имя - Строка - Имя -// Тип - Строка - Описание типа строкой (Число,Строка,Булево,Ид) +// Тип - Строка - Описание типа строкой (Число,Строка,Булево,Ид,Дата,ДатаВремя) // Обязательный - Булево - Признак обязательности параметра // // Возвращаемое значение: // Структура - Новый параметр запроса: // * Имя - Строка // * Обязательный - Булево -// * Тип - Строка - Тип строкой "Число", "Строка", "Булево" или "Ид" +// * Тип - Строка - Тип строкой "Число", "Строка", "Булево", "Дата", "ДатаВремя" или "Ид" // * ВозможныеЗначения - Массив из Строка - возможные значения строк указывать в нижнем регистре Функция НовыйПараметрЗапроса(Имя, Тип = "Строка", Обязательный = Ложь) Экспорт diff --git a/src/src/Configuration/Configuration.mdo b/src/src/Configuration/Configuration.mdo index 98b2d84..a137fd9 100644 --- a/src/src/Configuration/Configuration.mdo +++ b/src/src/Configuration/Configuration.mdo @@ -43,6 +43,7 @@ Role.ПолныеПрава CommonModule.ВосстановлениеXDTO CommonModule.ВосстановлениеXDTOПереопределяемый + CommonModule.ГенераторOAS CommonModule.Кеширование CommonModule.КоннекторХТТПСлужебный CommonModule.ОбработкаHTTPЗапросов @@ -53,5 +54,6 @@ CommonModule.ПроцессорыКоллекцийСлужебный CommonModule.СервисыОбщее XDTOPackage.ОбщегоНазначенияХТТП + DataProcessor.ГенераторOAS DataProcessor.ПроцессорКоллекций diff --git "a/src/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/ManagerModule.bsl" "b/src/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/ManagerModule.bsl" new file mode 100644 index 0000000..abf5df5 --- /dev/null +++ "b/src/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/ManagerModule.bsl" @@ -0,0 +1,30 @@ +// @strict-types + + +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ПрограммныйИнтерфейс + +// Код процедур и функций + +#КонецОбласти + +#Область ОбработчикиСобытий + +// Код процедур и функций + +#КонецОбласти + +#Область СлужебныйПрограммныйИнтерфейс + +// Код процедур и функций + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Код процедур и функций + +#КонецОбласти + +#КонецЕсли diff --git "a/src/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/ObjectModule.bsl" "b/src/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/ObjectModule.bsl" new file mode 100644 index 0000000..b5c71a9 --- /dev/null +++ "b/src/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/ObjectModule.bsl" @@ -0,0 +1,489 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область ОписаниеПеременных + +Перем Схема; // см. КорневаяСхема +Перем ТекущийШаблонURL; // см. НовыйОписаниеШаблонаURL +Перем ТекущийМетодURL; // см. НовыйБлокМетода +Перем ТекущийКомпонент; // см. НовыйБлокКомпонента +Перем ТекущийБлокПараметров; // Массив +Перем ДоступныеТипы Экспорт; // см. ДоступныеТипы +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +Функция ДобавитьИнфо(Заголовок, Версия, Описание = Неопределено) Экспорт + Схема.info = РазделИнфо(Заголовок, Версия, Описание); + Возврат ЭтотОбъект; +КонецФункции + +Функция ДобавитьЛицензию(ИмяЛицензии, URLЛицензии = Неопределено) Экспорт + БлокЛицензии = НовыйБлокЛицензии(ИмяЛицензии, URLЛицензии); + Схема.info.Вставить("license", БлокЛицензии); + Возврат ЭтотОбъект; +КонецФункции + +Функция ДобавитьКонтакт(ИмяКонтакта = Неопределено, URL = Неопределено, ПочтовыйАдрес = Неопределено) Экспорт + + БлокКонтакт = НовыйБлокКонтактов(); + + Если ИмяКонтакта <> Неопределено Тогда + БлокКонтакт.name = ИмяКонтакта; + Иначе + БлокКонтакт.Удалить("name"); + КонецЕсли; + + Если URL <> Неопределено Тогда + БлокКонтакт.url = URL; + Иначе + БлокКонтакт.Удалить("url"); + КонецЕсли; + + Если ПочтовыйАдрес <> Неопределено Тогда + БлокКонтакт.email = ПочтовыйАдрес; + Иначе + БлокКонтакт.Удалить("email"); + КонецЕсли; + + Схема.info.Вставить("contact", БлокКонтакт); + Возврат ЭтотОбъект; + +КонецФункции + +Функция ДобавитьСервер(Адрес, Описание = Неопределено) Экспорт + ИнфоСервера = НовыйСервер(Адрес, Описание); + Схема.servers.Добавить(ИнфоСервера); + Возврат ЭтотОбъект; +КонецФункции + +Функция ДобавитьТег(ИмяТега, Описание = Неопределено) Экспорт + Тег = НовыйТэг(ИмяТега, Описание); + Схема.tags.Добавить(Тег); + Возврат ЭтотОбъект; +КонецФункции + +Функция ДобавитьПуть(Путь, КраткоеОписание = Неопределено, ПолноеОписание = Неопределено) Экспорт + ОписаниеПути = НовыйОписаниеШаблонаURL(); + + Если КраткоеОписание <> Неопределено Тогда + ОписаниеПути.summary = КраткоеОписание; + Иначе + ОписаниеПути.Удалить("summary"); + КонецЕсли; + + Если ПолноеОписание <> Неопределено Тогда + ОписаниеПути.description = ПолноеОписание; + Иначе + ОписаниеПути.Удалить("description"); + КонецЕсли; + + Схема.paths.Вставить(Путь, ОписаниеПути); + ТекущийШаблонURL = Схема.paths.Получить(Путь); + ТекущийБлокПараметров = ТекущийШаблонURL.parameters; + Возврат ЭтотОбъект; + +КонецФункции + +Функция ДобавитьМетод(ИмяМетода, КраткоеОписание = Неопределено, ПолноеОписание = Неопределено) Экспорт + БлокМетода = НовыйБлокМетода(); + + Если КраткоеОписание <> Неопределено Тогда + БлокМетода.summary = КраткоеОписание; + Иначе + БлокМетода.Удалить("summary"); + КонецЕсли; + + Если ПолноеОписание <> Неопределено Тогда + БлокМетода.description = ПолноеОписание; + Иначе + БлокМетода.Удалить("description"); + КонецЕсли; + + ТекущийШаблонURL.Вставить(ИмяМетода, БлокМетода); + ТекущийМетодURL = ТекущийШаблонURL[ИмяМетода]; + ТекущийБлокПараметров = ТекущийМетодURL.parameters; + Возврат ЭтотОбъект; +КонецФункции + +Функция ПолучитьСхему() Экспорт + Возврат КоннекторХТТПСлужебный.ОбъектВJson(Схема); +КонецФункции + +// Добавить параметр. +// +// Параметры: +// ИмяПараметра - Строка +// Локация - Строка +// Обязательный - Булево +// Тип - см. ОписаниеТипа +// +// Возвращаемое значение: +// ОбработкаОбъект.ГенераторOAS - Добавить параметр +Функция ДобавитьПараметр(ИмяПараметра, Локация, Обязательный, Тип = Неопределено) Экспорт + Параметр = НовыйБлокПараметраМетода(); + Параметр.name = ИмяПараметра; + Параметр.in = Локация; + Параметр.required = Обязательный; + + Если Тип = Неопределено Тогда + Параметр.Удалить("schema"); + Иначе + Параметр.schema = Тип; + КонецЕсли; + + ТекущийБлокПараметров.Добавить(Параметр); + + Возврат ЭтотОбъект; +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +// Корневая схема. +// +// Возвращаемое значение: +// Структура - Корневая схема: +// * openapi - Строка +// * info - Структура +// * servers - Массив из см. НовыйСервер +// * paths - Соответствие из КлючИЗначение: +// ** Ключ - Строка +// ** Значение - см. НовыйБлокМетода +// * components - Структура из см. НовыйБлокКомпонента +// * tags - Массив из см. НовыйТэг +Функция КорневаяСхема() + + Результат = Новый Структура(); + Результат.Вставить("openapi", "3.0.0"); + Результат.Вставить("info", Новый Структура()); + Результат.Вставить("servers", Новый Массив()); + Результат.Вставить("paths", Новый Соответствие()); + Результат.Вставить("components", Новый Структура()); + Результат.Вставить("tags", Новый Массив()); + Возврат Результат; + +КонецФункции + +// Раздел инфо. +// +// Параметры: +// Заголовок - Строка +// Версия - Строка +// Лицензия - см. НовыйБлокЛицензии +// Контакты - см. НовыйБлокКонтактов +// Описание - Строка +// +// Возвращаемое значение: +// Структура - Раздел инфо: +// * title - Строка +// * version - Строка +// * description - Строка +// * termsOfService - Строка +// * contact - см. НовыйБлокКонтактов +// * license - см. НовыйБлокЛицензии +Функция РазделИнфо(Заголовок, Версия, Описание = Неопределено) + + Результат = Новый Структура(); + Результат.Вставить("title", Заголовок); + Результат.Вставить("version", Версия); + Результат.Вставить("description", ?(ЗначениеЗаполнено(Описание), Описание, "")); + Результат.Вставить("termsOfService", ""); + + Возврат Результат; + +КонецФункции + +// Новый блок контактов. +// +// Возвращаемое значение: +// Структура - Новый блок контактов: +// * name - Строка +// * url - Строка +// * email - Строка +Функция НовыйБлокКонтактов() + + Результат = Новый Структура; + + Результат.Вставить("name", ""); + Результат.Вставить("url", ""); + Результат.Вставить("email", ""); + + Возврат Результат; + +КонецФункции + +// Новый элемент сервер. +// +// Параметры: +// Адрес - Строка - URI адреса сервера +// Описание - Строка - Описание +// +// Возвращаемое значение: +// Структура - Новый элемент сервер: +// * url - Строка +// * description - Строка +Функция НовыйСервер(Адрес, Описание) + + Результат = Новый Структура; + + Результат.Вставить("url", Адрес); + Результат.Вставить("description", ?(ЗначениеЗаполнено(Описание), Описание, "")); + + Возврат Результат; + +КонецФункции + +// Описывает блок лицензии +// +// Параметры: +// ИмяЛицензии - Строка - +// АдресЛицензии - Строка - Адрес лицензии +// +// Возвращаемое значение: +// Структура - Новый блок лицензии: +// * name - Строка +// * url - Строка +Функция НовыйБлокЛицензии(ИмяЛицензии, АдресЛицензии) + + Результат = Новый Структура; + Результат.Вставить("name", ИмяЛицензии); + Результат.Вставить("url", ?(ЗначениеЗаполнено(АдресЛицензии), АдресЛицензии, "")); + Возврат Результат; + +КонецФункции + +// Описывает блок данных тэга +// +// Параметры: +// ИмяТега - Строка +// Описание - Строка +// +// Возвращаемое значение: +// Структура - Новый тэг: +// * name - Строка +// * description - Строка +Функция НовыйТэг(ИмяТега, Описание) + + Результат = Новый Структура; + Результат.Вставить("name", ИмяТега); + Результат.Вставить("description", ?(ЗначениеЗаполнено(Описание), Описание, "")); + Возврат Результат; + +КонецФункции + +// Новый описание шаблона URL. +// +// Возвращаемое значение: +// Структура - Новый описание шаблона URL: +// * summary - Строка +// * description - Строка +// * parameters - Массив из см. НовыйБлокПараметраМетода +Функция НовыйОписаниеШаблонаURL() + + Результат = Новый Структура; + + Результат.Вставить("summary", ""); + Результат.Вставить("description", ""); + Результат.Вставить("parameters", Новый Массив); + + Возврат Результат; + +КонецФункции + + +// Новый блок метода. +// +// Возвращаемое значение: +// Структура - Новый блок метода: +// * tags - Массив из Строка +// * summary - Строка +// * requestBody - см. новый +// * description - Строка +// * parameters - Массив из см. НовыйБлокПараметраМетода +// * deprecated - Булево +// * responses - Соответствие - +Функция НовыйБлокМетода() + + Результат = Новый Структура; + + Результат.Вставить("tags", Новый Массив); + Результат.Вставить("summary"); +// Результат.Вставить("requestBody"); + Результат.Вставить("description"); + Результат.Вставить("parameters", Новый Массив); + Результат.Вставить("deprecated", Ложь); + Результат.Вставить("responses", Новый Соответствие); + + Возврат Результат; + +КонецФункции + +// Новый блок параметра метода. +// +// Возвращаемое значение: +// Структура - Новый блок параметра метода: +// * name - Строка +// * in - Строка +// * required - Булево +// * schema - Неопределено +Функция НовыйБлокПараметраМетода() + + Результат = Новый Структура; + + Результат.Вставить("name"); + Результат.Вставить("in"); +// Результат.Вставить("description"); + Результат.Вставить("required"); + Результат.Вставить("schema"); + + Возврат Результат; + +КонецФункции + +// Описывает блок ссылки на документацию +// +// Параметры: +// URL - Строка +// Описание - Строка +// +// Возвращаемое значение: +// Структура - Новый блок ссылки на документацию: +// * url - Строка +// * description - Строка +Функция НовыйБлокСсылкиНаДокументацию(URL, Описание = Неопределено) + + Результат = Новый Структура; + Результат.Вставить("url", URL); + Результат.Вставить("description", ?(ЗначениеЗаполнено(Описание), Описание, "")); + Возврат Результат; + +КонецФункции + +// Описывает блок определений +// +// Возвращаемое значение: +// Структура - структура данных +// +Функция НовыйБлокКомпонента() + + Результат = Новый Структура; + + Результат.Вставить("type"); + Результат.Вставить("properties"); + + Возврат Результат; + +КонецФункции + +// Описывает блок свойства типа +// +// Возвращаемое значение: +// Структура - структура данных +// +Функция НовыйБлокСвойстваТипа() + + Результат = Новый Структура; + + Результат.Вставить("type"); + Результат.Вставить("format"); + Результат.Вставить("description"); + Результат.Вставить("items"); + + Возврат Результат; + +КонецФункции + +// Описывает блок ответа +// +// Возвращаемое значение: +// Структура - структура данных +// +Функция НовыйБлокОтвета() + + Результат = Новый Структура; + + Результат.Вставить("description"); + Результат.Вставить("content"); + + Возврат Результат; + +КонецФункции + +Функция НовыйБлокКонтента() + Результат = Новый Структура(); + Результат.Вставить("schema"); +КонецФункции + +// Описывает указатель на тип +// +// Параметры: +// Тип - Строка - тип данных +// ЭтоМассив - Булево - признак массива +// +// Возвращаемое значение: +// Соответствие - указатель +// +Функция НовыйУказательНаТип(Тип, ЭтоМассив = Ложь) + + Результат = Новый Соответствие; + + Если ЭтоМассив Тогда + ОписаниеМассива = Новый Соответствие; + ОписаниеМассива.Вставить("$ref", СтрШаблон("#/components/schemas/%1", Тип)); + Результат.Вставить("items", ОписаниеМассива); + Результат.Вставить("type", "array"); + Иначе + Результат.Вставить("$ref", СтрШаблон("#/components/schemas/%1", Тип)); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// Доступные типы. +// +// Возвращаемое значение: +// ФиксированнаяСтруктура - Доступные типы: +// * ЧИСЛО - см. ОписаниеТипа +// * БУЛЕВО - см. ОписаниеТипа +// * ДАТА - см. ОписаниеТипа +// * ДАТА_ВРЕМЯ - см. ОписаниеТипа +// * ИД - см. ОписаниеТипа +// * СТРОКА - см. ОписаниеТипа +Функция ДоступныеТипы() + Результат = Новый Структура(); + Результат.Вставить("ЧИСЛО", ОписаниеТипа("number", "")); + Результат.Вставить("БУЛЕВО", ОписаниеТипа("boolean", "")); + Результат.Вставить("ДАТА", ОписаниеТипа("string", "date")); + Результат.Вставить("ДАТА_ВРЕМЯ", ОписаниеТипа("string", "date-time")); + Результат.Вставить("ИД", ОписаниеТипа("string", "uuid")); + Результат.Вставить("СТРОКА", ОписаниеТипа("string", "")); + Возврат Новый ФиксированнаяСтруктура(Результат); +КонецФункции + +// Описание типа. +// +// Параметры: +// Тип - Строка +// Формат - Строка +// +// Возвращаемое значение: +// ФиксированнаяСтруктура - Описание типа: +// * type - Строка +// * format - Строка +Функция ОписаниеТипа(Тип, Формат) + Результат = Новый Структура("type,format", Тип, Формат); + Возврат Новый ФиксированнаяСтруктура(Результат); +КонецФункции + +#КонецОбласти + +#Область Инициализация + +Схема = КорневаяСхема(); +ДоступныеТипы = ДоступныеТипы(); + +#КонецОбласти + +#КонецЕсли diff --git "a/src/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS.mdo" "b/src/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS.mdo" new file mode 100644 index 0000000..15afacf --- /dev/null +++ "b/src/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS.mdo" @@ -0,0 +1,13 @@ + + + + + + + ГенераторOAS + + ru + Генератор OAS + + true + diff --git "a/src/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS.suppress" "b/src/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS.suppress" new file mode 100644 index 0000000..719a843 --- /dev/null +++ "b/src/src/DataProcessors/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS/\320\223\320\265\320\275\320\265\321\200\320\260\321\202\320\276\321\200OAS.suppress" @@ -0,0 +1,4 @@ + + + +