├── .github └── workflows │ └── deploy-documentation.yml ├── .gitignore ├── LICENSE ├── README.md ├── docs ├── .gitignore ├── README.md ├── docs │ └── getting-started │ │ ├── descriptions.md │ │ ├── index.md │ │ ├── input_control.md │ │ ├── methods_func_style.md │ │ ├── objects_func_style.md │ │ ├── objects_proc_style.md │ │ └── static_swagger_json.md ├── docusaurus.config.ts ├── package.json ├── sidebars.ts ├── src │ ├── css │ │ └── custom.css │ └── pages │ │ └── index.md ├── static │ ├── .nojekyll │ ├── img │ │ ├── description.png │ │ ├── favicon.ico │ │ ├── logo.webp │ │ └── method-name.png │ ├── rapidoc.png │ ├── redoc.png │ ├── scalar.png │ ├── screenshot_1.png │ └── stoplight.png ├── tsconfig.json └── yarn.lock ├── package.json ├── scripts ├── .env └── ext2cfe.cmd ├── swagger-test ├── CommonModules │ ├── SwagTest_YAxUnit_Тесты.xml │ ├── SwagTest_YAxUnit_Тесты │ │ └── Ext │ │ │ └── Module.bsl │ ├── SwagTest_Тестовый_HTTPСервис2Описание.xml │ ├── SwagTest_Тестовый_HTTPСервис2Описание │ │ └── Ext │ │ │ └── Module.bsl │ ├── SwagTest_Тестовый_HTTPСервис3Описание.xml │ ├── SwagTest_Тестовый_HTTPСервис3Описание │ │ └── Ext │ │ │ └── Module.bsl │ ├── SwagTest_Тестовый_HTTPСервисОписание.xml │ ├── SwagTest_Тестовый_HTTPСервисОписание │ │ └── Ext │ │ │ └── Module.bsl │ ├── SwagTest_Тестовый_HTTPСервисСВерсияиОписание.xml │ ├── SwagTest_Тестовый_HTTPСервисСВерсияиОписание │ │ └── Ext │ │ │ └── Module.bsl │ ├── SwaggerОбщиеНастройки.xml │ ├── SwaggerОбщиеНастройки │ │ └── Ext │ │ │ └── Module.bsl │ ├── БиллингОписание.xml │ ├── БиллингОписание │ │ └── Ext │ │ │ └── Module.bsl │ ├── ПередачаДанныхОписание.xml │ ├── ПередачаДанныхОписание │ │ └── Ext │ │ │ └── Module.bsl │ ├── СерверЛояльностиОписание.xml │ └── СерверЛояльностиОписание │ │ └── Ext │ │ └── Module.bsl ├── Configuration.xml ├── HTTPServices │ ├── SwagTest_Тестовый_HTTPСервис.xml │ ├── SwagTest_Тестовый_HTTPСервис │ │ └── Ext │ │ │ └── Module.bsl │ ├── SwagTest_Тестовый_HTTPСервис2.xml │ ├── SwagTest_Тестовый_HTTPСервис2 │ │ └── Ext │ │ │ └── Module.bsl │ ├── SwagTest_Тестовый_HTTPСервис3.xml │ ├── SwagTest_Тестовый_HTTPСервис3 │ │ └── Ext │ │ │ └── Module.bsl │ ├── SwagTest_Тестовый_HTTPСервисСВерсияи.xml │ └── SwagTest_Тестовый_HTTPСервисСВерсияи │ │ └── Ext │ │ └── Module.bsl └── Languages │ └── Русский.xml └── swagger ├── CommonModules ├── Swag_Запросы.xml ├── Swag_Запросы │ └── Ext │ │ └── Module.bsl ├── Swag_ОбработкаHTTP.xml ├── Swag_ОбработкаHTTP │ └── Ext │ │ └── Module.bsl ├── Swag_Описание.xml ├── Swag_Описание │ └── Ext │ │ └── Module.bsl ├── Swag_ФормированиеОписаний.xml └── Swag_ФормированиеОписаний │ └── Ext │ └── Module.bsl ├── CommonTemplates ├── Swag_favicon_16x16_png.xml ├── Swag_favicon_16x16_png │ └── Ext │ │ └── Template.bin ├── Swag_favicon_32x32_png.xml ├── Swag_favicon_32x32_png │ └── Ext │ │ └── Template.bin ├── Swag_index_html.xml ├── Swag_index_html │ └── Ext │ │ └── Template.txt ├── Swag_rapidoc_index_html.xml ├── Swag_rapidoc_index_html │ └── Ext │ │ └── Template.txt ├── Swag_rapidoc_min_js.xml ├── Swag_rapidoc_min_js │ └── Ext │ │ └── Template.bin ├── Swag_redoc_index_html.xml ├── Swag_redoc_index_html │ └── Ext │ │ └── Template.txt ├── Swag_redoc_standalone_js.xml ├── Swag_redoc_standalone_js │ └── Ext │ │ └── Template.bin ├── Swag_scalar_api_reference_js.xml ├── Swag_scalar_api_reference_js │ └── Ext │ │ └── Template.bin ├── Swag_scalar_index_html.xml ├── Swag_scalar_index_html │ └── Ext │ │ └── Template.txt ├── Swag_stoplight_elements_styles_min_css.xml ├── Swag_stoplight_elements_styles_min_css │ └── Ext │ │ └── Template.bin ├── Swag_stoplight_elements_web_components_min_js.xml ├── Swag_stoplight_elements_web_components_min_js │ └── Ext │ │ └── Template.bin ├── Swag_stoplight_index_html.xml ├── Swag_stoplight_index_html │ └── Ext │ │ └── Template.txt ├── Swag_swagger_ui_bundle_js.xml ├── Swag_swagger_ui_bundle_js │ └── Ext │ │ └── Template.bin ├── Swag_swagger_ui_css.xml ├── Swag_swagger_ui_css │ └── Ext │ │ └── Template.bin ├── Swag_swagger_ui_standalone_preset_js.xml └── Swag_swagger_ui_standalone_preset_js │ └── Ext │ └── Template.bin ├── Configuration.xml ├── DataProcessors ├── Swag_ПроцессорОписанийМетодов.xml ├── Swag_ПроцессорОписанийМетодов │ └── Ext │ │ └── ObjectModule.bsl ├── Swag_ПроцессорОписанийОбъектов.xml └── Swag_ПроцессорОписанийОбъектов │ └── Ext │ └── ObjectModule.bsl ├── HTTPServices ├── Swag_Сервис.xml └── Swag_Сервис │ └── Ext │ └── Module.bsl ├── Languages └── Русский.xml └── Roles ├── Swag_ОсновнаяРоль.xml └── Swag_ОсновнаяРоль └── Ext └── Rights.xml /.github/workflows/deploy-documentation.yml: -------------------------------------------------------------------------------- 1 | name: Сборка документации 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | paths: 8 | - 'docs/**' 9 | # Review gh actions docs if you want to further define triggers, paths, etc 10 | # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on 11 | 12 | defaults: 13 | run: 14 | working-directory: ./docs 15 | 16 | jobs: 17 | deploy: 18 | name: Сборка документации 19 | runs-on: ubuntu-latest 20 | 21 | steps: 22 | - name: Извлечение исходников 23 | uses: actions/checkout@v4 24 | 25 | - name: Установка NodeJS 26 | uses: actions/setup-node@v4 27 | with: 28 | node-version: 18 29 | cache: yarn 30 | cache-dependency-path: 'docs/yarn.lock' 31 | 32 | - name: Установка зависимостей Docusaurus 33 | run: yarn install --frozen-lockfile 34 | 35 | - name: Сборка сайта с документацией 36 | run: yarn build 37 | 38 | # Popular action to deploy to GitHub Pages: 39 | # Docs: https://github.com/peaceiris/actions-gh-pages#%EF%B8%8F-docusaurus 40 | - name: Публикация на GitHub Pages 41 | uses: peaceiris/actions-gh-pages@v3 42 | with: 43 | github_token: ${{ secrets.GITHUB_TOKEN }} 44 | # Build output to publish to the `gh-pages` branch: 45 | publish_dir: ./docs/build 46 | # The following lines assign commit authorship to the official 47 | # GH-Actions bot for deploys to `gh-pages` branch: 48 | # https://github.com/actions/checkout/issues/13#issuecomment-724415212 49 | # The GH actions bot is used by default if you didn't specify the two fields. 50 | # You can swap them out with your own user credentials. 51 | user_name: github-actions[bot] 52 | user_email: 41898282+github-actions[bot]@users.noreply.github.com -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | */ConfigDumpInfo.xml 3 | 4 | build/ 5 | build 6 | 7 | # compiled output 8 | dist 9 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Ilya Bushin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Swagger для 1С:Предприятия 8 2 | 3 | [![OpenYellow](https://img.shields.io/endpoint?url=https://openyellow.org/data/badges/2/304872931.json)](https://openyellow.org/grid?data=top&repo=304872931) 4 | 5 | Данный продукт предназначен для организации процесса документирования HTTP сервисов конфигураций написанных на платформе 1С:Предприятие. 6 | ![image](https://github.com/zerobig/swagger-1c/blob/master/docs/static/screenshot_1.png) 7 | 8 | Кроме swagger-ui для визуализации API могут использоваться следующие решения: 9 | 10 |
11 | ReDoc 12 | 13 |
14 | 15 |
16 | Scalar 17 | 18 |
19 | 20 |
21 | Stoplight 22 | 23 |
24 | 25 |
26 | RapiDoc 27 | 28 |
29 | 30 | Для того чтобы переключиться на желаемую библиотеку в строке запроса надо добавить параметр: 31 | ``` 32 | /swagger/index.html?ui=scalar 33 | ``` 34 | 35 | ## Состав репозитория 36 | 37 | + swagger - расширение конфигурации реализующее функциональность создания документации 38 | + swagger-test - расширение для тестирования 39 | 40 | ## Порядок установки 41 | 42 | В режиме конфигуратора создать расширение и выполнить загрузку конфигурации из файлов, указав при этом каталог swagger. 43 | 44 | ## Документация 45 | 46 | Документация находится по адресу [https://zerobig.github.io/swagger-1c/](https://zerobig.github.io/swagger-1c/). Наполнение продолжается. 47 | 48 | ## Запуск 49 | 50 | Опубликовать базу 1С:Предприятия на web-сервере. Обязательно проконтролировать, что cтоит настройка публикации "Публиковать HTTP сервисы расширений по умолчанию". Возможно после публикации или изменения настроек публикации потребуется перезапуск web-сервера. Открыть в браузере страницу http://<Адрес_опубликованной_базы_1С_Предприятия>/hs/swagger/index.html 51 | 52 | ## Создание описаний для своих HTTP сервисов 53 | 54 | Поиск описаний происходит среди общих модулей. Наименование общего модуля должно быть построено по шаблону: "<Наименование_HTTP_сервиса>Описание". 55 | 56 | Пример создания описания можно посмотреть: 57 | 58 | + swagger-test\CommonModules\SwagTest_Тестовый_HTTPСервисОписание 59 | + swagger-test\CommonModules\ПередачаДанныхОписание 60 | 61 | ## Проверка входящих (запросов) и исходящих (ответов) 62 | 63 | Реализовано через вызов обёрток "ПроверитьПараметры" и "ПроверитьОтвет" соответственно. 64 | 65 | Для проверки входящих параметров: 66 | 67 | ```BSL 68 | РезультатПроверкиПараметров = Swag_ОбработкаHTTP.ПроверитьПараметры("SwagTest_Тестовый_HTTPСервис", "ТестовыйGET", Запрос); 69 | Если Не ПустаяСтрока(РезультатПроверкиПараметров) Тогда 70 | Возврат Swag_ОбработкаHTTP.ПолучитьОтветОшибки(РезультатПроверкиПараметров, Истина); 71 | КонецЕсли; 72 | ``` 73 | 74 | Для проверки ответа: 75 | 76 | ```BSL 77 | Возврат Swag_ОбработкаHTTP.ПроверитьОтвет("SwagTest_Тестовый_HTTPСервис", "ТестовыйGET", Ответ); 78 | ``` 79 | 80 | | Функциональность | Статус | Обсуждение | 81 | | ----------------------------------------- |:-------------:| ---------- | 82 | | Наличие описания в запросах | Запланировано | | 83 | | Входящие параметры GET запросов | Запланировано | | 84 | | Входящие параметры POST запросов | Запланировано | | 85 | | Наличие описания в ответах | Реализовано | | 86 | | Наличие и соответствие кода ответа | Реализовано | | 87 | | Наличие и соответствие типа MIME в ответе | Реализовано | | 88 | | Исходящие параметры | Запланировано | | 89 | | Статический swagger.json | В работе | [Ссылка](https://github.com/zerobig/swagger-1c/issues/1) | 90 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Website 2 | 3 | This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. 4 | 5 | ### Installation 6 | 7 | ``` 8 | $ yarn 9 | ``` 10 | 11 | ### Local Development 12 | 13 | ``` 14 | $ yarn start 15 | ``` 16 | 17 | This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. 18 | 19 | ### Build 20 | 21 | ``` 22 | $ yarn build 23 | ``` 24 | 25 | This command generates static content into the `build` directory and can be served using any static contents hosting service. 26 | 27 | ### Deployment 28 | 29 | Using SSH: 30 | 31 | ``` 32 | $ USE_SSH=true yarn deploy 33 | ``` 34 | 35 | Not using SSH: 36 | 37 | ``` 38 | $ GIT_USER= yarn deploy 39 | ``` 40 | 41 | If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. 42 | -------------------------------------------------------------------------------- /docs/docs/getting-started/descriptions.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 0 3 | tags: [Начало] 4 | --- 5 | 6 | # Создание описаний для HTTP сервисов 7 | 8 | Поиск описаний происходит среди общих модулей. Наименование общего модуля должно быть построено по шаблону: "<Наименование_HTTP_сервиса>Описание". 9 | 10 | ![image](../../static/img/description.png) 11 | 12 | ## Обязательные функции 13 | 14 | В общем модуле должны быть две экспортные функции. Первая: 15 | ```bsl 16 | Функция ПолучитьОбъектыHTTPСервиса() Экспорт 17 | 18 | Объекты = Новый Массив; 19 | 20 | ... 21 | 22 | Возврат Объекты; 23 | 24 | КонецФункции 25 | ``` 26 | для описания объектов принимаемых и возвращаемых HTTP-сервисами. И вторая: 27 | ```bsl 28 | Функция ПолучитьОписаниеHTTPСервиса() Экспорт 29 | 30 | Методы = Новый Массив; 31 | 32 | ... 33 | 34 | Возврат Методы; 35 | 36 | КонецФункции 37 | ``` 38 | для, соответственно, описания методов HTTP-сервисов. 39 | 40 | ## Опциональная функция 41 | 42 | :::info 43 | 44 | Данный функционал добавлен в версии 1.2.4. 45 | 46 | ::: 47 | 48 | HTTP-сервис можно скрыть из описания: 49 | 50 | ```bsl 51 | Функция ОбщиеНастройки() Экспорт 52 | 53 | Возврат Новый Структура("НеОтображать", Истина); 54 | 55 | КонецФункции 56 | ``` 57 | 58 | и задать описание из кода: 59 | 60 | ```bsl 61 | Функция ОбщиеНастройки() Экспорт 62 | 63 | Возврат Новый Структура("Описание", "Пример описания из кода. Пример гиперссылки в описании: example.com"); 64 | 65 | КонецФункции 66 | ``` 67 | 68 | Если в функции ОбщиеНастройки описание не задано, то оно берётся из комментария HTTP-сервиса 69 | 70 | ## Групповое отключение отображения HTTP-сервисов в описании 71 | 72 | :::info 73 | 74 | Данный функционал добавлен в версии 1.2.6. 75 | 76 | ::: 77 | 78 | При формировании описания HTTP-сервисов производится поиск общего модуля ```SwaggerОбщиеНастройки``` и в нём вызывается функция ```ПолучитьОбщиеНастройки```. Функция должна возвращать структуру вида: 79 | 80 | ```bsl 81 | Функция ПолучитьОбщиеНастройки() Экспорт 82 | 83 | МассивНеотображаемыхСервисов= Новый Массив; 84 | МассивНеотображаемыхСервисов.Добавить("Exchange"); 85 | МассивНеотображаемыхСервисов.Добавить("ПередачаДанных"); 86 | МассивНеотображаемыхСервисов.Добавить("ЭДО"); 87 | 88 | Возврат Новый Структура("МассивНеотображаемыхСервисов", МассивНеотображаемыхСервисов); 89 | 90 | КонецФункции 91 | ``` 92 | -------------------------------------------------------------------------------- /docs/docs/getting-started/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_label: "Начало работы" 3 | sidebar_position: 0 4 | --- 5 | 6 | # Начало работы 7 | 8 | ## Установка 9 | 10 | Скачать последнюю версию расширения из [releases](https://github.com/zerobig/swagger-1c/releases) и установить в информационную базу. 11 | 12 | ## Публикация 13 | 14 | Опубликовать базу 1С:Предприятия на web-сервере. Обязательно проконтролировать, что cтоит настройка публикации "Публиковать HTTP сервисы расширений по умолчанию". Возможно после публикации или изменения настроек публикации потребуется перезапуск web-сервера. 15 | 16 | ## Запуск 17 | 18 | Открыть в браузере страницу http://≶Адрес_опубликованной_базы_1С_Предприятия>/hs/swagger/index.html 19 | 20 | ## Использование интерфейсов отличных от swagger-ui 21 | 22 | Кроме swagger-ui для визуализации API могут использоваться следующие решения: 23 | 24 | * ReDoc 25 | * Scalar 26 | * Stoplight 27 | * RapiDoc 28 | 29 | Для того чтобы переключиться на желаемую библиотеку в строке запроса надо добавить параметр: 30 | ``` 31 | /swagger/index.html?ui=scalar 32 | ``` 33 | -------------------------------------------------------------------------------- /docs/docs/getting-started/input_control.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 5 3 | tags: [Начало] 4 | --- 5 | 6 | # Контроль входящих данных методов 7 | -------------------------------------------------------------------------------- /docs/docs/getting-started/methods_func_style.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | tags: [Начало] 4 | --- 5 | 6 | # Описание HTTP методов 7 | 8 | Пример описания метода в функциональном стиле: 9 | 10 | ```bsl 11 | МассивОписанийМетодов = Swag_Описание 12 | .Метод("ТестовыйGET") 13 | .ОписаниеМетода("Получение данных из 1С") 14 | .ПараметрURL("Версия") 15 | .ОписаниеПараметра("Версия метода") 16 | .ЗначениеПеречисления("1.0") 17 | .ЗначениеПеречисления("2.0") 18 | .Ответ(200) 19 | .ОписаниеОтвета("Success") 20 | .Сформировать() 21 | ; 22 | ``` 23 | 24 | ## Наименование метода 25 | 26 | Наименование метода формируется по принципу: 27 | 28 | ![Формирование наименования метода](../../static/img/method-name.png) 29 | 30 | ## Текстовое описание метода 31 | 32 | ### Основное описание (summary) 33 | 34 | ```bsl 35 | МассивОписанийМетодов = Swag_Описание 36 | .Метод("ТестовыйGET") 37 | .ОписаниеМетода("Получение данных из 1С") 38 | .Сформировать() 39 | ; 40 | ``` 41 | 42 | ### Дополнительное описание (description) 43 | 44 | :::info 45 | 46 | Данный функционал добавлен в версии 1.2.4. 47 | 48 | ::: 49 | 50 | ```bsl 51 | МассивОписанийМетодов = Swag_Описание 52 | .Метод("ТестовыйGET") 53 | .ДополнительноеОписаниеМетода("В дополнительном описании можно вставлять гиперссылки example.com") 54 | .Сформировать() 55 | ; 56 | ``` 57 | 58 | ## Входящие параметры 59 | 60 | Параметры метода можно передать четыремя разными способами: 61 | 62 | ### Параметры URL 63 | 64 | для URL ```/{Версия}/test``` 65 | ```http 66 | GET /1.0/test HTTP/1.1 67 | Host: example.com 68 | ``` 69 | 70 | ```bsl 71 | МассивОписанийМетодов = Swag_Описание 72 | .Метод("ТестовыйGET") 73 | .ПараметрURL("Версия") 74 | .Сформировать() 75 | ; 76 | ``` 77 | 78 | ### Параметры запроса 79 | 80 | ```http 81 | GET /test?version=1.0 HTTP/1.1 82 | Host: example.com 83 | ``` 84 | 85 | ```bsl 86 | МассивОписанийМетодов = Swag_Описание 87 | .Метод("ТестовыйGET") 88 | .ПараметрЗапроса("version") 89 | .Сформировать() 90 | ; 91 | ``` 92 | 93 | ### Заголовки 94 | 95 | ```http 96 | GET /test HTTP/1.1 97 | Host: example.com 98 | X-Api-Version: 1.0 99 | ``` 100 | 101 | ```bsl 102 | МассивОписанийМетодов = Swag_Описание 103 | .Метод("ТестовыйGET") 104 | .ПараметрЗаголовка("X-Api-Version") 105 | .Сформировать() 106 | ; 107 | ``` 108 | 109 | ### Форму 110 | 111 | ```http 112 | POST /test HTTP/1.1 113 | Host: example.com 114 | Content-Type: application/x-www-form-urlencoded; charset=utf-8 115 | Content-Length: 11 116 | version=1.0 117 | ``` 118 | 119 | ```bsl 120 | МассивОписанийМетодов = Swag_Описание 121 | .Метод("ТестовыйPOST") 122 | .ПараметрФормы("version") 123 | .Сформировать() 124 | ; 125 | ``` 126 | 127 | ### Дополнительные описания параметров 128 | 129 | #### Обязательный 130 | 131 | ```bsl 132 | МассивОписанийМетодов = Swag_Описание 133 | .Метод("ТестовыйGET") 134 | .ПараметрЗапроса("version") 135 | // highlight-next-line 136 | .Обязательный() 137 | .Сформировать() 138 | ; 139 | ``` 140 | 141 | #### Минимальная и максимальная длина 142 | 143 | :::info 144 | 145 | В swagger-ui информация о длине параметров не отображается. Зато в других интерфейсах (redoc, rapidoc, scalar и stoplight) корректно. 146 | 147 | ::: 148 | 149 | ```bsl 150 | МассивОписанийМетодов = Swag_Описание 151 | .Метод("ТестовыйGET") 152 | .ПараметрЗапроса("version") 153 | // highlight-start 154 | .МинимальнаяДлина(10) 155 | .МаксимальнаяДлина(255) 156 | // highlight-end 157 | .Сформировать() 158 | ; 159 | ``` 160 | 161 | #### Перечисление 162 | 163 | ```bsl 164 | МассивОписанийМетодов = Swag_Описание 165 | .Метод("ТестовыйGET") 166 | .ПараметрЗапроса("version") 167 | // highlight-start 168 | .ЗначениеПеречисления("1.0") 169 | .ЗначениеПеречисления("2.0") 170 | // highlight-end 171 | .Сформировать() 172 | ; 173 | ``` 174 | 175 | ### Передача в запрос тела запроса 176 | 177 | :::info 178 | 179 | Стандарт HTTP никак не регламентирует передачу тела запроса в зависимости от метода. Но скорее всего при методе GET web-сервер проигнорирует переданное тело. 180 | 181 | ::: 182 | 183 | ```bsl 184 | МассивОписанийМетодов = Swag_Описание 185 | .Метод("ТестовыйPOST") 186 | .ОписаниеМетода("Отправка данных в 1С") 187 | .Тело() 188 | .ТипТела("application/json") 189 | .СхемаТела("ТестовыйОбъект") 190 | .Сформировать() 191 | ; 192 | ``` 193 | 194 | ## Исходящие данные 195 | 196 | Данные возвращаемые HTTP-сервисом формируются из комбинации кода ответа, MIME-типа и описания возвращаемого объекта или массива. 197 | 198 | ```bsl 199 | МассивОписанийМетодов = Swag_Описание 200 | .Метод("ТестовыйGET") 201 | // Код ответа 202 | .Ответ(200) 203 | .ОписаниеОтвета("Success") 204 | // MIME-тип ответа 205 | .ТипОтвета("application/json") 206 | // Схема объекта в ответе 207 | .СхемаОтвета("ТестовыйОбъект") 208 | .Сформировать() 209 | ; 210 | ``` 211 | -------------------------------------------------------------------------------- /docs/docs/getting-started/objects_func_style.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | tags: [Начало] 4 | --- 5 | 6 | # Описание объектов 7 | 8 | ## Общий пример 9 | 10 | Методы HTTP-сервисов принимают и/или возвращают объекты или массивы объектов. Каждый объект содержит в себе поля. Описания объектов предназначены для того чтобы зафиксировать в документации состав, типы, описания и другие параметры этих полей. 11 | 12 | В общем случае объект в функциональном стиле можно описать так: 13 | 14 | ```bsl 15 | Объекты = Swag_Описание 16 | .Объект("ОбъектПартнер") 17 | .Свойство("Идентификатор") 18 | .Описание("Идентификатор партнера из 1С") 19 | .ТипЗначения("string") 20 | .Пример("a188a1a4-32fd-4d9e-a54c-89939b7bfdf6") 21 | .Свойство("Наименование") 22 | .ТипЗначения("string") 23 | .Пример("ООО ""СтройТехМонтаж""") 24 | .Свойство("ЭтоПокупатель") 25 | .ТипЗначения("boolean") 26 | .Пример(Истина) 27 | .Свойство("ОсновнойДоговор") 28 | .ТипЗначения("object") 29 | .Схема("ОбъектДоговор") 30 | .Свойство("Адреса") 31 | .ТипЗначения("array") 32 | .Схема("ОбъектАдрес") 33 | // 34 | .Объект("ОбъектДоговор") 35 | .Свойство("Идентификатор") 36 | .Описание("Идентификатор договора из 1С") 37 | .ТипЗначения("string") 38 | .Пример("8f80d9d3-730a-4b8f-82a5-4ff52960691e") 39 | .Свойство("Номер") 40 | .Описание("Номер договора") 41 | .ТипЗначения("string") 42 | .Пример("00УТ-007645") 43 | // 44 | .Объект("ОбъектАдрес") 45 | .Свойство("Адрес") 46 | .Описание("Адрес строкой") 47 | .ТипЗначения("string") 48 | .Пример("Москва, Ленинский проспект, дом 4, строение 1А, квартира 10") 49 | .Сформировать() 50 | ; 51 | ``` 52 | результат подобного описания будет такой: 53 | ```json 54 | { 55 | "Идентификатор": "a188a1a4-32fd-4d9e-a54c-89939b7bfdf6", 56 | "Наименование": "ООО \"СтройТехМонтаж\"", 57 | "ЭтоПокупатель": true, 58 | "ОсновнойДоговор": { 59 | "Идентификатор": "8f80d9d3-730a-4b8f-82a5-4ff52960691e", 60 | "Номер": "00УТ-007645" 61 | }, 62 | "Адреса": [ 63 | { 64 | "Адрес": "Москва, Ленинский проспект, дом 4, строение 1А, квартира 10" 65 | } 66 | ] 67 | } 68 | ``` 69 | В данном примере было создано три объекта: ```ОбъектПартнер```, ```ОбъектДоговор``` и ```ОбъектАдрес```. Последние два были использованы при описании объекта ```ОбъектПартнер```. 70 | 71 | ## Другие возможные модификаторы свойств 72 | 73 | ```bsl 74 | Объекты = Swag_Описание 75 | .Объект("ОбъектПартнер") 76 | .Свойство("Наименование") 77 | .ТипЗначения("string") 78 | .Пример("ООО ""СтройТехМонтаж""") 79 | // highlight-start 80 | .МинимальнаяДлина(1) 81 | .МаксимальнаяДлина(255) 82 | // highlight-end 83 | .Свойство("СуммаПродаж") 84 | .ТипЗначения("integer") 85 | .Пример(123.45) 86 | // highlight-start 87 | .Обязательный() 88 | .ФорматЗначения("int64") 89 | .Минимум(10) 90 | .Максимум(1000) 91 | .НеВключаяМинимум() 92 | .НеВключаяМаксимум() 93 | .ПоУмолчанию(20) 94 | // highlight-end 95 | .Сформировать() 96 | ; 97 | ``` 98 | -------------------------------------------------------------------------------- /docs/docs/getting-started/objects_proc_style.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | tags: [Начало] 4 | --- 5 | 6 | # Описание объектов (процедурный стиль) 7 | 8 | :::warning 9 | 10 | В версии 1.2.5 был сделан рефакторинг после которого устарела функция ```Swag_ФормированиеОписаний.ОписаниеСвойстваОбъекта```. Вместо неё теперь рекомендуется использовать ```Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта```. 11 | 12 | ::: 13 | 14 | Тот же пример из предыдущего раздела можно описать в процедурном стиле: 15 | 16 | ```bsl 17 | // 18 | РеквизитИдентификаторПартнера = Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("Идентификатор", "string"); 19 | РеквизитИдентификаторПартнера.Описание = "Идентификатор партнера из 1С"; 20 | РеквизитИдентификаторПартнера.Пример = "a188a1a4-32fd-4d9e-a54c-89939b7bfdf6"; 21 | 22 | РеквизитНаименованиеПартнера = Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("Наименование", "string"); 23 | РеквизитНаименованиеПартнера.Пример = "ООО ""СтройТехМонтаж"""; 24 | 25 | РеквизитЭтоПокупательПартнера = Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("ЭтоПокупатель", "boolean"); 26 | РеквизитЭтоПокупательПартнера.Пример = Истина; 27 | 28 | СвойстваОбъектаПартнер = Новый Массив; 29 | СвойстваОбъектаПартнер.Добавить(РеквизитИдентификаторПартнера); 30 | СвойстваОбъектаПартнер.Добавить(РеквизитНаименованиеПартнера); 31 | СвойстваОбъектаПартнер.Добавить(РеквизитЭтоПокупательПартнера); 32 | СвойстваОбъектаПартнер.Добавить(Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("ОсновнойДоговор", "object", "ОбъектДоговор")); 33 | СвойстваОбъектаПартнер.Добавить(Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("Адреса", "array", "ОбъектАдрес")); 34 | 35 | // 36 | РеквизитИдентификаторДоговора = Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("Идентификатор", "string"); 37 | РеквизитИдентификаторДоговора.Описание = "Идентификатор договора из 1С"; 38 | РеквизитИдентификаторДоговора.Пример = "8f80d9d3-730a-4b8f-82a5-4ff52960691e"; 39 | 40 | РеквизитНомераДоговора = Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("Номер", "string"); 41 | РеквизитНомераДоговора.Пример = "00УТ-007645"; 42 | 43 | СвойстваОбъектаДоговор = Новый Массив; 44 | СвойстваОбъектаДоговор.Добавить(РеквизитИдентификаторДоговора); 45 | СвойстваОбъектаДоговор.Добавить(РеквизитНомераДоговора); 46 | 47 | // 48 | РеквизитАдреса = Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("Номер", "string"); 49 | РеквизитАдреса.Пример = "Москва, Ленинский проспект, дом 4, строение 1А, квартира 10"; 50 | 51 | СвойстваОбъектаАдрес = Новый Массив; 52 | СвойстваОбъектаАдрес.Добавить(РеквизитАдреса); 53 | 54 | // 55 | Объекты = Новый Массив; 56 | Объекты.Добавить(Swag_ФормированиеОписаний.ОписаниеОбъекта("ОбъектПартнер", "object", СвойстваОбъектаПартнер)); 57 | Объекты.Добавить(Swag_ФормированиеОписаний.ОписаниеОбъекта("ОбъектДоговор", "object", СвойстваОбъектаДоговор)); 58 | Объекты.Добавить(Swag_ФормированиеОписаний.ОписаниеОбъекта("ОбъектАдрес", "object", СвойстваОбъектаАдрес)); 59 | 60 | Возврат Объекты; 61 | ``` 62 | -------------------------------------------------------------------------------- /docs/docs/getting-started/static_swagger_json.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 10 3 | tags: [Начало] 4 | --- 5 | 6 | # Статический swagger.json 7 | 8 | :::info 9 | 10 | Эта статья о планируемом функционале. В текущей рабочей версии эти функции пока ещё отсутствуют. 11 | 12 | ::: 13 | 14 | ## Доводы "за" и "против" 15 | 16 | ### Плюсы 17 | 18 | * Описания объектов и методов находятся в том же модуле что и сам код этих методов - модуле HTTP-сервиса. Не требуется разыскивать отдельные общие модули и переключаться между модулями при описании. 19 | * Описание пишется не кодом, а при помощи комментариев. Так что формировать описание может не программист, а кто-то из команды с меньшей квалификацией. 20 | * Описание формируется не динамически, а берётся из заранее скомпилированного файла. Что снижает время открытия описания (особенно для больших API) и снижает нагрузку на сервер 1С: Предприятия. 21 | 22 | ### Минусы 23 | 24 | * Требуются дополнительные действия чтобы скомпилировать файл описания и поместить его в рабочую базу. Это возможно автоматизировать во время сборки при помощи скриптов. 25 | * Для создания комментариев с описаниями объектов и методов требуется изучить специализированный формат написания таких комментариев. В принципе, он не сильно сложен, но всё равно требует от создателя описаний определённых усилий по соблюдению формата. 26 | 27 | ## Формат описаний объектов и методов 28 | 29 | 30 | 31 | ## Создание (компиляция) файла swagger.json 32 | 33 | 34 | ## Скрипты для автоматизации 35 | -------------------------------------------------------------------------------- /docs/docusaurus.config.ts: -------------------------------------------------------------------------------- 1 | import {themes as prismThemes} from 'prism-react-renderer'; 2 | import type {Config} from '@docusaurus/types'; 3 | import type * as Preset from '@docusaurus/preset-classic'; 4 | 5 | // This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) 6 | 7 | const config: Config = { 8 | title: 'Swagger для 1С:Предприятия 8', 9 | tagline: 'Dinosaurs are cool', 10 | favicon: 'img/favicon.ico', 11 | 12 | // Set the production url of your site here 13 | url: 'https://zerobig.github.io', 14 | // Set the // pathname under which your site is served 15 | // For GitHub pages deployment, it is often '//' 16 | baseUrl: '/swagger-1c', 17 | 18 | // GitHub pages deployment config. 19 | // If you aren't using GitHub pages, you don't need these. 20 | organizationName: 'zerobig', // Usually your GitHub org/user name. 21 | projectName: 'swagger-1c', // Usually your repo name. 22 | 23 | onBrokenLinks: 'throw', 24 | onBrokenMarkdownLinks: 'warn', 25 | 26 | // Even if you don't use internationalization, you can use this field to set 27 | // useful metadata like html lang. For example, if your site is Chinese, you 28 | // may want to replace "en" with "zh-Hans". 29 | i18n: { 30 | defaultLocale: 'ru', 31 | locales: ['ru'], 32 | }, 33 | 34 | presets: [ 35 | [ 36 | 'classic', 37 | { 38 | docs: { 39 | sidebarPath: './sidebars.ts', 40 | // Please change this to your repo. 41 | // Remove this to remove the "edit this page" links. 42 | editUrl: 43 | 'https://github.com/zerobig/swagger-1c/tree/main/packages/create-docusaurus/templates/shared/', 44 | }, 45 | theme: { 46 | customCss: './src/css/custom.css', 47 | }, 48 | } satisfies Preset.Options, 49 | ], 50 | ], 51 | 52 | themeConfig: { 53 | // Replace with your project's social card 54 | navbar: { 55 | title: 'Swagger для 1С:Предприятия 8', 56 | logo: { 57 | alt: 'Логотип', 58 | src: 'img/logo.webp', 59 | }, 60 | items: [ 61 | { 62 | type: 'doc', 63 | docId: 'getting-started/index', 64 | position: 'left', 65 | label: 'Начало работы', 66 | }, 67 | { 68 | href: 'https://github.com/zerobig/swagger-1c', 69 | label: 'GitHub', 70 | position: 'right', 71 | }, 72 | ], 73 | }, 74 | footer: { 75 | style: 'dark', 76 | links: [ 77 | { 78 | title: 'Документация', 79 | items: [ 80 | { 81 | label: 'Начало', 82 | to: '/docs/getting-started', 83 | }, 84 | ], 85 | }, 86 | { 87 | title: 'Обратная связь', 88 | items: [ 89 | { 90 | label: 'Stack Overflow', 91 | href: 'https://stackoverflow.com/questions/tagged/swagger-1c', 92 | }, 93 | { 94 | label: 'GitHub Issues', 95 | href: 'https://github.com/zerobig/swagger-1c/issues', 96 | }, 97 | ], 98 | }, 99 | { 100 | title: 'Ещё', 101 | items: [ 102 | { 103 | label: 'GitHub', 104 | href: 'https://github.com/zerobig/swagger-1c', 105 | }, 106 | ], 107 | }, 108 | ], 109 | copyright: `Copyright © ${new Date().getFullYear()} Бушин Илья. Built with Docusaurus.`, 110 | }, 111 | prism: { 112 | theme: prismThemes.github, 113 | darkTheme: prismThemes.dracula, 114 | additionalLanguages: ['bsl', 'json', 'http'], 115 | }, 116 | } satisfies Preset.ThemeConfig, 117 | }; 118 | 119 | export default config; 120 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "doc", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "docusaurus": "docusaurus", 7 | "start": "docusaurus start", 8 | "build": "docusaurus build", 9 | "swizzle": "docusaurus swizzle", 10 | "deploy": "docusaurus deploy", 11 | "clear": "docusaurus clear", 12 | "serve": "docusaurus serve", 13 | "write-translations": "docusaurus write-translations", 14 | "write-heading-ids": "docusaurus write-heading-ids", 15 | "typecheck": "tsc" 16 | }, 17 | "dependencies": { 18 | "@docusaurus/core": "3.6.1", 19 | "@docusaurus/preset-classic": "3.6.1", 20 | "@mdx-js/react": "^3.0.0", 21 | "clsx": "^2.0.0", 22 | "prism-react-renderer": "^2.3.0", 23 | "react": "^18.0.0", 24 | "react-dom": "^18.0.0" 25 | }, 26 | "devDependencies": { 27 | "@docusaurus/module-type-aliases": "3.6.1", 28 | "@docusaurus/tsconfig": "3.6.1", 29 | "@docusaurus/types": "3.6.1", 30 | "typescript": "~5.6.2" 31 | }, 32 | "browserslist": { 33 | "production": [ 34 | ">0.5%", 35 | "not dead", 36 | "not op_mini all" 37 | ], 38 | "development": [ 39 | "last 3 chrome version", 40 | "last 3 firefox version", 41 | "last 5 safari version" 42 | ] 43 | }, 44 | "engines": { 45 | "node": ">=18.0" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /docs/sidebars.ts: -------------------------------------------------------------------------------- 1 | import type {SidebarsConfig} from '@docusaurus/plugin-content-docs'; 2 | 3 | // This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) 4 | 5 | /** 6 | * Creating a sidebar enables you to: 7 | - create an ordered group of docs 8 | - render a sidebar for each doc of that group 9 | - provide next/previous navigation 10 | 11 | The sidebars can be generated from the filesystem, or explicitly defined here. 12 | 13 | Create as many sidebars as you want. 14 | */ 15 | const sidebars: SidebarsConfig = { 16 | // By default, Docusaurus generates a sidebar from the docs folder structure 17 | tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], 18 | 19 | // But you can create a sidebar manually 20 | /* 21 | tutorialSidebar: [ 22 | 'intro', 23 | 'hello', 24 | { 25 | type: 'category', 26 | label: 'Tutorial', 27 | items: ['tutorial-basics/create-a-document'], 28 | }, 29 | ], 30 | */ 31 | }; 32 | 33 | export default sidebars; 34 | -------------------------------------------------------------------------------- /docs/src/css/custom.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Any CSS included here will be global. The classic template 3 | * bundles Infima by default. Infima is a CSS framework designed to 4 | * work well for content-centric websites. 5 | */ 6 | 7 | /* You can override the default Infima variables here. */ 8 | :root { 9 | --ifm-color-primary: #2e8555; 10 | --ifm-color-primary-dark: #29784c; 11 | --ifm-color-primary-darker: #277148; 12 | --ifm-color-primary-darkest: #205d3b; 13 | --ifm-color-primary-light: #33925d; 14 | --ifm-color-primary-lighter: #359962; 15 | --ifm-color-primary-lightest: #3cad6e; 16 | --ifm-code-font-size: 95%; 17 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); 18 | } 19 | 20 | /* For readability concerns, you should choose a lighter palette in dark mode. */ 21 | [data-theme='dark'] { 22 | --ifm-color-primary: #25c2a0; 23 | --ifm-color-primary-dark: #21af90; 24 | --ifm-color-primary-darker: #1fa588; 25 | --ifm-color-primary-darkest: #1a8870; 26 | --ifm-color-primary-light: #29d5b0; 27 | --ifm-color-primary-lighter: #32d8b4; 28 | --ifm-color-primary-lightest: #4fddbf; 29 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); 30 | } 31 | -------------------------------------------------------------------------------- /docs/src/pages/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 0 3 | slug: / 4 | --- 5 | 6 | # Swagger для 1С:Предприятия 8 7 | 8 | Данный продукт предназначен для организации процесса документирования HTTP сервисов конфигураций написанных на платформе 1С:Предприятие. 9 | ![image](../../static/screenshot_1.png) 10 | 11 | Кроме swagger-ui для визуализации API могут использоваться следующие решения: 12 | 13 | * ReDoc 14 | * Scalar 15 | * Stoplight 16 | * RapiDoc 17 | 18 | Для того чтобы переключиться на желаемую библиотеку в строке запроса надо добавить параметр: 19 | ``` 20 | /swagger/index.html?ui=scalar 21 | ``` 22 | -------------------------------------------------------------------------------- /docs/static/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zerobig/swagger-1c/298469edd4c9dcedbc704e0f252795f91361690c/docs/static/.nojekyll -------------------------------------------------------------------------------- /docs/static/img/description.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zerobig/swagger-1c/298469edd4c9dcedbc704e0f252795f91361690c/docs/static/img/description.png -------------------------------------------------------------------------------- /docs/static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zerobig/swagger-1c/298469edd4c9dcedbc704e0f252795f91361690c/docs/static/img/favicon.ico -------------------------------------------------------------------------------- /docs/static/img/logo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zerobig/swagger-1c/298469edd4c9dcedbc704e0f252795f91361690c/docs/static/img/logo.webp -------------------------------------------------------------------------------- /docs/static/img/method-name.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zerobig/swagger-1c/298469edd4c9dcedbc704e0f252795f91361690c/docs/static/img/method-name.png -------------------------------------------------------------------------------- /docs/static/rapidoc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zerobig/swagger-1c/298469edd4c9dcedbc704e0f252795f91361690c/docs/static/rapidoc.png -------------------------------------------------------------------------------- /docs/static/redoc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zerobig/swagger-1c/298469edd4c9dcedbc704e0f252795f91361690c/docs/static/redoc.png -------------------------------------------------------------------------------- /docs/static/scalar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zerobig/swagger-1c/298469edd4c9dcedbc704e0f252795f91361690c/docs/static/scalar.png -------------------------------------------------------------------------------- /docs/static/screenshot_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zerobig/swagger-1c/298469edd4c9dcedbc704e0f252795f91361690c/docs/static/screenshot_1.png -------------------------------------------------------------------------------- /docs/static/stoplight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zerobig/swagger-1c/298469edd4c9dcedbc704e0f252795f91361690c/docs/static/stoplight.png -------------------------------------------------------------------------------- /docs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // This file is not used in compilation. It is here just for a nice editor experience. 3 | "extends": "@docusaurus/tsconfig", 4 | "compilerOptions": { 5 | "baseUrl": "." 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "swagger-1c", 3 | "version": "1.2.6", 4 | "scripts": { 5 | "build": "npm run build:extension && npm run build:test", 6 | "build:extension": "cd scripts && ext2cfe.cmd ../swagger ../dist/swagger.cfe Swagger", 7 | "build:test": "cd scripts && ext2cfe.cmd ../swagger-test ../dist/swagger-test.cfe SwaggerTest" 8 | }, 9 | "keywords": [], 10 | "author": "Bushin Ilya", 11 | "license": "MIT" 12 | } -------------------------------------------------------------------------------- /scripts/.env: -------------------------------------------------------------------------------- 1 | V8_VERSION=8.3.25.1394 -------------------------------------------------------------------------------- /scripts/ext2cfe.cmd: -------------------------------------------------------------------------------- 1 | @rem ---------------------------------------------------------- 2 | @rem This Source Code Form is subject to the terms of the 3 | @rem Mozilla Public License, v.2.0. If a copy of the MPL 4 | @rem was not distributed with this file, You can obtain one 5 | @rem at http://mozilla.org/MPL/2.0/. 6 | @rem ---------------------------------------------------------- 7 | @rem Codebase: https://github.com/ArKuznetsov/1CFilesConverter/ 8 | @rem ---------------------------------------------------------- 9 | 10 | @ECHO OFF 11 | 12 | SETLOCAL ENABLEDELAYEDEXPANSION 13 | 14 | IF not defined V8_ENCODING set V8_ENCODING=65001 15 | chcp %V8_ENCODING% > nul 16 | 17 | set CONVERT_VERSION=UNKNOWN 18 | IF exist "%~dp0..\VERSION" FOR /F "usebackq tokens=* delims=" %%i IN ("%~dp0..\VERSION") DO set CONVERT_VERSION=%%i 19 | echo 1C files converter v.%CONVERT_VERSION% 20 | echo ====== 21 | echo [INFO] Convert 1C configuration extension to binary format ^(*.cfe^) 22 | 23 | set ERROR_CODE=0 24 | 25 | IF exist "%cd%\.env" IF "%V8_SKIP_ENV%" neq "1" ( 26 | FOR /F "usebackq tokens=*" %%a in ("%cd%\.env") DO ( 27 | FOR /F "tokens=1* delims==" %%b IN ("%%a") DO ( 28 | IF not defined %%b set "%%b=%%c" 29 | ) 30 | ) 31 | ) 32 | 33 | IF not defined V8_VERSION set V8_VERSION=8.3.23.2040 34 | IF not defined V8_TEMP set V8_TEMP=%TEMP%\1c 35 | 36 | echo [INFO] Using 1C:Enterprise, version %V8_VERSION% 37 | echo [INFO] Using temporary folder "%V8_TEMP%" 38 | 39 | IF not "%V8_CONVERT_TOOL%" equ "designer" IF not "%V8_CONVERT_TOOL%" equ "ibcmd" set V8_CONVERT_TOOL=designer 40 | IF not defined V8_TOOL set V8_TOOL="%PROGRAMW6432%\1cv8\%V8_VERSION%\bin\1cv8.exe" 41 | IF "%V8_CONVERT_TOOL%" equ "designer" IF not exist %V8_TOOL% ( 42 | echo Could not find 1C:Designer with path %V8_TOOL% 43 | set ERROR_CODE=1 44 | goto finally 45 | ) 46 | IF not defined IBCMD_TOOL set IBCMD_TOOL="%PROGRAMW6432%\1cv8\%V8_VERSION%\bin\ibcmd.exe" 47 | IF "%V8_CONVERT_TOOL%" equ "ibcmd" IF not exist %IBCMD_TOOL% ( 48 | echo Could not find ibcmd tool with path %IBCMD_TOOL% 49 | set ERROR_CODE=1 50 | goto finally 51 | ) 52 | 53 | echo [INFO] Start conversion using "%V8_CONVERT_TOOL%" 54 | 55 | set LOCAL_TEMP=%V8_TEMP%\%~n0 56 | if not defined IBCMD_DATA set IBCMD_DATA=%V8_TEMP%\ibcmd_data 57 | set IB_PATH=%LOCAL_TEMP%\tmp_db 58 | set XML_PATH=%LOCAL_TEMP%\tmp_xml 59 | set WS_PATH=%LOCAL_TEMP%\edt_ws 60 | 61 | set ARG=%1 62 | IF defined ARG set ARG=%ARG:"=% 63 | IF "%ARG%" neq "" set V8_SRC_PATH=%ARG% 64 | set ARG=%2 65 | IF defined ARG set ARG=%ARG:"=% 66 | IF "%ARG%" neq "" set V8_DST_PATH=%ARG% 67 | set V8_DST_FOLDER=%~dp2 68 | set V8_DST_FOLDER=%V8_DST_FOLDER:~0,-1% 69 | set ARG=%3 70 | IF defined ARG set ARG=%ARG:"=% 71 | IF "%ARG%" neq "" set V8_EXT_NAME=%ARG% 72 | 73 | IF not defined V8_SRC_PATH ( 74 | echo [ERROR] Missed parameter 1 - "infobase, path to folder contains 1C extension in 1C:Designer XML format or EDT project" 75 | set ERROR_CODE=1 76 | ) 77 | IF not defined V8_DST_PATH ( 78 | echo [ERROR] Missed parameter 2 - "path to 1C configuration extension file (*.cfe)" 79 | set ERROR_CODE=1 80 | ) 81 | IF not defined V8_EXT_NAME ( 82 | echo [ERROR] Missed parameter 3 - "configuration extension name" 83 | set ERROR_CODE=1 84 | ) 85 | IF %ERROR_CODE% neq 0 ( 86 | echo ====== 87 | echo [ERROR] Input parameters error. Expected: 88 | echo %%1 - infobase, path to folder contains 1C extension in 1C:Designer XML format or EDT project 89 | echo %%2 - path to 1C configuration extension file ^(*.cfe^) 90 | echo %%3 - configuration extension name 91 | echo. 92 | goto finally 93 | ) 94 | 95 | echo [INFO] Clear temporary files... 96 | IF exist "%LOCAL_TEMP%" rd /S /Q "%LOCAL_TEMP%" 97 | md "%LOCAL_TEMP%" 98 | IF not exist "%V8_DST_FOLDER%" md "%V8_DST_FOLDER%" 99 | 100 | echo [INFO] Checking 1C extension source type... 101 | 102 | IF exist "%V8_SRC_PATH%\DT-INF\" ( 103 | IF exist "%V8_SRC_PATH%\src\Configuration\Configuration.mdo" ( 104 | FOR /F "delims=" %%t IN ('find /i "" "%V8_SRC_PATH%\src\Configuration\Configuration.mdo"') DO ( 105 | echo [INFO] Source type: 1C:EDT project 106 | md "%XML_PATH%" 107 | md "%WS_PATH%" 108 | set V8_SRC_TYPE=edt 109 | goto base_ib 110 | ) 111 | ) 112 | ) 113 | IF exist "%V8_SRC_PATH%\Configuration.xml" ( 114 | FOR /F "delims=" %%t IN ('find /i "" "%V8_SRC_PATH%\Configuration.xml"') DO ( 115 | echo [INFO] Source type: 1C:Designer XML files 116 | set XML_PATH=%V8_SRC_PATH% 117 | set V8_SRC_TYPE=xml 118 | goto base_ib 119 | ) 120 | ) 121 | set V8_SRC_TYPE=ib 122 | IF /i "%V8_SRC_PATH:~0,2%" equ "/F" ( 123 | set IB_PATH=%V8_SRC_PATH:~2% 124 | echo [INFO] Basic config type: File infobase ^(!IB_PATH!^) 125 | set V8_BASE_IB_CONNECTION=File="!IB_PATH!"; 126 | goto export_ib 127 | ) 128 | IF /i "%V8_SRC_PATH:~0,2%" equ "/S" ( 129 | set IB_PATH=%V8_SRC_PATH:~2% 130 | FOR /F "tokens=1,2 delims=\" %%a IN ("!IB_PATH!") DO ( 131 | set V8_BASE_IB_SERVER=%%a 132 | set V8_BASE_IB_NAME=%%b 133 | ) 134 | set IB_PATH=!V8_BASE_IB_SERVER!\!V8_BASE_IB_NAME! 135 | echo [INFO] Basic config type: Server infobase ^(!V8_BASE_IB_SERVER!\!V8_BASE_IB_NAME!^) 136 | set V8_BASE_IB_CONNECTION=Srvr="!V8_BASE_IB_SERVER!";Ref="!V8_BASE_IB_NAME!"; 137 | IF not defined V8_DB_SRV_DBMS set V8_DB_SRV_DBMS=MSSQLServer 138 | goto export_ib 139 | ) 140 | IF exist "%V8_SRC_PATH%\1cv8.1cd" ( 141 | set IB_PATH=%V8_SRC_PATH% 142 | echo [INFO] Basic config type: File infobase ^(!V8_SRC_PATH!^) 143 | set V8_BASE_IB_CONNECTION=File="!IB_PATH!"; 144 | goto export_ib 145 | ) 146 | 147 | echo [ERROR] Wrong path "%V8_SRC_PATH%"! 148 | echo Infobase or folder containing configuration extension in 1C:Designer XML format or 1C:EDT project expected. 149 | set ERROR_CODE=1 150 | goto finally 151 | 152 | :base_ib 153 | 154 | echo [INFO] Set basic infobase for export configuration extension... 155 | 156 | IF "%V8_BASE_IB%" equ "" ( 157 | md "%IB_PATH%" 158 | echo [INFO] Using temporary file infobase "%IB_PATH%"... 159 | set V8_BASE_IB_CONNECTION=File="%IB_PATH%"; 160 | set V8_DESIGNER_LOG=%LOCAL_TEMP%\v8_designer_output.log 161 | %V8_TOOL% CREATEINFOBASE !V8_BASE_IB_CONNECTION! /DisableStartupDialogs /Out "!V8_DESIGNER_LOG!" 162 | FOR /F "tokens=* delims=" %%i IN (!V8_DESIGNER_LOG!) DO IF "%%i" neq "" echo [WARN] %%i 163 | goto prepare_ib 164 | ) 165 | IF /i "%V8_BASE_IB:~0,2%" equ "/F" ( 166 | set IB_PATH=%V8_BASE_IB:~2% 167 | echo [INFO] Basic infobase type: File infobase ^(!IB_PATH!^) 168 | set V8_BASE_IB_CONNECTION=File="!IB_PATH!"; 169 | goto prepare_ib 170 | ) 171 | IF /i "%V8_BASE_IB:~0,2%" equ "/S" ( 172 | set IB_PATH=%V8_BASE_IB:~2% 173 | FOR /F "tokens=1,2 delims=\" %%a IN ("!IB_PATH!") DO ( 174 | set V8_BASE_IB_SERVER=%%a 175 | set V8_BASE_IB_NAME=%%b 176 | ) 177 | set IB_PATH=!V8_BASE_IB_SERVER!\!V8_BASE_IB_NAME! 178 | echo [INFO] Basic infobase type: Server infobase ^(!V8_BASE_IB_SERVER!\!V8_BASE_IB_NAME!^) 179 | set V8_BASE_IB_CONNECTION=Srvr="!V8_BASE_IB_SERVER!";Ref="!V8_BASE_IB_NAME!"; 180 | IF not defined V8_DB_SRV_DBMS set V8_DB_SRV_DBMS=MSSQLServer 181 | goto prepare_ib 182 | ) 183 | IF exist "%V8_BASE_IB%\1cv8.1cd" ( 184 | set IB_PATH=%V8_BASE_IB% 185 | echo [INFO] Basic infobase type: File infobase ^(!V8_SRC_PATH!^) 186 | set V8_BASE_IB_CONNECTION=File="!IB_PATH!"; 187 | goto prepare_ib 188 | ) 189 | 190 | :prepare_ib 191 | 192 | IF defined V8_BASE_IB ( 193 | set V8_BASE_IB=%V8_BASE_IB:"=% 194 | ) ELSE ( 195 | echo [INFO] Environment variable "V8_BASE_IB" is not defined, temporary file infobase will be used. 196 | set V8_BASE_IB= 197 | ) 198 | IF defined V8_BASE_CONFIG ( 199 | set V8_BASE_CONFIG=%V8_BASE_CONFIG:"=% 200 | ) ELSE ( 201 | echo [INFO] Environment variable "V8_BASE_CONFIG" is not defined, empty configuration will be used. 202 | goto export 203 | ) 204 | 205 | IF not exist "%IB_PATH%" md "%IB_PATH%" 206 | call %~dp0conf2ib.cmd "%V8_BASE_CONFIG%" "%IB_PATH%" 207 | IF ERRORLEVEL 0 goto export 208 | 209 | echo [ERROR] Error cheking type of basic configuration "%V8_BASE_CONFIG%"! 210 | echo File or server infobase, configuration file ^(*.cf^), 1C:Designer XML, 1C:EDT project or no configuration expected. 211 | set ERROR_CODE=1 212 | goto finally 213 | 214 | :export 215 | if "%V8_SRC_TYPE%" equ "xml" ( 216 | goto load_xml 217 | ) 218 | if "%V8_SRC_TYPE%" equ "edt" ( 219 | goto export_edt 220 | ) 221 | 222 | :export_edt 223 | 224 | echo [INFO] Export configuration extension from 1C:EDT format "%V8_SRC_PATH%" to 1C:Designer XML format "%XML_PATH%"... 225 | IF not defined RING_TOOL ( 226 | FOR /F "usebackq tokens=1 delims=" %%i IN (`where ring`) DO ( 227 | set RING_TOOL="%%i" 228 | ) 229 | ) 230 | IF not defined EDTCLI_TOOL ( 231 | IF defined V8_EDT_VERSION ( 232 | IF %V8_EDT_VERSION:~0,4% lss 2024 goto checktool 233 | set EDT_MASK="%PROGRAMW6432%\1C\1CE\components\1c-edt-%V8_EDT_VERSION%*" 234 | ) ELSE ( 235 | set EDT_MASK="%PROGRAMW6432%\1C\1CE\components\1c-edt-*" 236 | ) 237 | FOR /F "tokens=*" %%d IN ('"dir /B /S !EDT_MASK! | findstr /r /i ".*1c-edt-[0-9]*\.[0-9]*\.[0-9].*""') DO ( 238 | IF exist "%%d\1cedtcli.exe" set EDTCLI_TOOL="%%d\1cedtcli.exe" 239 | ) 240 | ) 241 | 242 | :checktool 243 | 244 | IF not defined RING_TOOL IF not defined EDTCLI_TOOL ( 245 | echo [ERROR] Can't find "ring" or "edtcli" tool. Add path to "ring.bat" to "PATH" environment variable, or set "RING_TOOL" variable with full specified path to "ring.bat", or set "EDTCLI_TOOL" variable with full specified path to "1cedtcli.exe". 246 | set ERROR_CODE=1 247 | goto finally 248 | ) 249 | IF defined EDTCLI_TOOL ( 250 | echo [INFO] Start conversion using "edt cli" 251 | call %EDTCLI_TOOL% -data "%WS_PATH%" -command export --project "%V8_SRC_PATH%" --configuration-files "%XML_PATH%" 252 | ) ELSE ( 253 | echo [INFO] Start conversion using "ring" 254 | call %RING_TOOL% edt@%V8_EDT_VERSION% workspace export --project "%V8_SRC_PATH%" --configuration-files "%XML_PATH%" --workspace-location "%WS_PATH%" 255 | ) 256 | IF not ERRORLEVEL 0 ( 257 | set ERROR_CODE=%ERRORLEVEL% 258 | goto finally 259 | ) 260 | 261 | :load_xml 262 | 263 | echo [INFO] Loading configuration extension from XML-files "%XML_PATH%" to infobase "%IB_PATH%"... 264 | IF "%V8_CONVERT_TOOL%" equ "designer" ( 265 | set V8_DESIGNER_LOG=%LOCAL_TEMP%\v8_designer_output.log 266 | %V8_TOOL% DESIGNER /IBConnectionString %V8_BASE_IB_CONNECTION% /N"%V8_IB_USER%" /P"%V8_IB_PWD%" /DisableStartupDialogs /Out "!V8_DESIGNER_LOG!" /LoadConfigFromFiles "%XML_PATH%" -Extension %V8_EXT_NAME% 267 | FOR /F "tokens=* delims=" %%i IN (!V8_DESIGNER_LOG!) DO IF "%%i" neq "" echo [WARN] %%i 268 | ) ELSE ( 269 | IF defined V8_BASE_IB_SERVER ( 270 | %IBCMD_TOOL% infobase config import --data="%IBCMD_DATA%" --dbms=%V8_DB_SRV_DBMS% --db-server=%V8_BASE_IB_SERVER% --db-name="%V8_BASE_IB_NAME%" --db-user="%V8_DB_SRV_USR%" --db-pwd="%V8_DB_SRV_PWD%" --user="%V8_IB_USER%" --password="%V8_IB_PWD%" --extension=%V8_EXT_NAME% "%XML_PATH%" 271 | ) ELSE ( 272 | %IBCMD_TOOL% infobase config import --data="%IBCMD_DATA%" --db-path="%IB_PATH%" --user="%V8_IB_USER%" --password="%V8_IB_PWD%" --extension=%V8_EXT_NAME% "%XML_PATH%" 273 | ) 274 | ) 275 | IF not ERRORLEVEL 0 ( 276 | set ERROR_CODE=%ERRORLEVEL% 277 | goto finally 278 | ) 279 | 280 | :export_ib 281 | 282 | echo [INFO] Export configuration extension from infobase "%IB_PATH%" configuration to "%V8_DST_PATH%"... 283 | IF "%V8_CONVERT_TOOL%" equ "designer" ( 284 | set V8_DESIGNER_LOG=%LOCAL_TEMP%\v8_designer_output.log 285 | %V8_TOOL% DESIGNER /IBConnectionString %V8_BASE_IB_CONNECTION% /N"%V8_IB_USER%" /P"%V8_IB_PWD%" /DisableStartupDialogs /Out "!V8_DESIGNER_LOG!" /DumpCfg "%V8_DST_PATH%" -Extension %V8_EXT_NAME% 286 | FOR /F "tokens=* delims=" %%i IN (!V8_DESIGNER_LOG!) DO IF "%%i" neq "" echo [WARN] %%i 287 | ) ELSE ( 288 | IF defined V8_BASE_IB_SERVER ( 289 | %IBCMD_TOOL% infobase config save --data="%IBCMD_DATA%" --dbms=%V8_DB_SRV_DBMS% --db-server=%V8_BASE_IB_SERVER% --db-name="%V8_BASE_IB_NAME%" --db-user="%V8_DB_SRV_USR%" --db-pwd="%V8_DB_SRV_PWD%" --user="%V8_IB_USER%" --password="%V8_IB_PWD%" --extension=%V8_EXT_NAME% "%V8_DST_PATH%" 290 | ) ELSE ( 291 | %IBCMD_TOOL% infobase config save --data="%IBCMD_DATA%" --db-path="%IB_PATH%" --user="%V8_IB_USER%" --password="%V8_IB_PWD%" --extension=%V8_EXT_NAME% "%V8_DST_PATH%" 292 | ) 293 | ) 294 | set ERROR_CODE=%ERRORLEVEL% 295 | 296 | :finally 297 | 298 | echo [INFO] Clear temporary files... 299 | IF exist "%LOCAL_TEMP%" rd /S /Q "%LOCAL_TEMP%" 300 | 301 | exit /b %ERROR_CODE% 302 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/SwagTest_YAxUnit_Тесты.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | SwagTest_YAxUnit_Тесты 6 | 7 | 8 | 9 | Swag test y ax unit тесты 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/SwagTest_YAxUnit_Тесты/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 |  2 | #Область ОбъявлениеТестов 3 | 4 | Процедура ИсполняемыеСценарии() Экспорт 5 | 6 | ЮТТесты 7 | .ДобавитьТестовыйНабор("Swagger: Базовые") 8 | .ДобавитьТест("ПолучитьSwaggerФайл") 9 | .ДобавитьТестовыйНабор("Swagger: функциональное описание объекты") 10 | .ДобавитьТест("СоздатьОбъектБезСвойств") 11 | .ДобавитьТест("СоздатьСвойствоОбъекта") 12 | .ДобавитьТест("ЗадатьТипСвойстваЧисло") 13 | .ДобавитьТест("ЗадатьТипСвойстваСтрока") 14 | .ДобавитьТест("ЗадатьТипСвойстваМассивБезЗаданияТипаЭлементов") 15 | .ДобавитьТест("ЗадатьТипСвойстваМассивСТипомЭлементов") 16 | .ДобавитьТест("ЗадатьТипСвойстваРекурсивныйМассив") 17 | .ДобавитьТест("ЗадатьПример") 18 | .ДобавитьТест("ЗадатьПеречислениеСтрокой") 19 | .ДобавитьТест("ЗадатьПеречислениеЧислом") 20 | .ДобавитьТест("ЗадатьПеречислениеСтрокойДопускаетсяNull") 21 | .ДобавитьТест("ЗадатьПеречислениеБезТипа") 22 | .ДобавитьТест("ЗадатьПеречислениеБулево") 23 | .ДобавитьТестовыйНабор("Swagger: функциональное описание методы") 24 | .ДобавитьТест("СоздатьМетод") 25 | .ДобавитьТест("СоздатьМетодСОписанием") 26 | .ДобавитьТест("СоздатьМетодСОписанием") 27 | .ДобавитьТестовыйНабор("Swagger: тестовое описание") 28 | .ДобавитьТест("СоздатьМассивОбъектов") 29 | .ДобавитьТест("СоздатьМассивМетодов") 30 | ; 31 | 32 | КонецПроцедуры 33 | 34 | #КонецОбласти 35 | 36 | #Область События 37 | 38 | 39 | 40 | #КонецОбласти 41 | 42 | #Область Тесты 43 | 44 | #Область Базовые 45 | 46 | Процедура ПолучитьSwaggerФайл() Экспорт 47 | 48 | Запрос = ЮТест.Данные().HTTPСервисЗапрос(); 49 | Запрос.ПараметрыURL.Вставить("File", "swagger.json"); 50 | 51 | Результат = Swag_Запросы.ПолучитьSwaggerFileGET(Запрос); 52 | 53 | ЧтениеJSON = Новый ЧтениеJSON; 54 | ЧтениеJSON.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку()); 55 | // Читаю в соответствие т.к. у swagger.json названия полей со слэшами 56 | СоответствиеОтвета = ПрочитатьJSON(ЧтениеJSON, Истина); 57 | 58 | ЮТест.ОжидаетЧто(СоответствиеОтвета) 59 | .ИмеетТип("Соответствие") 60 | ; 61 | 62 | КонецПроцедуры 63 | 64 | #КонецОбласти 65 | 66 | #Область Объекты 67 | 68 | Процедура СоздатьОбъектБезСвойств() Экспорт 69 | 70 | МассивОбъектов = Swag_Описание.Объект("Тестовый объект") 71 | .Сформировать() 72 | ; 73 | 74 | ЮТест.ОжидаетЧто(МассивОбъектов) 75 | .ИмеетТип("Массив") 76 | .ИмеетДлину(1) 77 | .Содержит(ЮТест.Предикат() 78 | .ИмеетТип("Структура") 79 | .Свойство("Имя").Равно("Тестовый объект") 80 | .Свойство("Тип").Равно("object") 81 | ) 82 | ; 83 | 84 | КонецПроцедуры 85 | 86 | Процедура СоздатьСвойствоОбъекта() Экспорт 87 | 88 | МассивОбъектов = Swag_Описание.Объект("Тестовый объект") 89 | .Свойство("Тестовое свойство") 90 | .Сформировать() 91 | ; 92 | 93 | ЮТест.ОжидаетЧто(МассивОбъектов) 94 | .ИмеетТип("Массив") 95 | .ИмеетДлину(1) 96 | .Содержит(ЮТест.Предикат() 97 | .ИмеетТип("Структура") 98 | .Свойство("Имя").Равно("Тестовый объект") 99 | .Свойство("Тип").Равно("object") 100 | .Свойство("МассивСвойств") 101 | .ИмеетТип("Массив") 102 | .ИмеетДлину(1) 103 | .Свойство("МассивСвойств[0]") 104 | .ИмеетТип("Структура") 105 | .Свойство("МассивСвойств[0].Имя").Равно("Тестовое свойство") 106 | ) 107 | ; 108 | 109 | КонецПроцедуры 110 | 111 | Процедура ЗадатьТипСвойстваЧисло() Экспорт 112 | 113 | МассивОбъектов = Swag_Описание.Объект("Тестовый объект") 114 | .Свойство("Тестовое свойство") 115 | .ТипЗначения("integer") 116 | .Сформировать() 117 | ; 118 | 119 | ЮТест.ОжидаетЧто(МассивОбъектов) 120 | .ИмеетТип("Массив") 121 | .ИмеетДлину(1) 122 | .Содержит(ЮТест.Предикат() 123 | .ИмеетТип("Структура") 124 | .Свойство("Имя").Равно("Тестовый объект") 125 | .Свойство("Тип").Равно("object") 126 | .Свойство("МассивСвойств") 127 | .ИмеетТип("Массив") 128 | .ИмеетДлину(1) 129 | .Свойство("МассивСвойств[0]") 130 | .ИмеетТип("Структура") 131 | .Свойство("МассивСвойств[0].Имя").Равно("Тестовое свойство") 132 | .Свойство("МассивСвойств[0].Тип").Равно("integer") 133 | ) 134 | ; 135 | 136 | КонецПроцедуры 137 | 138 | Процедура ЗадатьТипСвойстваСтрока() Экспорт 139 | 140 | МассивОбъектов = Swag_Описание.Объект("Тестовый объект") 141 | .Свойство("Тестовое свойство") 142 | .ТипЗначения("string") 143 | .Сформировать() 144 | ; 145 | 146 | ЮТест.ОжидаетЧто(МассивОбъектов) 147 | .ИмеетТип("Массив") 148 | .ИмеетДлину(1) 149 | .Содержит(ЮТест.Предикат() 150 | .ИмеетТип("Структура") 151 | .Свойство("Имя").Равно("Тестовый объект") 152 | .Свойство("Тип").Равно("object") 153 | .Свойство("МассивСвойств") 154 | .ИмеетТип("Массив") 155 | .ИмеетДлину(1) 156 | .Свойство("МассивСвойств[0]") 157 | .ИмеетТип("Структура") 158 | .Свойство("МассивСвойств[0].Имя").Равно("Тестовое свойство") 159 | .Свойство("МассивСвойств[0].Тип").Равно("string") 160 | ) 161 | ; 162 | 163 | КонецПроцедуры 164 | 165 | Процедура ЗадатьТипСвойстваМассивБезЗаданияТипаЭлементов() Экспорт 166 | 167 | МассивОбъектов = Swag_Описание.Объект("Тестовый объект") 168 | .Свойство("Тестовое свойство") 169 | .ТипЗначения("array") 170 | .Сформировать() 171 | ; 172 | 173 | ЮТест.ОжидаетЧто(МассивОбъектов) 174 | .ИмеетТип("Массив") 175 | .ИмеетДлину(1) 176 | .Содержит(ЮТест.Предикат() 177 | .ИмеетТип("Структура") 178 | .Свойство("Имя").Равно("Тестовый объект") 179 | .Свойство("Тип").Равно("object") 180 | .Свойство("МассивСвойств") 181 | .ИмеетТип("Массив") 182 | .ИмеетДлину(1) 183 | .Свойство("МассивСвойств[0]") 184 | .ИмеетТип("Структура") 185 | .Свойство("МассивСвойств[0].Имя").Равно("Тестовое свойство") 186 | .Свойство("МассивСвойств[0].Тип").Равно("array") 187 | ) 188 | ; 189 | 190 | КонецПроцедуры 191 | 192 | Процедура ЗадатьТипСвойстваМассивСТипомЭлементов() Экспорт 193 | 194 | МассивОбъектов = Swag_Описание.Объект("Тестовый объект") 195 | .Свойство("Тестовое свойство") 196 | .ТипЗначения("array") 197 | .Схема("Элемент массива") 198 | .Сформировать() 199 | ; 200 | 201 | ЮТест.ОжидаетЧто(МассивОбъектов) 202 | .ИмеетТип("Массив") 203 | .ИмеетДлину(1) 204 | .Содержит(ЮТест.Предикат() 205 | .ИмеетТип("Структура") 206 | .Свойство("Имя").Равно("Тестовый объект") 207 | .Свойство("Тип").Равно("object") 208 | .Свойство("МассивСвойств") 209 | .ИмеетТип("Массив") 210 | .ИмеетДлину(1) 211 | .Свойство("МассивСвойств[0]") 212 | .ИмеетТип("Структура") 213 | .Свойство("МассивСвойств[0].Имя").Равно("Тестовое свойство") 214 | .Свойство("МассивСвойств[0].Тип").Равно("array") 215 | .Свойство("МассивСвойств[0].Схема").Равно("#/components/schemas/Элемент массива") 216 | ) 217 | ; 218 | 219 | КонецПроцедуры 220 | 221 | Процедура ЗадатьТипСвойстваРекурсивныйМассив() Экспорт 222 | 223 | МассивОбъектов = Swag_Описание.Объект("Тестовый объект") 224 | .Свойство("Тестовое свойство") 225 | .ТипЗначения("array") 226 | .Схема("Тестовый объект") 227 | .Сформировать() 228 | ; 229 | 230 | ЮТест.ОжидаетЧто(МассивОбъектов) 231 | .ИмеетТип("Массив") 232 | .ИмеетДлину(1) 233 | .Содержит(ЮТест.Предикат() 234 | .ИмеетТип("Структура") 235 | .Свойство("Имя").Равно("Тестовый объект") 236 | .Свойство("Тип").Равно("object") 237 | .Свойство("МассивСвойств") 238 | .ИмеетТип("Массив") 239 | .ИмеетДлину(1) 240 | .Свойство("МассивСвойств[0]") 241 | .ИмеетТип("Структура") 242 | .Свойство("МассивСвойств[0].Имя").Равно("Тестовое свойство") 243 | .Свойство("МассивСвойств[0].Тип").Равно("array") 244 | .Свойство("МассивСвойств[0].Схема").Равно("#/components/schemas/Тестовый объект") 245 | ) 246 | ; 247 | 248 | КонецПроцедуры 249 | 250 | Процедура ЗадатьПример() Экспорт 251 | 252 | МассивОбъектов = Swag_Описание.Объект("Тестовый объект") 253 | .Свойство("Тестовое свойство") 254 | .Пример("Тестовый пример") 255 | .Сформировать() 256 | ; 257 | 258 | ЮТест.ОжидаетЧто(МассивОбъектов) 259 | .ИмеетТип("Массив") 260 | .ИмеетДлину(1) 261 | .Содержит(ЮТест.Предикат() 262 | .ИмеетТип("Структура") 263 | .Свойство("Имя").Равно("Тестовый объект") 264 | .Свойство("Тип").Равно("object") 265 | .Свойство("МассивСвойств") 266 | .ИмеетТип("Массив") 267 | .ИмеетДлину(1) 268 | .Свойство("МассивСвойств[0]") 269 | .ИмеетТип("Структура") 270 | .Свойство("МассивСвойств[0].Имя").Равно("Тестовое свойство") 271 | .Свойство("МассивСвойств[0].Пример").Равно("Тестовый пример") 272 | ) 273 | ; 274 | 275 | КонецПроцедуры 276 | 277 | Процедура ЗадатьПеречислениеСтрокой() Экспорт 278 | 279 | МассивОбъектов = Swag_Описание.Объект("Тестовый объект") 280 | .Свойство("Тестовое свойство") 281 | .ТипЗначения("string") 282 | .ЗначениеПеречисления("asc") 283 | .ЗначениеПеречисления("desc") 284 | .Сформировать() 285 | ; 286 | 287 | 288 | 289 | КонецПроцедуры 290 | 291 | Процедура ЗадатьПеречислениеЧислом() Экспорт 292 | 293 | МассивОбъектов = Swag_Описание.Объект("Тестовый объект") 294 | .Свойство("Тестовое свойство") 295 | .ТипЗначения("integer") 296 | .ЗначениеПеречисления(10) 297 | .ЗначениеПеречисления(15) 298 | .ЗначениеПеречисления(25) 299 | .ЗначениеПеречисления(50) 300 | .Сформировать() 301 | ; 302 | 303 | 304 | 305 | КонецПроцедуры 306 | 307 | Процедура ЗадатьПеречислениеСтрокойДопускаетсяNull() Экспорт 308 | 309 | МассивОбъектов = Swag_Описание.Объект("Тестовый объект") 310 | .Свойство("Тестовое свойство") 311 | .ТипЗначения("string") 312 | .ДопускаетNull() 313 | .ЗначениеПеречисления("asc") 314 | .ЗначениеПеречисления("desc") 315 | .Сформировать() 316 | ; 317 | 318 | 319 | 320 | КонецПроцедуры 321 | 322 | Процедура ЗадатьПеречислениеБезТипа() Экспорт 323 | 324 | МассивОбъектов = Swag_Описание.Объект("Тестовый объект") 325 | .Свойство("Тестовое свойство") 326 | .ЗначениеПеречисления("asc") 327 | .ЗначениеПеречисления("desc") 328 | .Сформировать() 329 | ; 330 | 331 | 332 | 333 | КонецПроцедуры 334 | 335 | Процедура ЗадатьПеречислениеБулево() Экспорт 336 | 337 | Описание = Swag_Описание.Объект("Тестовый объект") 338 | .Свойство("Тестовое свойство") 339 | .ТипЗначения("boolean") 340 | ; 341 | 342 | ЮТест.ОжидаетЧто(Описание) 343 | .Метод("ЗначениеПеречисления").Параметр("asc") 344 | .ВыбрасываетИсключение("ЗначениеПеречисления: перечисление можно устанавливать только для свойства типов string и integer") 345 | ; 346 | 347 | КонецПроцедуры 348 | 349 | #КонецОбласти 350 | 351 | #Область Методы 352 | 353 | Процедура СоздатьМетод() Экспорт 354 | 355 | МассивМетодов = Swag_Описание.Метод("Тестовый метод") 356 | .Сформировать() 357 | ; 358 | 359 | КонецПроцедуры 360 | 361 | Процедура СоздатьМетодСОписанием() Экспорт 362 | 363 | МассивМетодов = Swag_Описание.Метод("Тестовый метод") 364 | .ОписаниеМетода("Тестовое описание тестового метода") 365 | .Сформировать() 366 | ; 367 | 368 | КонецПроцедуры 369 | 370 | #КонецОбласти 371 | 372 | #Область ТестовоеОписание 373 | 374 | Процедура СоздатьМассивОбъектов() Экспорт 375 | 376 | МассивОбъектов = SwagTest_Тестовый_HTTPСервис3Описание 377 | .ПолучитьОбъектыHTTPСервиса(); 378 | 379 | ЮТест.ОжидаетЧто(МассивОбъектов) 380 | .ИмеетТип("Массив") 381 | .ИмеетДлину(3) 382 | ; 383 | 384 | КонецПроцедуры 385 | 386 | Процедура СоздатьМассивМетодов() Экспорт 387 | 388 | МассивМетодов = SwagTest_Тестовый_HTTPСервис3Описание 389 | .ПолучитьОписаниеHTTPСервиса(); 390 | 391 | ЮТест.ОжидаетЧто(МассивМетодов) 392 | .ИмеетТип("Массив") 393 | .ИмеетДлину(6) 394 | .Содержит(ЮТест.Предикат() 395 | .ИмеетТип("Структура") 396 | .Свойство("Имя").Равно("ТестовыйGET") 397 | .Свойство("Параметры") 398 | .ИмеетТип("Массив") 399 | .ИмеетДлину(2) 400 | .Свойство("Ответы") 401 | .ИмеетТип("Массив") 402 | .ИмеетДлину(2) 403 | ) 404 | .Содержит(ЮТест.Предикат() 405 | .ИмеетТип("Структура") 406 | .Свойство("Имя").Равно("ТестовыйPOST") 407 | .Свойство("ТелоЗапроса") 408 | .ИмеетТип("Структура") 409 | ) 410 | .Содержит(ЮТест.Предикат() 411 | .ИмеетТип("Структура") 412 | .Свойство("Имя").Равно("ОшибкаНетОтветовGET") 413 | ) 414 | .Содержит(ЮТест.Предикат() 415 | .ИмеетТип("Структура") 416 | .Свойство("Имя").Равно("ОшибкаНетНужногоКодаОтветаGET") 417 | ) 418 | .Содержит(ЮТест.Предикат() 419 | .ИмеетТип("Структура") 420 | .Свойство("Имя").Равно("ОшибкаНеЗаданТипMIMEGET") 421 | ) 422 | .Содержит(ЮТест.Предикат() 423 | .ИмеетТип("Структура") 424 | .Свойство("Имя").Равно("ОшибкаНекорректныйТипMIMEGET") 425 | ) 426 | ; 427 | 428 | КонецПроцедуры 429 | 430 | #КонецОбласти 431 | 432 | #КонецОбласти 433 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/SwagTest_Тестовый_HTTPСервис2Описание.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | SwagTest_Тестовый_HTTPСервис2Описание 6 | 7 | 8 | 9 | Swag test тестовый HTTPСервис2 описание 10 | 11 | 12 | ru 13 | Swag test тестовый HTTPСервис2 описание 14 | 15 | 16 | 17 | false 18 | false 19 | true 20 | false 21 | false 22 | false 23 | false 24 | DontUse 25 | 26 | 27 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/SwagTest_Тестовый_HTTPСервис2Описание/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | Функция ПолучитьОписаниеHTTPСервиса() Экспорт 2 | 3 | Объекты = ПолучитьОбъектыHTTPСервиса(); 4 | 5 | ТестовыйGET_MIME_Success = Новый Массив; 6 | ТестовыйGET_MIME_Success.Добавить(Swag_ФормированиеОписаний.ОписаниеТипаMIME("application/json", , Объекты[0].Имя)); 7 | 8 | ТестовыйGETОтветы = Новый Массив; 9 | ТестовыйGETОтветы.Добавить(Swag_ФормированиеОписаний.ОписаниеОтвета(200, "Success", ТестовыйGET_MIME_Success)); 10 | ТестовыйGETОтветы.Добавить(Swag_ФормированиеОписаний.ОписаниеОтвета(401, "Unauthorized")); 11 | 12 | Описание = Новый Массив; 13 | Описание.Добавить(Swag_ФормированиеОписаний.ОписаниеМетода( 14 | "ТестовыйGET", "Получение других каких-то данных из 1С",, ТестовыйGETОтветы)); 15 | 16 | Возврат Описание; 17 | 18 | КонецФункции 19 | 20 | Функция ПолучитьОбъектыHTTPСервиса() Экспорт 21 | 22 | РеквизитНаименование = Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("name", "string"); 23 | РеквизитНаименование.Пример = "Лист дерева"; 24 | 25 | TestObjectМассивСвойств = Новый Массив; 26 | TestObjectМассивСвойств.Добавить(РеквизитНаименование); 27 | TestObjectМассивСвойств.Добавить(Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("children", "array", "TestObject2")); 28 | 29 | Объекты = Новый Массив; 30 | Объекты.Добавить(Swag_ФормированиеОписаний.ОписаниеОбъекта( 31 | "TestObject2", "object", TestObjectМассивСвойств)); 32 | 33 | Возврат Объекты; 34 | 35 | КонецФункции 36 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/SwagTest_Тестовый_HTTPСервис3Описание.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | SwagTest_Тестовый_HTTPСервис3Описание 6 | 7 | 8 | ru 9 | Swag test тестовый HTTPСервис3 описание 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/SwagTest_Тестовый_HTTPСервис3Описание/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | Функция ПолучитьОписаниеHTTPСервиса() Экспорт 2 | 3 | Объекты = ПолучитьОбъектыHTTPСервиса(); 4 | 5 | МассивОписанийМетодов = Swag_Описание 6 | .Метод("ТестовыйGET") 7 | .ОписаниеМетода("Получение каких-то данных из 1С") 8 | .ПараметрЗапроса("param1") 9 | .ОписаниеПараметра("Какое-то описание параметра") 10 | .Обязательный() 11 | .ПараметрЗапроса("param2") 12 | .ОписаниеПараметра("Ещё какой-то параметр") 13 | .МинимальнаяДлина(1) 14 | .ПараметрЗапроса("param3") 15 | .ОписаниеПараметра("Параметр для теста перечисления") 16 | .ЗначениеПеречисления(1) 17 | .ЗначениеПеречисления(2) 18 | .Ответ(200) 19 | .ОписаниеОтвета("Success") 20 | .ТипОтвета("application/json") 21 | .СхемаОтвета(Объекты[0].Имя) 22 | .Ответ(401) 23 | .ОписаниеОтвета("Unauthorized") 24 | // 25 | .Метод("ТестовыйPOST") 26 | .ОписаниеМетода("Отправка каких-то данных в 1С") 27 | .Тело() 28 | .ТипТела("application/json") 29 | .СхемаТела(Объекты[2].Имя) 30 | // 31 | .Метод("ОшибкаНетОтветовGET") 32 | .ОписаниеМетода("Тест ошибки когда не заданы описания ответов") 33 | // 34 | .Метод("ОшибкаНетНужногоКодаОтветаGET") 35 | .ОписаниеМетода("Тест ошибки когда не определено описание конкретного кода ответа") 36 | .Ответ(401) 37 | .ОписаниеОтвета("Unauthorized") 38 | // 39 | .Метод("ОшибкаНеЗаданТипMIMEGET") 40 | .ОписаниеМетода("Тест ошибки когда в ответе не задан тип MIME") 41 | .Ответ(200) 42 | .ОписаниеОтвета("Success") 43 | .ТипОтвета("application/json") 44 | // 45 | .Метод("ОшибкаНекорректныйТипMIMEGET") 46 | .ОписаниеМетода("Тест ошибки когда в ответ с некорректным типом MIME") 47 | .Ответ(200) 48 | .ОписаниеОтвета("Success") 49 | .ТипОтвета("application/json") 50 | .Сформировать() 51 | ; 52 | 53 | Возврат МассивОписанийМетодов; 54 | 55 | КонецФункции 56 | 57 | Функция ПолучитьОбъектыHTTPСервиса() Экспорт 58 | 59 | Объекты = Swag_Описание 60 | .Объект("TestObject3") 61 | .ОбязательныеПоля("test_property_1, test_property_2") 62 | .Свойство("test_property_1") 63 | .Описание("Это описание для тестового свойства объекта") 64 | .ТипЗначения("boolean") 65 | .Свойство("test_property_2") 66 | .ТипЗначения("string") 67 | .Пример("ООО ""УУУ""") 68 | .МинимальнаяДлина(1) 69 | .МаксимальнаяДлина(255) 70 | .Свойство("test_property_3") 71 | .ТипЗначения("integer") 72 | .Пример(123.45) 73 | .Обязательный() 74 | .ФорматЗначения("int64") 75 | .Минимум(10) 76 | .Максимум(1000) 77 | .НеВключаяМинимум() 78 | .ПоУмолчанию(20) 79 | .Свойство("test_property_4") 80 | .ТипЗначения("array") 81 | .Схема("AnotherTestObject") 82 | .Свойство("test_property_5") 83 | .ТипЗначения("string") 84 | .ЗначениеПеречисления("asc") 85 | .ЗначениеПеречисления("desc") 86 | .Свойство("test_property_6") 87 | .ТипЗначения("object") 88 | .Схема("AnotherTestObject") 89 | // 90 | .Объект("AnotherTestObject3") 91 | // 92 | .Объект("TestPostObject3") 93 | .Свойство("test_post_property") 94 | .ТипЗначения("string") 95 | .Сформировать() 96 | ; 97 | 98 | Возврат Объекты; 99 | 100 | КонецФункции 101 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/SwagTest_Тестовый_HTTPСервисОписание.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | SwagTest_Тестовый_HTTPСервисОписание 6 | 7 | 8 | ru 9 | Описание тестового HTTP сервиса 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/SwagTest_Тестовый_HTTPСервисОписание/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | Функция ПолучитьОписаниеHTTPСервиса() Экспорт 2 | 3 | Объекты = ПолучитьОбъектыHTTPСервиса(); 4 | 5 | ТестовыйGETПараметры = Новый Массив; 6 | ТестовыйGETПараметры.Добавить(Swag_ФормированиеОписаний.ОписаниеПараметра("param1", "Какое-то описание параметра", "query", Истина)); 7 | ТестовыйGETПараметры.Добавить(Swag_ФормированиеОписаний.ОписаниеПараметра("param2", "Ещё какой-то параметр", "query", , , , , 1)); 8 | 9 | ТестовыйGET_MIME_Success = Новый Массив; 10 | ТестовыйGET_MIME_Success.Добавить(Swag_ФормированиеОписаний.ОписаниеТипаMIME("application/json", , Объекты[0].Имя)); 11 | 12 | ТестовыйGETОтветы = Новый Массив; 13 | ТестовыйGETОтветы.Добавить(Swag_ФормированиеОписаний.ОписаниеОтвета(200, "Success", ТестовыйGET_MIME_Success)); 14 | ТестовыйGETОтветы.Добавить(Swag_ФормированиеОписаний.ОписаниеОтвета(401, "Unauthorized")); 15 | 16 | /////////////////////////////////////////////////////////////////////// 17 | ТестовыйPOSTТело_MIME = Новый Массив; 18 | ТестовыйPOSTТело_MIME.Добавить(Swag_ФормированиеОписаний.ОписаниеТипаMIME("application/json", , Объекты[2].Имя)); 19 | 20 | ТестовыйPOSTТело = Swag_ФормированиеОписаний.ОписаниеТелаЗапроса(, ТестовыйPOSTТело_MIME); 21 | 22 | /////////////////////////////////////////////////////////////////////// 23 | ОшибкаНетНужногоКодаОтветаGETОтветы = Новый Массив; 24 | ОшибкаНетНужногоКодаОтветаGETОтветы.Добавить(Swag_ФормированиеОписаний.ОписаниеОтвета(401, "Unauthorized")); 25 | 26 | /////////////////////////////////////////////////////////////////////// 27 | ОшибкаНеЗаданТипMIMEGET_MIME_Success = Новый Массив; 28 | ОшибкаНеЗаданТипMIMEGET_MIME_Success.Добавить(Swag_ФормированиеОписаний.ОписаниеТипаMIME("application/json")); 29 | 30 | ОшибкаНеЗаданТипMIMEGETОтветы = Новый Массив; 31 | ОшибкаНеЗаданТипMIMEGETОтветы.Добавить(Swag_ФормированиеОписаний.ОписаниеОтвета(200, "Success", ОшибкаНеЗаданТипMIMEGET_MIME_Success)); 32 | 33 | ТекстыДляМетодаТестовыйGET = Новый Структура("Описание, ДетальноеОписание", 34 | "Получение каких-то данных из 1С", "Гиперссылка: example.com"); 35 | 36 | Описание = Новый Массив; 37 | Описание.Добавить(Swag_ФормированиеОписаний.ОписаниеМетода("ТестовыйGET", ТекстыДляМетодаТестовыйGET, ТестовыйGETПараметры, ТестовыйGETОтветы)); 38 | Описание.Добавить(Swag_ФормированиеОписаний.ОписаниеМетода("ТестовыйPOST", "Отправка каких-то данных в 1С", , , ТестовыйPOSTТело)); 39 | Описание.Добавить(Swag_ФормированиеОписаний.ОписаниеМетода("ОшибкаНетОтветовGET", "Тест ошибки когда не заданы описания ответов", , Новый Массив)); 40 | Описание.Добавить(Swag_ФормированиеОписаний.ОписаниеМетода("ОшибкаНетНужногоКодаОтветаGET", "Тест ошибки когда не определено описание конкретного кода ответа", , ОшибкаНетНужногоКодаОтветаGETОтветы)); 41 | Описание.Добавить(Swag_ФормированиеОписаний.ОписаниеМетода("ОшибкаНеЗаданТипMIMEGET", "Тест ошибки когда в ответе не задан тип MIME", , ОшибкаНеЗаданТипMIMEGETОтветы)); 42 | Описание.Добавить(Swag_ФормированиеОписаний.ОписаниеМетода("ОшибкаНекорректныйТипMIMEGET", "Тест ошибки когда в ответ с некорректным типом MIME", , ОшибкаНеЗаданТипMIMEGETОтветы)); 43 | 44 | Возврат Описание; 45 | 46 | КонецФункции 47 | 48 | Функция ПолучитьОбъектыHTTPСервиса() Экспорт 49 | 50 | Реквизит2 = Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("test_property_2", "string"); 51 | Реквизит2.Пример = "ООО ""УУУ"""; 52 | Реквизит2.МинимальнаяДлина = 1; 53 | Реквизит2.МаксимальнаяДлина = 255; 54 | 55 | Реквизит3 = Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("test_property_3", "integer"); 56 | Реквизит3.Пример = 123.45; 57 | Реквизит3.Обязательный = Истина; 58 | Реквизит3.Формат = "int64"; 59 | Реквизит3.Минимум = 10; 60 | Реквизит3.Максимум = 1000; 61 | Реквизит3.НеВключаяМинимум = Истина; 62 | Реквизит3.ПоУмолчанию = 20; 63 | 64 | TestObjectМассивСвойств = Новый Массив; 65 | TestObjectМассивСвойств.Добавить(Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("test_property_1", "boolean")); 66 | TestObjectМассивСвойств.Добавить(Реквизит2); 67 | TestObjectМассивСвойств.Добавить(Реквизит3); 68 | TestObjectМассивСвойств.Добавить(Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("test_property_4", "array", "AnotherTestObject")); 69 | TestObjectМассивСвойств.Добавить(Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("test_property_5", "object", "AnotherTestObject")); 70 | 71 | TestPostObjectМассивСвойств = Новый Массив; 72 | TestPostObjectМассивСвойств.Добавить(Swag_ФормированиеОписаний.ОписаниеРеквизитаОбъекта("test_post_property", "string")); 73 | 74 | Объекты = Новый Массив; 75 | Объекты.Добавить(Swag_ФормированиеОписаний.ОписаниеОбъекта("TestObject", "object", TestObjectМассивСвойств, "test_property_1, test_property_2")); 76 | Объекты.Добавить(Swag_ФормированиеОписаний.ОписаниеОбъекта("AnotherTestObject", "object")); 77 | Объекты.Добавить(Swag_ФормированиеОписаний.ОписаниеОбъекта("TestPostObject", "object", TestPostObjectМассивСвойств)); 78 | 79 | Возврат Объекты; 80 | 81 | КонецФункции 82 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/SwagTest_Тестовый_HTTPСервисСВерсияиОписание.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | SwagTest_Тестовый_HTTPСервисСВерсияиОписание 6 | 7 | 8 | ru 9 | Swag test тестовый HTTPСервис с версияи описание 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/SwagTest_Тестовый_HTTPСервисСВерсияиОписание/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | Функция ПолучитьОписаниеHTTPСервиса() Экспорт 2 | 3 | МассивОписанийМетодов = Swag_Описание 4 | .Метод("ТестовыйGET") 5 | .ОписаниеМетода("Получение данных из 1С") 6 | .ДетальноеОписаниеМетода("Гиперссылка: example.com") 7 | .ПараметрURL("Версия") 8 | .ОписаниеПараметра("Версия метода") 9 | .ЗначениеПеречисления("1.0") 10 | .ЗначениеПеречисления("2.0") 11 | .Ответ(200) 12 | .ОписаниеОтвета("Success") 13 | .Сформировать() 14 | ; 15 | 16 | Возврат МассивОписанийМетодов; 17 | 18 | КонецФункции 19 | 20 | Функция ПолучитьОбъектыHTTPСервиса() Экспорт 21 | 22 | Объекты = Новый Массив; 23 | 24 | Возврат Объекты; 25 | 26 | КонецФункции 27 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/SwaggerОбщиеНастройки.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | SwaggerОбщиеНастройки 6 | 7 | 8 | ru 9 | Swagger общие настройки 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/SwaggerОбщиеНастройки/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 |  2 | Функция ПолучитьОбщиеНастройки() Экспорт 3 | 4 | МассивНеотображаемыхСервисов= Новый Массив; 5 | МассивНеотображаемыхСервисов.Добавить("Exchange"); 6 | МассивНеотображаемыхСервисов.Добавить("ПередачаДанных"); 7 | МассивНеотображаемыхСервисов.Добавить("ЭДО"); 8 | 9 | Возврат Новый Структура("МассивНеотображаемыхСервисов", МассивНеотображаемыхСервисов); 10 | 11 | КонецФункции -------------------------------------------------------------------------------- /swagger-test/CommonModules/БиллингОписание.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | БиллингОписание 6 | 7 | 8 | ru 9 | Биллинг описание 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/БиллингОписание/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 |  2 | Функция ПолучитьОбщиеНастройки() Экспорт 3 | 4 | Возврат Новый Структура("НеОтображать", Истина); 5 | 6 | КонецФункции 7 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/ПередачаДанныхОписание.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | ПередачаДанныхОписание 6 | 7 | 8 | ru 9 | Передача данных описание 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/ПередачаДанныхОписание/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | Функция ПолучитьОписаниеHTTPСервиса() Экспорт 2 | 3 | Описание = Новый Массив; 4 | 5 | // ХранилищеИИдентификаторGET 6 | ХранилищеИИдентификаторGETПараметры = Новый Массив; 7 | ХранилищеИИдентификаторGETПараметры.Добавить(Swag_ФормированиеОписаний.ОписаниеПараметра("Storage", "Наименование логического хранилища", "path", Истина)); 8 | ХранилищеИИдентификаторGETПараметры.Добавить(Swag_ФормированиеОписаний.ОписаниеПараметра("ID", "Идентификатор данных в логическом хранилище", "path", Истина)); 9 | 10 | ХранилищеИИдентификаторGETОтветы = Новый Массив; 11 | ХранилищеИИдентификаторGETОтветы.Добавить(Swag_ФормированиеОписаний.ОписаниеОтвета(404, "Not found")); 12 | 13 | Описание.Добавить(Swag_ФормированиеОписаний.ОписаниеМетода("ХранилищеИИдентификаторGET", "Получение данных из логического хранилища", ХранилищеИИдентификаторGETПараметры, ХранилищеИИдентификаторGETОтветы)); 14 | 15 | // ХранилищеИИдентификаторPOST 16 | ХранилищеИИдентификаторPOSTПараметры = Новый Массив; 17 | 18 | 19 | ХранилищеИИдентификаторPOSTОтветы = Новый Массив; 20 | 21 | 22 | Возврат Описание; 23 | 24 | КонецФункции -------------------------------------------------------------------------------- /swagger-test/CommonModules/СерверЛояльностиОписание.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | СерверЛояльностиОписание 6 | 7 | 8 | ru 9 | Сервер лояльности описание 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /swagger-test/CommonModules/СерверЛояльностиОписание/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 |  2 | Функция ПолучитьОбщиеНастройки() Экспорт 3 | 4 | Возврат Новый Структура("Описание", "Пример описания HTTP-сервиса ""Сервер лояльности"" из кода. Гиперссылка: example.com"); 5 | 6 | КонецФункции 7 | -------------------------------------------------------------------------------- /swagger-test/Configuration.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 9cd510cd-abfc-11d4-9434-004095e12fc7 7 | 59b7cfac-930b-4507-8cf8-023d13891801 8 | 9 | 10 | 9fcd25a0-4822-11d4-9414-008048da11f9 11 | 9ce809b4-beaf-40c7-8e23-3b1775d188ce 12 | 13 | 14 | e3687481-0a87-462c-a166-9f34594f9bba 15 | 4985252a-6381-4ecc-a680-733e11e6c195 16 | 17 | 18 | 9de14907-ec23-4a07-96f0-85521cb6b53b 19 | 303fab92-e195-461a-bef6-ed8257d595ba 20 | 21 | 22 | 51f2d5d8-ea4d-4064-8892-82951750031e 23 | 4e4cea44-36b8-485e-907b-130721c7513c 24 | 25 | 26 | e68182ea-4237-4383-967f-90c1e3370bc7 27 | c30cda11-20d6-4e91-9e1b-62a9f2a76520 28 | 29 | 30 | fb282519-d103-4dd3-bc12-cb271d631dfc 31 | 12477032-c0e0-4512-b37a-6b72590ae48f 32 | 33 | 34 | 35 | Adopted 36 | SwaggerTest 37 | 38 | 39 | ru 40 | Swagger test 41 | 42 | 43 | 44 | Customization 45 | true 46 | SwagTest_ 47 | Version8_3_10 48 | ManagedApplication 49 | 50 | PlatformApplication 51 | 52 | Russian 53 | 54 | 1.2.6 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | Русский 63 | SwaggerОбщиеНастройки 64 | SwagTest_YAxUnit_Тесты 65 | SwagTest_Тестовый_HTTPСервис2Описание 66 | SwagTest_Тестовый_HTTPСервис3Описание 67 | SwagTest_Тестовый_HTTPСервисОписание 68 | SwagTest_Тестовый_HTTPСервисСВерсияиОписание 69 | БиллингОписание 70 | ПередачаДанныхОписание 71 | СерверЛояльностиОписание 72 | SwagTest_Тестовый_HTTPСервис 73 | SwagTest_Тестовый_HTTPСервис2 74 | SwagTest_Тестовый_HTTPСервис3 75 | SwagTest_Тестовый_HTTPСервисСВерсияи 76 | 77 | 78 | -------------------------------------------------------------------------------- /swagger-test/HTTPServices/SwagTest_Тестовый_HTTPСервис.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | SwagTest_Тестовый_HTTPСервис 6 | 7 | 8 | ru 9 | Тестовый HTTP сервис 10 | 11 | 12 | 13 | swagger_test 14 | AutoUse 15 | 20 16 | 17 | 18 | 19 | 20 | Тестовый 21 | 22 | 23 | ru 24 | Тестовый 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | GET 34 | 35 | 36 | ru 37 | GET 38 | 39 | 40 | 41 | GET 42 | ТестовыйGET 43 | 44 | 45 | 46 | 47 | POST 48 | 49 | 50 | ru 51 | POST 52 | 53 | 54 | 55 | POST 56 | ТестовыйPOST 57 | 58 | 59 | 60 | 61 | 62 | 63 | ОшибкаНетОписания 64 | 65 | 66 | ru 67 | Ошибка нет описания 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | GET 77 | 78 | 79 | ru 80 | GET 81 | 82 | 83 | 84 | GET 85 | ОшибкаНетОписанияGET 86 | 87 | 88 | 89 | 90 | 91 | 92 | ОшибкаНетОтветов 93 | 94 | 95 | ru 96 | Ошибка нет ответов 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | GET 106 | 107 | 108 | ru 109 | GET 110 | 111 | 112 | 113 | GET 114 | ОшибкаНетОтветовGET 115 | 116 | 117 | 118 | 119 | 120 | 121 | ОшибкаНетНужногоКодаОтвета 122 | 123 | 124 | ru 125 | Ошибка нет нужного кода ответа 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | GET 135 | 136 | 137 | ru 138 | GET 139 | 140 | 141 | 142 | GET 143 | ОшибкаНетНужногоКодаОтветаGET 144 | 145 | 146 | 147 | 148 | 149 | 150 | ОшибкаНеЗаданТипMIME 151 | 152 | 153 | ru 154 | Ошибка не задан тип MIME 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | GET 164 | 165 | 166 | ru 167 | GET 168 | 169 | 170 | 171 | GET 172 | ОшибкаНеЗаданТипMIMEGET 173 | 174 | 175 | 176 | 177 | 178 | 179 | ОшибкаНекорректныйТипMIME 180 | 181 | 182 | ru 183 | Ошибка некорректный тип MIME 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | GET 193 | 194 | 195 | ru 196 | GET 197 | 198 | 199 | 200 | GET 201 | ОшибкаНекорректныйТипMIMEGET 202 | 203 | 204 | 205 | 206 | 207 | 208 | -------------------------------------------------------------------------------- /swagger-test/HTTPServices/SwagTest_Тестовый_HTTPСервис/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | // Комментарий к тестовому HTTP сервису. 2 | // 3 | // GET /swagger_test/first 4 | // @summary Получение каких-то данных из 1С 5 | // @description Эти данные предназначены для чего-то большего чем быть просто обычным тестом 6 | // @pathParam {string} param1 - Какое-то описание параметра 7 | // @pathParam {int64} param2 - Ещё какой-то параметр 8 | // @responseContent {TestObject} 200.application/json 9 | // @response 200 - Success 10 | // @response 401 - Unauthorized 11 | // 12 | Функция ТестовыйGET(Запрос) 13 | 14 | РезультатПроверкиПараметров = Swag_ОбработкаHTTP.ПроверитьПараметры("SwagTest_Тестовый_HTTPСервис", "ТестовыйGET", Запрос); 15 | Если Не ПустаяСтрока(РезультатПроверкиПараметров) Тогда 16 | Возврат Swag_ОбработкаHTTP.ПолучитьОтветОшибки(РезультатПроверкиПараметров, Истина); 17 | КонецЕсли; 18 | 19 | Ответ = Новый HTTPСервисОтвет(200); 20 | СтрокаОтвета = "{ 21 | | ""param1"": """ + Запрос["ПараметрыЗапроса"].Получить("param1") + """, 22 | | ""param2"": """ + Запрос["ПараметрыЗапроса"].Получить("param2") + """ 23 | |}"; 24 | Ответ.Заголовки.Вставить("Content-Type", "application/json"); 25 | Ответ.УстановитьТелоИзСтроки(СтрокаОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); 26 | 27 | Возврат Swag_ОбработкаHTTP.ПроверитьОтвет("SwagTest_Тестовый_HTTPСервис", "ТестовыйGET", Ответ); 28 | 29 | КонецФункции 30 | 31 | // Комментарий к другому тестовому HTTP сервису. 32 | // 33 | // POST /swagger_test/first 34 | // @summary Отправка каких-то данных в 1С 35 | // @bodyContent {TestPostObject} application/json 36 | // 37 | Функция ТестовыйPOST(Запрос) 38 | 39 | РезультатПроверкиПараметров = Swag_ОбработкаHTTP.ПроверитьПараметры("SwagTest_Тестовый_HTTPСервис", "ТестовыйPOST", Запрос); 40 | Если Не ПустаяСтрока(РезультатПроверкиПараметров) Тогда 41 | Возврат Swag_ОбработкаHTTP.ПолучитьОтветОшибки(РезультатПроверкиПараметров, Истина); 42 | КонецЕсли; 43 | 44 | Ответ = Новый HTTPСервисОтвет(200); 45 | Возврат Ответ; 46 | 47 | КонецФункции 48 | 49 | Функция ОшибкаНетОписанияGET(Запрос) 50 | Ответ = Новый HTTPСервисОтвет(200); 51 | Возврат Swag_ОбработкаHTTP.ПроверитьОтвет("SwagTest_Тестовый_HTTPСервис", "ОшибкаНетОписанияGET", Ответ); 52 | КонецФункции 53 | 54 | Функция ОшибкаНетОтветовGET(Запрос) 55 | Ответ = Новый HTTPСервисОтвет(200); 56 | Возврат Swag_ОбработкаHTTP.ПроверитьОтвет("SwagTest_Тестовый_HTTPСервис", "ОшибкаНетОтветовGET", Ответ); 57 | КонецФункции 58 | 59 | Функция ОшибкаНетНужногоКодаОтветаGET(Запрос) 60 | Ответ = Новый HTTPСервисОтвет(200); 61 | Возврат Swag_ОбработкаHTTP.ПроверитьОтвет("SwagTest_Тестовый_HTTPСервис", "ОшибкаНетНужногоКодаОтветаGET", Ответ); 62 | КонецФункции 63 | 64 | Функция ОшибкаНеЗаданТипMIMEGET(Запрос) 65 | Ответ = Новый HTTPСервисОтвет(200); 66 | Возврат Swag_ОбработкаHTTP.ПроверитьОтвет("SwagTest_Тестовый_HTTPСервис", "ОшибкаНеЗаданТипMIMEGET", Ответ); 67 | КонецФункции 68 | 69 | Функция ОшибкаНекорректныйТипMIMEGET(Запрос) 70 | Ответ = Новый HTTPСервисОтвет(200); 71 | Ответ.Заголовки.Вставить("Content-Type", "text/plain"); 72 | Возврат Swag_ОбработкаHTTP.ПроверитьОтвет("SwagTest_Тестовый_HTTPСервис", "ОшибкаНекорректныйТипMIMEGET", Ответ); 73 | КонецФункции 74 | -------------------------------------------------------------------------------- /swagger-test/HTTPServices/SwagTest_Тестовый_HTTPСервис2.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | SwagTest_Тестовый_HTTPСервис2 6 | 7 | 8 | 9 | Swag test тестовый HTTPСервис2 10 | 11 | 12 | 13 | swagger_test2 14 | AutoUse 15 | 20 16 | 17 | 18 | 19 | 20 | Тестовый 21 | 22 | 23 | 24 | Тестовый 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | GET 34 | 35 | 36 | 37 | GET 38 | 39 | 40 | 41 | GET 42 | ТестовыйGET 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /swagger-test/HTTPServices/SwagTest_Тестовый_HTTPСервис2/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 |  2 | Функция ТестовыйGET(Запрос) 3 | Ответ = Новый HTTPСервисОтвет(200); 4 | Возврат Ответ; 5 | КонецФункции 6 | -------------------------------------------------------------------------------- /swagger-test/HTTPServices/SwagTest_Тестовый_HTTPСервис3.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | SwagTest_Тестовый_HTTPСервис3 6 | 7 | 8 | ru 9 | Тестовый HTTP сервис 3 10 | 11 | 12 | 13 | swagger_test3 14 | AutoUse 15 | 20 16 | 17 | 18 | 19 | 20 | Тестовый 21 | 22 | 23 | ru 24 | Тестовый 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | GET 34 | 35 | 36 | ru 37 | GET 38 | 39 | 40 | 41 | GET 42 | ТестовыйGET 43 | 44 | 45 | 46 | 47 | POST 48 | 49 | 50 | ru 51 | POST 52 | 53 | 54 | 55 | POST 56 | ТестовыйPOST 57 | 58 | 59 | 60 | 61 | 62 | 63 | ОшибкаНетОписания 64 | 65 | 66 | ru 67 | Ошибка нет описания 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | GET 77 | 78 | 79 | ru 80 | GET 81 | 82 | 83 | 84 | GET 85 | ОшибкаНетОписанияGET 86 | 87 | 88 | 89 | 90 | 91 | 92 | ОшибкаНетОтветов 93 | 94 | 95 | ru 96 | Ошибка нет ответов 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | GET 106 | 107 | 108 | ru 109 | GET 110 | 111 | 112 | 113 | GET 114 | ОшибкаНетОтветовGET 115 | 116 | 117 | 118 | 119 | 120 | 121 | ОшибкаНетНужногоКодаОтвета 122 | 123 | 124 | ru 125 | Ошибка нет нужного кода ответа 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | GET 135 | 136 | 137 | ru 138 | GET 139 | 140 | 141 | 142 | GET 143 | ОшибкаНетНужногоКодаОтветаGET 144 | 145 | 146 | 147 | 148 | 149 | 150 | ОшибкаНеЗаданТипMIME 151 | 152 | 153 | ru 154 | Ошибка не задан тип MIME 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | GET 164 | 165 | 166 | ru 167 | GET 168 | 169 | 170 | 171 | GET 172 | ОшибкаНеЗаданТипMIMEGET 173 | 174 | 175 | 176 | 177 | 178 | 179 | ОшибкаНекорректныйТипMIME 180 | 181 | 182 | ru 183 | Ошибка некорректный тип MIME 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | GET 193 | 194 | 195 | ru 196 | GET 197 | 198 | 199 | 200 | GET 201 | ОшибкаНекорректныйТипMIMEGET 202 | 203 | 204 | 205 | 206 | 207 | 208 | -------------------------------------------------------------------------------- /swagger-test/HTTPServices/SwagTest_Тестовый_HTTPСервис3/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | // Комментарий к тестовому HTTP сервису. 2 | // 3 | // GET /swagger_test/first 4 | // @summary Получение каких-то данных из 1С 5 | // @description Эти данные предназначены для чего-то большего чем быть просто обычным тестом 6 | // @pathParam {string} param1 - Какое-то описание параметра 7 | // @pathParam {int64} param2 - Ещё какой-то параметр 8 | // @responseContent {TestObject} 200.application/json 9 | // @response 200 - Success 10 | // @response 401 - Unauthorized 11 | // 12 | Функция ТестовыйGET(Запрос) 13 | 14 | РезультатПроверкиПараметров = Swag_ОбработкаHTTP.ПроверитьПараметры("SwagTest_Тестовый_HTTPСервис", "ТестовыйGET", Запрос); 15 | Если Не ПустаяСтрока(РезультатПроверкиПараметров) Тогда 16 | Возврат Swag_ОбработкаHTTP.ПолучитьОтветОшибки(РезультатПроверкиПараметров, Истина); 17 | КонецЕсли; 18 | 19 | Ответ = Новый HTTPСервисОтвет(200); 20 | СтрокаОтвета = "{ 21 | | ""param1"": """ + Запрос["ПараметрыЗапроса"].Получить("param1") + """, 22 | | ""param2"": """ + Запрос["ПараметрыЗапроса"].Получить("param2") + """ 23 | |}"; 24 | Ответ.Заголовки.Вставить("Content-Type", "application/json"); 25 | Ответ.УстановитьТелоИзСтроки(СтрокаОтвета, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); 26 | 27 | Возврат Swag_ОбработкаHTTP.ПроверитьОтвет("SwagTest_Тестовый_HTTPСервис", "ТестовыйGET", Ответ); 28 | 29 | КонецФункции 30 | 31 | // Комментарий к другому тестовому HTTP сервису. 32 | // 33 | // POST /swagger_test/first 34 | // @summary Отправка каких-то данных в 1С 35 | // @bodyContent {TestPostObject} application/json 36 | // 37 | Функция ТестовыйPOST(Запрос) 38 | 39 | РезультатПроверкиПараметров = Swag_ОбработкаHTTP.ПроверитьПараметры("SwagTest_Тестовый_HTTPСервис", "ТестовыйPOST", Запрос); 40 | Если Не ПустаяСтрока(РезультатПроверкиПараметров) Тогда 41 | Возврат Swag_ОбработкаHTTP.ПолучитьОтветОшибки(РезультатПроверкиПараметров, Истина); 42 | КонецЕсли; 43 | 44 | Ответ = Новый HTTPСервисОтвет(200); 45 | Возврат Ответ; 46 | 47 | КонецФункции 48 | 49 | Функция ОшибкаНетОписанияGET(Запрос) 50 | Ответ = Новый HTTPСервисОтвет(200); 51 | Возврат Swag_ОбработкаHTTP.ПроверитьОтвет("SwagTest_Тестовый_HTTPСервис", "ОшибкаНетОписанияGET", Ответ); 52 | КонецФункции 53 | 54 | Функция ОшибкаНетОтветовGET(Запрос) 55 | Ответ = Новый HTTPСервисОтвет(200); 56 | Возврат Swag_ОбработкаHTTP.ПроверитьОтвет("SwagTest_Тестовый_HTTPСервис", "ОшибкаНетОтветовGET", Ответ); 57 | КонецФункции 58 | 59 | Функция ОшибкаНетНужногоКодаОтветаGET(Запрос) 60 | Ответ = Новый HTTPСервисОтвет(200); 61 | Возврат Swag_ОбработкаHTTP.ПроверитьОтвет("SwagTest_Тестовый_HTTPСервис", "ОшибкаНетНужногоКодаОтветаGET", Ответ); 62 | КонецФункции 63 | 64 | Функция ОшибкаНеЗаданТипMIMEGET(Запрос) 65 | Ответ = Новый HTTPСервисОтвет(200); 66 | Возврат Swag_ОбработкаHTTP.ПроверитьОтвет("SwagTest_Тестовый_HTTPСервис", "ОшибкаНеЗаданТипMIMEGET", Ответ); 67 | КонецФункции 68 | 69 | Функция ОшибкаНекорректныйТипMIMEGET(Запрос) 70 | Ответ = Новый HTTPСервисОтвет(200); 71 | Ответ.Заголовки.Вставить("Content-Type", "text/plain"); 72 | Возврат Swag_ОбработкаHTTP.ПроверитьОтвет("SwagTest_Тестовый_HTTPСервис", "ОшибкаНекорректныйТипMIMEGET", Ответ); 73 | КонецФункции 74 | -------------------------------------------------------------------------------- /swagger-test/HTTPServices/SwagTest_Тестовый_HTTPСервисСВерсияи.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | SwagTest_Тестовый_HTTPСервисСВерсияи 6 | 7 | 8 | ru 9 | Swag test тестовый HTTPСервис с версияи 10 | 11 | 12 | Тестовый HTTPСервис с версияи. Описание взято из комментария 13 | swagger_test_with_versions 14 | AutoUse 15 | 20 16 | 17 | 18 | 19 | 20 | Тестовый 21 | 22 | 23 | ru 24 | Тестовый 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | GET 34 | 35 | 36 | ru 37 | GET 38 | 39 | 40 | 41 | GET 42 | ТестовыйGET 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /swagger-test/HTTPServices/SwagTest_Тестовый_HTTPСервисСВерсияи/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 |  2 | Функция ТестовыйGET(Запрос) 3 | Ответ = Новый HTTPСервисОтвет(200); 4 | Возврат Ответ; 5 | КонецФункции 6 | -------------------------------------------------------------------------------- /swagger-test/Languages/Русский.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Adopted 7 | Русский 8 | 9 | ru 10 | 11 | 12 | -------------------------------------------------------------------------------- /swagger/CommonModules/Swag_Запросы.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_Запросы 6 | 7 | 8 | ru 9 | Запросы 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /swagger/CommonModules/Swag_ОбработкаHTTP.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_ОбработкаHTTP 6 | 7 | 8 | ru 9 | Обработка HTTP 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /swagger/CommonModules/Swag_ОбработкаHTTP/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | #Область ПрограммныйИнтерфейс 2 | 3 | // Проверяет входящие параметры HTTP сервиса на соответствие описанию. 4 | // 5 | // Параметры: 6 | // ИмяСервиса - Строка - Наименование HTTP сервиса как оно задано в конфигураторе. 7 | // ИмяМетода - Строка - Имя метода HTTP сервиса. 8 | // Запрос - HTTPСервисЗапрос - Входящий зпрос HTTP сервиса, который будет проверен на соответствие описанию. 9 | // ЗаписыватьОшибкуВЖурналРегистрации - Булево - Способ обработки несоответствий описания и ответа. 10 | // Истина - запись в журнал регистрации, 11 | // Ложь - в ответе будет возвращен JSON с ошибкой. 12 | // 13 | // Возвращаемое значение: 14 | // Строка - Текст несоответствия HTTP запроса и описания HTTP сервиса 15 | // 16 | Функция ПроверитьПараметры(ИмяСервиса, ИмяМетода, Запрос, ЗаписыватьОшибкуВЖурналРегистрации = Истина) Экспорт 17 | 18 | Попытка 19 | МодульОписанияHTTPСервиса = ОбщегоНазначения.ОбщийМодуль(ИмяСервиса + "Описание"); 20 | Описание = МодульОписанияHTTPСервиса.ПолучитьОписаниеHTTPСервиса(); 21 | Объекты = МодульОписанияHTTPСервиса.ПолучитьОбъектыHTTPСервиса(); 22 | Исключение 23 | Возврат ""; 24 | КонецПопытки; 25 | 26 | ИмяСобытияЖурналаРегистрации = "Swagger: проверка корректности HTTP запроса"; 27 | ТекстМетодСервис = "метода """ + ИмяМетода + """ HTTP сервиса """ + ИмяСервиса + """"; 28 | 29 | СообщениеОбОшибке = ""; 30 | 31 | ОписаниеМетода = ПолучитьЗначениеОписанияМетода(Описание, ИмяМетода, "Описание"); 32 | Если ЗначениеЗаполнено(ОписаниеМетода) Тогда 33 | 34 | ПараметрыМетода = ПолучитьМассивЭлементовОписания(Описание, ИмяМетода, "Параметры"); 35 | Если Запрос.ПараметрыЗапроса.Количество() > 0 И ПараметрыМетода.Количество() = 0 Тогда 36 | СообщениеОбОшибке = НСтр("ru = 'Для " + ТекстМетодСервис + 37 | " были переданы параметры хотя в документации какие-либо параметры описаны не были.'"); 38 | КонецЕсли; 39 | 40 | Для каждого ПараметрЗапроса Из Запрос.ПараметрыЗапроса Цикл 41 | ПараметрМетода = ПолучитьПараметрМетода(ПараметрыМетода, ПараметрЗапроса.Ключ); 42 | Если ПараметрМетода = Неопределено Тогда 43 | СообщениеОбОшибке = НСтр("ru = 'Для " + ТекстМетодСервис + 44 | " был передан параметр с именем """ + ПараметрЗапроса.Ключ + """ для которого отсутствует описание.'"); 45 | КонецЕсли; 46 | Если ПараметрМетода.Устарел Тогда 47 | СообщениеОбОшибке = НСтр("ru = 'Для " + ТекстМетодСервис + 48 | " был передан устаревший параметр с именем """ + ПараметрМетода.Имя + """.'"); 49 | КонецЕсли; 50 | КонецЦикла; 51 | Для каждого ПараметрМетода Из ПараметрыМетода Цикл 52 | Если ПараметрМетода.Обязательный И Запрос.ПараметрыЗапроса.Получить(ПараметрМетода.Имя) = Неопределено Тогда 53 | СообщениеОбОшибке = НСтр("ru = 'Для " + ТекстМетодСервис + 54 | " не был передан обязательный параметр с именем """ + ПараметрМетода.Имя + """.'"); 55 | КонецЕсли; 56 | КонецЦикла; 57 | 58 | ТелоМетода = ПолучитьЗначениеОписанияМетода(Описание, ИмяМетода, "ТелоЗапроса"); 59 | ТелоЗапроса = Запрос.ПолучитьТелоКакСтроку(); 60 | Если ТелоМетода = Неопределено Тогда 61 | Если Не ПустаяСтрока(ТелоЗапроса) Тогда 62 | СообщениеОбОшибке = НСтр("ru = 'Для " + ТекстМетодСервис + 63 | " было передано тело запроса для которого отсутствует описание.'"); 64 | КонецЕсли; 65 | Иначе 66 | Если ПустаяСтрока(ТелоЗапроса) Тогда 67 | СообщениеОбОшибке = НСтр("ru = 'Для " + ТекстМетодСервис + " не было передано тело запроса.'"); 68 | Иначе 69 | // TODO: Пока речь идёт только о JSON. Нужно проработать другие возможные варианты. 70 | СхемаТелаПоMIME = ПолучитьОписаниеТела(ТелоМетода, "application/json"); 71 | Если Не СхемаТелаПоMIME = Неопределено Тогда 72 | 73 | ОбъектТела = ПолучитьОбъектПоИмениСхемы(Объекты, СхемаТелаПоMIME); 74 | Если Не ОбъектТела = Неопределено Тогда 75 | 76 | ЧтениеJSON = Новый ЧтениеJSON; 77 | ЧтениеJSON.УстановитьСтроку(ТелоЗапроса); 78 | 79 | Попытка 80 | ТелоКакСоответствие = ПрочитатьJSON(ЧтениеJSON, Истина); 81 | Исключение 82 | СообщениеОбОшибке = НСтр("ru = 'Для " + ТекстМетодСервис + 83 | " тело запроса не является корректной структурой JSON.'"); 84 | КонецПопытки; 85 | 86 | Если ПустаяСтрока(СообщениеОбОшибке) Тогда 87 | СообщениеОбОшибке = ПроверитьТелоЗапроса(ОбъектТела, ТелоКакСоответствие); 88 | КонецЕсли; 89 | 90 | ЧтениеJSON.Закрыть(); 91 | 92 | Иначе 93 | СообщениеОбОшибке = НСтр("ru = 'Для " + ТекстМетодСервис + 94 | " в описании не определен объект для схемы """ + СхемаТелаПоMIME + """.'"); 95 | КонецЕсли; 96 | 97 | Иначе 98 | СообщениеОбОшибке = НСтр("ru = 'Для " + ТекстМетодСервис + 99 | " в описании не определена схема запроса ""application/json"".'"); 100 | КонецЕсли; 101 | КонецЕсли; 102 | КонецЕсли; 103 | 104 | Иначе 105 | СообщениеОбОшибке = НСтр("ru = 'Отсутствует swagger описание " + ТекстМетодСервис + ".'"); 106 | КонецЕсли; 107 | 108 | Если Не ПустаяСтрока(СообщениеОбОшибке) Тогда 109 | Если ЗаписыватьОшибкуВЖурналРегистрации Тогда 110 | ЗаписьЖурналаРегистрации(ИмяСобытияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка,,, СообщениеОбОшибке); 111 | КонецЕсли; 112 | КонецЕсли; 113 | 114 | Возврат СообщениеОбОшибке; 115 | 116 | КонецФункции 117 | 118 | // Проверяет ответ HTTP сервиса на соответствие описанию. 119 | // 120 | // Параметры: 121 | // ИмяСервиса - Наименование HTTP сервиса как оно задано в конфигураторе. 122 | // ИмяМетода - Имя метода HTTP сервиса. 123 | // Ответ - HTTPСервисОтвет - Подготовленный ответ HTTP сервиса, который будет проверен на соответствие описанию. 124 | // ЗаписыватьОшибкуВЖурналРегистрации - Булево - Способ обработки несоответствий описания и ответа. 125 | // Истина - запись в журнал регистрации, 126 | // Ложь - в ответе будет возвращен JSON с ошибкой. 127 | // 128 | // Возвращаемое значение: 129 | // HTTPСервисОтвет - Ответ HTTP сервиса для отдачи. 130 | // 131 | Функция ПроверитьОтвет(ИмяСервиса, ИмяМетода, Ответ, ЗаписыватьОшибкуВЖурналРегистрации = Истина) Экспорт 132 | 133 | Попытка 134 | МодульОписанияHTTPСервиса = ОбщегоНазначения.ОбщийМодуль(ИмяСервиса + "Описание"); 135 | Описание = МодульОписанияHTTPСервиса.ПолучитьОписаниеHTTPСервиса(); 136 | Объекты = МодульОписанияHTTPСервиса.ПолучитьОбъектыHTTPСервиса(); 137 | Исключение 138 | Возврат Ответ; 139 | КонецПопытки; 140 | 141 | ИмяСобытияЖурналаРегистрации = "Swagger: проверка корректности HTTP ответа"; 142 | ТекстМетодСервис = "метода """ + ИмяМетода + """ HTTP сервиса """ + ИмяСервиса + """"; 143 | 144 | СообщениеОбОшибке = ""; 145 | 146 | ОписаниеМетода = ПолучитьЗначениеОписанияМетода(Описание, ИмяМетода, "Описание"); 147 | Если ЗначениеЗаполнено(ОписаниеМетода) Тогда 148 | 149 | ОтветыМетода = ПолучитьМассивЭлементовОписания(Описание, ИмяМетода, "Ответы"); 150 | Если ОтветыМетода.Количество() > 0 Тогда 151 | 152 | ОтветМетода = ПолучитьОтветПоКоду(ОтветыМетода, Ответ.КодСостояния); 153 | Если ОтветМетода = Неопределено Тогда 154 | СообщениеОбОшибке = НСтр("ru = 'Для " + ТекстМетодСервис + " не определён код ответа " + Ответ.КодСостояния + ".'"); 155 | Иначе 156 | Если ТипЗнч(ОтветМетода.МассивТиповMIME) = Тип("Массив") И ОтветМетода.МассивТиповMIME.Количество() > 0 Тогда 157 | 158 | ТипMIMEОтвета = Ответ.Заголовки.Получить("Content-Type"); 159 | Если ТипMIMEОтвета = Неопределено Тогда 160 | СообщениеОбОшибке = НСтр("ru = 'Для " + ТекстМетодСервис + " в ответе не задан тип MIME.'"); 161 | Иначе 162 | НайденТипMIME = Ложь; 163 | Для каждого ТипMIME Из ОтветМетода.МассивТиповMIME Цикл 164 | Если ТипMIME.Заголовок = ТипMIMEОтвета Тогда 165 | НайденТипMIME = Истина; 166 | Прервать; 167 | КонецЕсли; 168 | КонецЦикла; 169 | Если Не НайденТипMIME Тогда 170 | СообщениеОбОшибке = НСтр("ru = 'Для " + ТекстМетодСервис + 171 | " в ответе возвращается не описанный в документации тип MIME.'"); 172 | КонецЕсли; 173 | КонецЕсли; 174 | 175 | КонецЕсли; 176 | КонецЕсли; 177 | 178 | Иначе 179 | СообщениеОбОшибке = НСтр("ru = 'Не заданы варианты ответов " + ТекстМетодСервис + ".'"); 180 | КонецЕсли; 181 | 182 | Иначе 183 | СообщениеОбОшибке = НСтр("ru = 'Отсутствует swagger описание " + ТекстМетодСервис + ".'"); 184 | КонецЕсли; 185 | 186 | Если Не ПустаяСтрока(СообщениеОбОшибке) Тогда 187 | Если ЗаписыватьОшибкуВЖурналРегистрации Тогда 188 | ЗаписьЖурналаРегистрации(ИмяСобытияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка,,, СообщениеОбОшибке); 189 | Иначе 190 | Возврат ПолучитьОтветОшибки(СообщениеОбОшибке, Ложь); 191 | КонецЕсли; 192 | КонецЕсли; 193 | 194 | Возврат Ответ; 195 | 196 | КонецФункции 197 | 198 | // 199 | // 200 | Функция ПолучитьМассивЭлементовОписания(Описание, Метод, ЭлементОписания) Экспорт 201 | 202 | Параметры = Новый Массив; 203 | 204 | Если ТипЗнч(Описание) = Тип("Массив") Тогда 205 | 206 | Для каждого ДанныеОписания Из Описание Цикл 207 | Если ТипЗнч(ДанныеОписания) = Тип("Структура") И ДанныеОписания.Свойство("Имя") Тогда 208 | Если ДанныеОписания.Имя = Метод И ДанныеОписания.Свойство(ЭлементОписания) Тогда 209 | ПараметрыМетода = Неопределено; 210 | ДанныеОписания.Свойство(ЭлементОписания, ПараметрыМетода); 211 | Если ТипЗнч(ПараметрыМетода) = Тип("Массив") Тогда 212 | Параметры = ПараметрыМетода; 213 | КонецЕсли; 214 | 215 | Прервать; 216 | КонецЕсли; 217 | КонецЕсли; 218 | КонецЦикла; 219 | 220 | КонецЕсли; 221 | 222 | Возврат Параметры; 223 | 224 | КонецФункции 225 | 226 | // 227 | // 228 | Функция ПолучитьЗначениеОписанияМетода(Описание, Метод, ЭлементОписания) Экспорт 229 | 230 | ОписаниеМетода = Неопределено; 231 | 232 | Если ТипЗнч(Описание) = Тип("Массив") Тогда 233 | 234 | Для каждого ДанныеОписания Из Описание Цикл 235 | Если ТипЗнч(ДанныеОписания) = Тип("Структура") И ДанныеОписания.Свойство("Имя") Тогда 236 | Если ДанныеОписания.Имя = Метод И ДанныеОписания.Свойство(ЭлементОписания) Тогда 237 | ЗначениеМетода = Неопределено; 238 | ДанныеОписания.Свойство(ЭлементОписания, ЗначениеМетода); 239 | ОписаниеМетода = ЗначениеМетода; 240 | 241 | Прервать; 242 | КонецЕсли; 243 | КонецЕсли; 244 | КонецЦикла; 245 | 246 | КонецЕсли; 247 | 248 | Возврат ОписаниеМетода; 249 | 250 | КонецФункции 251 | 252 | #КонецОбласти 253 | 254 | #Область СлужебныеПроцедурыИФункции 255 | 256 | Функция ПолучитьОтветПоКоду(ОтветыМетода, Код) 257 | 258 | НайденныйОтветМетода = Неопределено; 259 | 260 | Если ТипЗнч(ОтветыМетода) = Тип("Массив") Тогда 261 | Для каждого ОтветМетода Из ОтветыМетода Цикл 262 | Если ТипЗнч(ОтветМетода) = Тип("Структура") И ОтветМетода.Свойство("Код") Тогда 263 | Если ОтветМетода.Код = Код Тогда 264 | НайденныйОтветМетода = ОтветМетода; 265 | 266 | Прервать; 267 | КонецЕсли; 268 | КонецЕсли; 269 | КонецЦикла; 270 | КонецЕсли; 271 | 272 | Возврат НайденныйОтветМетода; 273 | 274 | КонецФункции 275 | 276 | // Возвращает подготовленный HTTP ответ с ошибкой. 277 | // 278 | // Параметры: 279 | // ТекстОшибки - Строка - Текст ошибки. 280 | // ЭтоЗапрос - Булево - Признак обрабатываемого события. 281 | // Истина - ошибка для входящего запроса, Ложь - для исходящего ответа. 282 | // 283 | // Возвращаемое значение: 284 | // HTTPСервисОтвет - Ответ HTTP сервиса с JSON ошибки. 285 | // 286 | Функция ПолучитьОтветОшибки(ТекстОшибки, ЭтоЗапрос) Экспорт 287 | 288 | ЗаписьJSON = Новый ЗаписьJSON; 289 | ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб); 290 | ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON); 291 | 292 | ЗаписьJSON.ЗаписатьНачалоОбъекта(); 293 | 294 | ЗаписьJSON.ЗаписатьИмяСвойства("subject"); 295 | ЗаписьJSON.ЗаписатьЗначение("Сообщение выдано из-за несоответствия описания HTTP сервиса и параметров " + 296 | ?(ЭтоЗапрос, "запроса", "ответа") + 297 | ". Необходимо привести описание в соответствии с кодом (рекомендуется) или убрать функцию проверки."); 298 | 299 | ЗаписьJSON.ЗаписатьИмяСвойства("message"); 300 | ЗаписьJSON.ЗаписатьЗначение(Строка(ТекстОшибки)); 301 | 302 | ЗаписьJSON.ЗаписатьКонецОбъекта(); 303 | 304 | Ответ = Новый HTTPСервисОтвет(500); 305 | Ответ.Заголовки.Вставить("Content-Type", "application/json"); 306 | Ответ.УстановитьТелоИзСтроки(ЗаписьJSON.Закрыть()); 307 | 308 | Возврат Ответ; 309 | 310 | КонецФункции 311 | 312 | Функция ПолучитьПараметрМетода(ПараметрыМетода, КлючПараметраЗапроса) 313 | 314 | Для каждого ПараметрМетода Из ПараметрыМетода Цикл 315 | Если ПараметрМетода.Имя = КлючПараметраЗапроса Тогда 316 | Возврат ПараметрМетода; 317 | КонецЕсли; 318 | КонецЦикла; 319 | 320 | Возврат Неопределено; 321 | 322 | КонецФункции 323 | 324 | Функция ПолучитьОписаниеТела(ТелоМетода, НаименованиеТипаMIME) 325 | 326 | Для каждого ТипMIME Из ТелоМетода.МассивТиповMIME Цикл 327 | Если ТипMIME.Заголовок = НаименованиеТипаMIME Тогда 328 | // TODO: Возможность работать не только со схемой, но и с типом 329 | Возврат ТипMIME.Схема; 330 | КонецЕсли; 331 | КонецЦикла; 332 | 333 | Возврат Неопределено; 334 | 335 | КонецФункции 336 | 337 | Функция ПолучитьОбъектПоИмениСхемы(ОбъектыСервиса, ПутьКСхеме) 338 | 339 | ЭлементыПутиСхемы = СтрРазделить(ПутьКСхеме, "/"); 340 | ИмяОбъекта = ЭлементыПутиСхемы[ЭлементыПутиСхемы.Количество() - 1]; 341 | 342 | Для каждого ОбъектСервиса Из ОбъектыСервиса Цикл 343 | Если ОбъектСервиса.Имя = ИмяОбъекта Тогда 344 | Возврат ОбъектСервиса; 345 | КонецЕсли; 346 | КонецЦикла; 347 | 348 | Возврат Неопределено; 349 | 350 | КонецФункции 351 | 352 | Функция ПроверитьТелоЗапроса(ОбъектСервиса, ТелоКакСоответствие) 353 | 354 | // TODO: 355 | Возврат ""; 356 | 357 | КонецФункции 358 | 359 | #КонецОбласти 360 | -------------------------------------------------------------------------------- /swagger/CommonModules/Swag_Описание.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_Описание 6 | 7 | 8 | ru 9 | Описание 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /swagger/CommonModules/Swag_Описание/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 |  2 | #Область ПрограммныйИнтерфейс 3 | 4 | // 5 | // 6 | Функция Объект(ИмяОбъекта) Экспорт 7 | 8 | ПроцессорОписаний = Обработки.Swag_ПроцессорОписанийОбъектов.Создать(); 9 | ПроцессорОписаний.Объект(ИмяОбъекта); 10 | 11 | Возврат ПроцессорОписаний; 12 | 13 | КонецФункции 14 | 15 | // 16 | // 17 | Функция Метод(ИмяМетода) Экспорт 18 | 19 | ПроцессорОписаний = Обработки.Swag_ПроцессорОписанийМетодов.Создать(); 20 | ПроцессорОписаний.Метод(ИмяМетода); 21 | 22 | Возврат ПроцессорОписаний; 23 | 24 | КонецФункции 25 | 26 | #КонецОбласти 27 | -------------------------------------------------------------------------------- /swagger/CommonModules/Swag_ФормированиеОписаний.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_ФормированиеОписаний 6 | 7 | 8 | ru 9 | Формирование описаний 10 | 11 | 12 | 13 | false 14 | false 15 | true 16 | false 17 | false 18 | false 19 | false 20 | DontUse 21 | 22 | 23 | -------------------------------------------------------------------------------- /swagger/CommonModules/Swag_ФормированиеОписаний/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | #Область ПрограммныйИнтерфейс 2 | 3 | // Возвращает структуру с описанием параметра HTTP сервиса 4 | // 5 | // Параметры: 6 | // Имя - Строка - наименование параметра 7 | // ОписаниеПараметра - Строка - описание параметра как оно будет выглядеть в документации 8 | // ТипПараметра - Строка - допустимые значения: query, path, header, form 9 | // Обязательный - Булево - признак того что это обязательный параметр 10 | // Устарел - Булево - признак deprecated 11 | // ТипЗначения - Строка - допустимые значения: boolean, string, integer, number, array, object 12 | // 13 | // Возвращаемое значение: 14 | // Структура - описание параметра 15 | // 16 | Функция ОписаниеПараметра(Имя, ОписаниеПараметра, ТипПараметра, Обязательный = Ложь, Устарел = Ложь, 17 | ТипЗначения = "string", Перечисление = Неопределено, МаксимальнаяДлина = Неопределено, 18 | МинимальнаяДлина = Неопределено) Экспорт 19 | 20 | Если ТипПараметра = "path" Тогда 21 | Обязательный = Истина; 22 | КонецЕсли; 23 | 24 | Возврат Новый Структура("Имя, Описание, ТипПараметра, Обязательный, Устарел, ТипЗначения, 25 | |Перечисление, МаксимальнаяДлина, МинимальнаяДлина", 26 | Имя, ОписаниеПараметра, ТипПараметра, Обязательный, Устарел, ТипЗначения, 27 | Перечисление, МаксимальнаяДлина, МинимальнаяДлина) 28 | 29 | КонецФункции 30 | 31 | // Возвращает структуру с описанием ответа HTTP сервиса 32 | // 33 | // Параметры: 34 | // Код - Число - код ответа HTTP (200, 201, 401, 404 и т.д.) 35 | // ОписаниеОтвета - Строка - описание ответа как он будет выглядеть в документации 36 | // МассивТиповMIME - Массив из см. Swag_ФормированиеОписаний.ОписаниеТипаMIME 37 | // 38 | // Возвращаемое значение: 39 | // Структура - описание сервиса 40 | // 41 | Функция ОписаниеОтвета(Код, ОписаниеОтвета, МассивТиповMIME = Неопределено) Экспорт 42 | 43 | Возврат Новый Структура("Код, Описание, МассивТиповMIME", Код, ОписаниеОтвета, МассивТиповMIME) 44 | 45 | КонецФункции 46 | 47 | // Возвращает структуру с описанием типа MIME ответа 48 | // 49 | // Параметры: 50 | // Заголовок - Строка - описание типа MIME (application/json, application/json-patch+json и т.д.) 51 | // Тип - Строка - допустимые значения: string, array 52 | // Схема - Строка - наименование объекта как он задан через функцию ОписаниеОбъекта 53 | // 54 | // Возвращаемое значение: 55 | // Структура - описание MIME ответа 56 | // 57 | Функция ОписаниеТипаMIME(Заголовок, Тип = Неопределено, Схема = Неопределено) Экспорт 58 | 59 | Возврат Новый Структура("Заголовок, Тип, Схема", Заголовок, Тип, 60 | ?(ТипЗнч(Схема) = Тип("Строка"), "#/components/schemas/" + Схема, "")); 61 | 62 | КонецФункции 63 | 64 | // Возвращает структуру с описанием метода HTTP сервиса 65 | // 66 | // Параметры: 67 | // Метод - Строка - наименование метода как он описан в конфигураторе. 68 | // Строится по принципу <Имя шаблона URL><Имя метода> 69 | // ОписаниеМетода - Строка - описание метода как оно будет выглядеть в документации 70 | // Параметры - Массив из см. Swag_ФормированиеОписаний.ОписаниеПараметра 71 | // Ответы - Массив из см. Swag_ФормированиеОписаний.ОписаниеОтвета 72 | // ТелоЗапроса - Структура - применяется для POST, PUT, CONNECT и PATCH 73 | // 74 | // Возвращаемое значение: 75 | // Структура - описание метода HTTP сервиса 76 | // 77 | Функция ОписаниеМетода(Метод, ОписаниеМетода, Параметры, Ответы, ТелоЗапроса = Неопределено) Экспорт 78 | 79 | Возврат Новый Структура("Имя, Описание, Параметры, Ответы, ТелоЗапроса", 80 | Метод, ОписаниеМетода, Параметры, Ответы, ТелоЗапроса) 81 | 82 | КонецФункции 83 | 84 | // Возвращает структуру с описанием объекта (модели) 85 | // 86 | // Параметры: 87 | // Имя - Строка - наименование объекта (модели) 88 | // Тип - Строка - допустимые значения 89 | // МассивСвойств - Массив из см. Swag_ФормированиеОписаний.ОписаниеОбъекта 90 | // ОбязательныеПоля - Строка - наименования полей, разделенные запятыми 91 | // 92 | // Возвращаемое значение: 93 | // Структура - описание объекта (модели) 94 | // 95 | Функция ОписаниеОбъекта(Имя, Тип, МассивСвойств = Неопределено, ОбязательныеПоля = Неопределено) Экспорт 96 | 97 | Возврат Новый Структура("Имя, Тип, МассивСвойств, ОбязательныеПоля", 98 | Имя, Тип, МассивСвойств, ОбязательныеПоля); 99 | 100 | КонецФункции 101 | 102 | // Устарела. Следует использовать ОписаниеРеквизитаОбъекта 103 | // Возвращает структуру с описанием свойства объекта (модели) 104 | // 105 | // Параметры: 106 | // Имя - Строка - наименование свойства объекта (модели) 107 | // ОписаниеСвойства - Строка - описание свойства объекта как оно будет выглядеть в документации 108 | // Nullable - Булево 109 | // Тип - Строка - допустимые значения: boolean, string, integer, number, array, object 110 | // Формат - Строка - допустимые значения: 111 | // для string - byte, binary, date, datetime, password, uuid (последнее в спецификации 112 | // вроде бы нет, но я видел в некоторых реализациях) 113 | // для integer - int32, int64 (последнее аналог long) 114 | // для number - float, double 115 | // Схема - Строка - 116 | // Пример - Строка - 117 | // Перечисление - Массив - 118 | // 119 | // Возвращаемое значение: 120 | // Структура - описание свойства объекта (модели) 121 | // 122 | Функция ОписаниеСвойстваОбъекта(Имя, ОписаниеСвойства, Тип, Nullable = Ложь, Формат = Неопределено, 123 | Схема = Неопределено, Пример = Неопределено, Перечисление = Неопределено) Экспорт 124 | 125 | Возврат Новый Структура("Имя, Описание, Тип, Nullable, Формат, Схема, Пример, Перечисление", 126 | Имя, ОписаниеСвойства, Тип, Nullable, Формат, ?(ТипЗнч(Схема) = Тип("Строка"), "#/components/schemas/" + Схема, ""), 127 | Пример, Перечисление); 128 | 129 | КонецФункции 130 | 131 | // Возвращает минимально заполненную структуру с описанием реквизита объекта (модели) 132 | // 133 | // Параметры: 134 | // Имя - Строка - наименование реквизита объекта (модели) 135 | // Тип - Строка - допустимые значения: boolean, string, integer, number, array, object 136 | // Схема - Строка - название объекта для массива (array) или объекта (object) 137 | // 138 | // Возвращаемое значение: 139 | // Структура - описание свойства объекта (модели) 140 | // 141 | Функция ОписаниеРеквизитаОбъекта(Имя, Тип, Схема = Неопределено) Экспорт 142 | 143 | Если Тип = "array" Или Тип = "object" Тогда 144 | СхемаСПрефиксом = ?(ТипЗнч(Схема) = Тип("Строка"), 145 | "#/components/schemas/" + Схема, Неопределено); 146 | Иначе 147 | СхемаСПрефиксом = Неопределено; 148 | КонецЕсли; 149 | 150 | Возврат Новый Структура("Имя, Тип, Схема, Описание, Nullable, Обязательный, Формат, 151 | |Максимум, Минимум, НеВключаяМаксимум, НеВключаяМинимум, МаксимальнаяДлина, МинимальнаяДлина, 152 | |ПоУмолчанию, Пример, Перечисление", Имя, Тип, СхемаСПрефиксом); 153 | 154 | КонецФункции 155 | 156 | // Возвращает структуру с описанием тела запроса 157 | // 158 | // Параметры: 159 | // ОписаниеТела - Строка - описание тела запроса как оно будет выглядеть в документации 160 | // МассивТиповMIME - Массив из см. Swag_ФормированиеОписаний.ОписаниеТипаMIME 161 | // 162 | // Возвращаемое значение: 163 | // Структура - описание тела запроса 164 | // 165 | Функция ОписаниеТелаЗапроса(ОписаниеТела, МассивТиповMIME = Неопределено) Экспорт 166 | 167 | Возврат Новый Структура("Описание, МассивТиповMIME", ОписаниеТела, МассивТиповMIME); 168 | 169 | КонецФункции 170 | 171 | #КонецОбласти 172 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_favicon_16x16_png.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_favicon_16x16_png 6 | 7 | 8 | ru 9 | favicon-16x16.png 10 | 11 | 12 | 13 | BinaryData 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_favicon_16x16_png/Ext/Template.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zerobig/swagger-1c/298469edd4c9dcedbc704e0f252795f91361690c/swagger/CommonTemplates/Swag_favicon_16x16_png/Ext/Template.bin -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_favicon_32x32_png.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_favicon_32x32_png 6 | 7 | 8 | ru 9 | favicon-32x32.png 10 | 11 | 12 | 13 | BinaryData 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_favicon_32x32_png/Ext/Template.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zerobig/swagger-1c/298469edd4c9dcedbc704e0f252795f91361690c/swagger/CommonTemplates/Swag_favicon_32x32_png/Ext/Template.bin -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_index_html.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_index_html 6 | 7 | 8 | ru 9 | index.html 10 | 11 | 12 | 13 | TextDocument 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_index_html/Ext/Template.txt: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Swagger UI 7 | 8 | 9 | 10 | 31 | 32 | 33 | 34 |
35 | 36 | 37 | 38 | 59 | 60 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_rapidoc_index_html.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_rapidoc_index_html 6 | 7 | 8 | ru 9 | Swag rapidoc index html 10 | 11 | 12 | 13 | TextDocument 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_rapidoc_index_html/Ext/Template.txt: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_rapidoc_min_js.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_rapidoc_min_js 6 | 7 | 8 | ru 9 | Swag rapidoc min js 10 | 11 | 12 | 13 | BinaryData 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_redoc_index_html.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_redoc_index_html 6 | 7 | 8 | ru 9 | Swag redoc index html 10 | 11 | 12 | 13 | TextDocument 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_redoc_index_html/Ext/Template.txt: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Redoc 5 | 6 | 7 | 8 | 9 | 10 | 13 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 30 | 31 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_redoc_standalone_js.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_redoc_standalone_js 6 | 7 | 8 | ru 9 | Swag redoc standalone js 10 | 11 | 12 | 13 | BinaryData 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_scalar_api_reference_js.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_scalar_api_reference_js 6 | 7 | 8 | ru 9 | Swag scalar api reference js 10 | 11 | 12 | 13 | BinaryData 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_scalar_index_html.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_scalar_index_html 6 | 7 | 8 | ru 9 | Swag scalar index html 10 | 11 | 12 | 13 | TextDocument 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_scalar_index_html/Ext/Template.txt: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | Scalar API Reference 5 | 6 | 9 | 10 | 11 | 14 | 15 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_stoplight_elements_styles_min_css.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_stoplight_elements_styles_min_css 6 | 7 | 8 | ru 9 | Swag stoplight elements styles min css 10 | 11 | 12 | 13 | BinaryData 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_stoplight_elements_web_components_min_js.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_stoplight_elements_web_components_min_js 6 | 7 | 8 | ru 9 | Swag stoplight elements web components min js 10 | 11 | 12 | 13 | BinaryData 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_stoplight_index_html.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_stoplight_index_html 6 | 7 | 8 | ru 9 | Swag stoplight index html 10 | 11 | 12 | 13 | TextDocument 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_stoplight_index_html/Ext/Template.txt: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Elements in HTML 7 | 8 | 9 | 10 | 11 | 12 | 13 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_swagger_ui_bundle_js.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_swagger_ui_bundle_js 6 | 7 | 8 | ru 9 | swagger-ui-bundle.js 10 | 11 | 12 | 13 | BinaryData 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_swagger_ui_css.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_swagger_ui_css 6 | 7 | 8 | ru 9 | swagger-ui.css 10 | 11 | 12 | 13 | BinaryData 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/CommonTemplates/Swag_swagger_ui_standalone_preset_js.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_swagger_ui_standalone_preset_js 6 | 7 | 8 | ru 9 | swagger-ui-standalone-preset.js 10 | 11 | 12 | 13 | BinaryData 14 | 15 | 16 | -------------------------------------------------------------------------------- /swagger/Configuration.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 9cd510cd-abfc-11d4-9434-004095e12fc7 7 | b40d6cec-b8e4-422c-9bd4-fc0a7ce17b91 8 | 9 | 10 | 9fcd25a0-4822-11d4-9414-008048da11f9 11 | 46a29df4-e5a6-4dc4-8395-27d754a16cca 12 | 13 | 14 | e3687481-0a87-462c-a166-9f34594f9bba 15 | e25397a5-1013-4d4b-9c84-aa6238973246 16 | 17 | 18 | 9de14907-ec23-4a07-96f0-85521cb6b53b 19 | 25f8dfd3-7ef2-4972-b701-5ce5522d179b 20 | 21 | 22 | 51f2d5d8-ea4d-4064-8892-82951750031e 23 | 46d34b08-e437-45e9-a175-9d3d8fa61034 24 | 25 | 26 | e68182ea-4237-4383-967f-90c1e3370bc7 27 | dfb07a2e-b276-4f10-b327-2194c8174451 28 | 29 | 30 | fb282519-d103-4dd3-bc12-cb271d631dfc 31 | de8f7c03-7779-4b8e-b08c-8597d7c3179f 32 | 33 | 34 | 35 | Adopted 36 | Swagger 37 | 38 | 39 | ru 40 | Swagger 41 | 42 | 43 | 44 | Customization 45 | true 46 | Swag_ 47 | Version8_3_10 48 | ManagedApplication 49 | 50 | PlatformApplication 51 | 52 | Russian 53 | 54 | 1.2.6 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | Русский 63 | Swag_ОсновнаяРоль 64 | Swag_favicon_16x16_png 65 | Swag_favicon_32x32_png 66 | Swag_index_html 67 | Swag_rapidoc_index_html 68 | Swag_rapidoc_min_js 69 | Swag_redoc_index_html 70 | Swag_redoc_standalone_js 71 | Swag_scalar_api_reference_js 72 | Swag_scalar_index_html 73 | Swag_stoplight_elements_styles_min_css 74 | Swag_stoplight_elements_web_components_min_js 75 | Swag_stoplight_index_html 76 | Swag_swagger_ui_bundle_js 77 | Swag_swagger_ui_css 78 | Swag_swagger_ui_standalone_preset_js 79 | Swag_Запросы 80 | Swag_ОбработкаHTTP 81 | Swag_Описание 82 | Swag_ФормированиеОписаний 83 | Swag_Сервис 84 | Swag_ПроцессорОписанийМетодов 85 | Swag_ПроцессорОписанийОбъектов 86 | 87 | 88 | -------------------------------------------------------------------------------- /swagger/DataProcessors/Swag_ПроцессорОписанийМетодов.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 52503cdb-489b-4d4b-9562-75cdd87089a6 7 | 9462aad4-5d10-491e-bab4-e2ed43e57c49 8 | 9 | 10 | ed7285f5-71d8-41cf-937f-74e0cb4ece90 11 | 248ff1b1-455c-4eb8-a60a-da225ca60b83 12 | 13 | 14 | 15 | Swag_ПроцессорОписанийМетодов 16 | 17 | 18 | ru 19 | Процессор описаний методов 20 | 21 | 22 | 23 | true 24 | 25 | 26 | false 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /swagger/DataProcessors/Swag_ПроцессорОписанийМетодов/Ext/ObjectModule.bsl: -------------------------------------------------------------------------------- 1 | Перем СтруктураОписания; 2 | 3 | #Область ПрограммныйИнтерфейс 4 | 5 | #Область Метод 6 | 7 | // 8 | // 9 | Функция Метод(ИмяМетода) Экспорт 10 | 11 | Если ПустаяСтрока(ИмяМетода) Тогда 12 | ВызватьИсключение "Объект: имя метода не может быть пустым"; 13 | КонецЕсли; 14 | 15 | Если СтруктураОписания = Неопределено Тогда 16 | СтруктураОписания = Новый Структура; 17 | КонецЕсли; 18 | 19 | СтруктураОписания.Вставить("ИмяМетода", ИмяМетода); 20 | 21 | ДобавитьПоследнийМетодВМассивМетодов(); 22 | 23 | // Новый текущий объект 24 | СтруктураОписания.Вставить("ТекущийМетод", 25 | Новый Структура("Имя, Описание, Параметры, Ответы, ТелоЗапроса, ДетальноеОписание", ИмяМетода)); 26 | 27 | Возврат ЭтотОбъект; 28 | 29 | КонецФункции 30 | 31 | // 32 | // 33 | Функция ОписаниеМетода(СтрокаОписания) Экспорт 34 | 35 | Если СтруктураОписания = Неопределено Или 36 | Не СтруктураОписания.Свойство("ИмяМетода") Или 37 | ПустаяСтрока(СтруктураОписания.ИмяМетода) Тогда 38 | 39 | ВызватьИсключение "ОписаниеМетода: нельзя задавать описание для неопределенного метода"; 40 | КонецЕсли; 41 | 42 | СтруктураОписания.ТекущийМетод.Описание = СтрокаОписания; 43 | 44 | Возврат ЭтотОбъект; 45 | 46 | КонецФункции 47 | 48 | // 49 | // 50 | Функция ДетальноеОписаниеМетода(СтрокаОписания) Экспорт 51 | 52 | Если СтруктураОписания = Неопределено Или 53 | Не СтруктураОписания.Свойство("ИмяМетода") Или 54 | ПустаяСтрока(СтруктураОписания.ИмяМетода) Тогда 55 | 56 | ВызватьИсключение "ОписаниеМетода: нельзя задавать описание для неопределенного метода"; 57 | КонецЕсли; 58 | 59 | СтруктураОписания.ТекущийМетод.ДетальноеОписание = СтрокаОписания; 60 | 61 | Возврат ЭтотОбъект; 62 | 63 | КонецФункции 64 | 65 | #КонецОбласти 66 | 67 | #Область Параметр 68 | 69 | // 70 | // 71 | Функция ПараметрЗапроса(ИмяПараметра) Экспорт 72 | ДобавитьПараметрВМассивПараметров(ИмяПараметра, "query", "ПараметрЗапроса"); 73 | Возврат ЭтотОбъект; 74 | КонецФункции 75 | 76 | // 77 | // 78 | Функция ПараметрURL(ИмяПараметра) Экспорт 79 | ДобавитьПараметрВМассивПараметров(ИмяПараметра, "path", "ПараметрURL"); 80 | Возврат ЭтотОбъект; 81 | КонецФункции 82 | 83 | // 84 | // 85 | Функция ПараметрЗаголовка(ИмяПараметра) Экспорт 86 | ДобавитьПараметрВМассивПараметров(ИмяПараметра, "header", "ПараметрЗаголовка"); 87 | Возврат ЭтотОбъект; 88 | КонецФункции 89 | 90 | // 91 | // 92 | Функция ПараметрФормы(ИмяПараметра) Экспорт 93 | ДобавитьПараметрВМассивПараметров(ИмяПараметра, "form", "ПараметрФормы"); 94 | Возврат ЭтотОбъект; 95 | КонецФункции 96 | 97 | // 98 | // 99 | Функция ОписаниеПараметра(СтрокаОписания) Экспорт 100 | УстановитьЗначениеСвойстваПараметра("Описание", СтрокаОписания, "ОписаниеПараметра"); 101 | Возврат ЭтотОбъект; 102 | КонецФункции 103 | 104 | // 105 | // 106 | Функция Обязательный() Экспорт 107 | УстановитьЗначениеСвойстваПараметра("Обязательный", Истина, "Обязательный"); 108 | Возврат ЭтотОбъект; 109 | КонецФункции 110 | 111 | // 112 | // 113 | Функция ТипЗначения(Тип) Экспорт 114 | УстановитьЗначениеСвойстваПараметра("ТипЗначения", Тип, "ТипЗначения"); 115 | Возврат ЭтотОбъект; 116 | КонецФункции 117 | 118 | // 119 | // 120 | Функция ЗначениеПеречисления(Значение) Экспорт 121 | 122 | Если СтруктураОписания = Неопределено Или 123 | Не СтруктураОписания.Свойство("ИмяМетода") Или 124 | ПустаяСтрока(СтруктураОписания.ИмяМетода) Тогда 125 | 126 | ВызватьИсключение "ЗначениеПеречисления: нельзя задавать свойство параметра для неопределенного метода"; 127 | КонецЕсли; 128 | Если Не СтруктураОписания.Свойство("ИмяТекущегоПараметра") Или 129 | ПустаяСтрока(СтруктураОписания.ИмяТекущегоПараметра) Тогда 130 | 131 | ВызватьИсключение "ЗначениеПеречисления: нельзя задавать свойство параметра для неопределенного параметра"; 132 | КонецЕсли; 133 | 134 | МассивПеречислений = Новый Массив; 135 | Для каждого Параметр Из СтруктураОписания.ТекущийМетод.Параметры Цикл 136 | Если Параметр.Имя = СтруктураОписания.ИмяТекущегоПараметра И 137 | Параметр.Свойство("Перечисление") И 138 | ТипЗнч(Параметр.Перечисление) = Тип("Массив") Тогда 139 | 140 | МассивПеречислений = Параметр.Перечисление; 141 | Прервать; 142 | КонецЕсли; 143 | КонецЦикла; 144 | 145 | МассивПеречислений.Добавить(Значение); 146 | Параметр.Перечисление = МассивПеречислений; 147 | 148 | Возврат ЭтотОбъект; 149 | 150 | КонецФункции 151 | 152 | // 153 | // 154 | Функция МаксимальнаяДлина(Значение) Экспорт 155 | УстановитьЗначениеСвойстваПараметра("МаксимальнаяДлина", Значение, "МаксимальнаяДлина"); 156 | Возврат ЭтотОбъект; 157 | КонецФункции 158 | 159 | // 160 | // 161 | Функция МинимальнаяДлина(Значение) Экспорт 162 | УстановитьЗначениеСвойстваПараметра("МинимальнаяДлина", Значение, "МинимальнаяДлина"); 163 | Возврат ЭтотОбъект; 164 | КонецФункции 165 | 166 | #КонецОбласти 167 | 168 | #Область Ответ 169 | 170 | // 171 | // 172 | Функция Ответ(КодОтвета) Экспорт 173 | 174 | ПроверитьДанныеМетода("Ответ", "ответ"); 175 | 176 | СтруктураОписания.Вставить("КодТекущегоОтвета", КодОтвета); 177 | 178 | МассивОтветов = Новый Массив; 179 | Если СтруктураОписания.ТекущийМетод.Свойство("Ответы") И 180 | ТипЗнч(СтруктураОписания.ТекущийМетод.Ответы) = Тип("Массив") Тогда 181 | 182 | МассивОтветов = СтруктураОписания.ТекущийМетод.Ответы; 183 | КонецЕсли; 184 | 185 | МассивОтветов.Добавить(Новый Структура("Код, Описание, МассивТиповMIME", КодОтвета)); 186 | СтруктураОписания.ТекущийМетод.Вставить("Ответы", МассивОтветов); 187 | 188 | Возврат ЭтотОбъект; 189 | 190 | КонецФункции 191 | 192 | // 193 | // 194 | Функция ОписаниеОтвета(СтрокаОписания) Экспорт 195 | 196 | ПроверитьДанныеОтвета("ОписаниеОтвета"); 197 | 198 | Для каждого Ответ Из СтруктураОписания.ТекущийМетод.Ответы Цикл 199 | Если Ответ.Код = СтруктураОписания.КодТекущегоОтвета Тогда 200 | Ответ.Описание = СтрокаОписания; 201 | Прервать; 202 | КонецЕсли; 203 | КонецЦикла; 204 | 205 | Возврат ЭтотОбъект; 206 | 207 | КонецФункции 208 | 209 | // 210 | // 211 | Функция ТипОтвета(Заголовок) Экспорт 212 | 213 | ПроверитьДанныеОтвета("ТипОтвета"); 214 | 215 | Для каждого Ответ Из СтруктураОписания.ТекущийМетод.Ответы Цикл 216 | Если Ответ.Код = СтруктураОписания.КодТекущегоОтвета Тогда 217 | МассивТиповMIME = Новый Массив; 218 | Если Ответ.Свойство("МассивТиповMIME") И ТипЗнч(Ответ.МассивТиповMIME) = Тип("Массив") Тогда 219 | МассивТиповMIME = Ответ.МассивТиповMIME; 220 | КонецЕсли; 221 | 222 | МассивТиповMIME.Добавить(Новый Структура("Заголовок, Тип, Схема", Заголовок)); 223 | Ответ.МассивТиповMIME = МассивТиповMIME; 224 | 225 | СтруктураОписания.Вставить("ЗаголовокТекущегоОтвета", Заголовок); 226 | Прервать; 227 | КонецЕсли; 228 | КонецЦикла; 229 | 230 | Возврат ЭтотОбъект; 231 | 232 | КонецФункции 233 | 234 | // 235 | // 236 | Функция СхемаОтвета(ТипОбъекта) Экспорт 237 | 238 | ПроверитьДанныеОтвета("СхемаОтвета"); 239 | Если Не СтруктураОписания.Свойство("ЗаголовокТекущегоОтвета") Или 240 | ПустаяСтрока(СтруктураОписания.ЗаголовокТекущегоОтвета) Тогда 241 | 242 | ВызватьИсключение "СхемаОтвета: нельзя задавать схему ответа для неопределенного типа ответа"; 243 | КонецЕсли; 244 | 245 | Нашли = Ложь; 246 | Для каждого Ответ Из СтруктураОписания.ТекущийМетод.Ответы Цикл 247 | Если Ответ.Код = СтруктураОписания.КодТекущегоОтвета Тогда 248 | Для каждого ТипMIME Из Ответ.МассивТиповMIME Цикл 249 | Если ТипMIME.Заголовок = СтруктураОписания.ЗаголовокТекущегоОтвета Тогда 250 | ТипMIME.Схема = СтрШаблон("#/components/schemas/%1", ТипОбъекта); 251 | 252 | Нашли = Истина; 253 | Прервать; 254 | КонецЕсли; 255 | КонецЦикла; 256 | Если Нашли Тогда 257 | Прервать; 258 | КонецЕсли; 259 | КонецЕсли; 260 | КонецЦикла; 261 | 262 | Возврат ЭтотОбъект; 263 | 264 | КонецФункции 265 | 266 | #КонецОбласти 267 | 268 | #Область Тело 269 | 270 | // 271 | // 272 | Функция Тело(СтрокаОписания = Неопределено) Экспорт 273 | 274 | ПроверитьДанныеМетода("Тело", "тело запроса"); 275 | 276 | СтруктураОписания.ТекущийМетод.Вставить("ТелоЗапроса", 277 | Новый Структура("Описание, МассивТиповMIME", СтрокаОписания)); 278 | 279 | Возврат ЭтотОбъект; 280 | 281 | КонецФункции 282 | 283 | // 284 | // 285 | Функция ТипТела(Заголовок) Экспорт 286 | 287 | ПроверитьДанныеТела("ТипТела"); 288 | 289 | МассивТиповMIME = Новый Массив; 290 | Если СтруктураОписания.ТекущийМетод.ТелоЗапроса.Свойство("МассивТиповMIME") И 291 | ТипЗнч(СтруктураОписания.ТекущийМетод.ТелоЗапроса.МассивТиповMIME) = Тип("Массив") Тогда 292 | 293 | МассивТиповMIME = СтруктураОписания.ТекущийМетод.ТелоЗапроса.МассивТиповMIME; 294 | КонецЕсли; 295 | 296 | МассивТиповMIME.Добавить(Новый Структура("Заголовок, Тип, Схема", Заголовок)); 297 | СтруктураОписания.ТекущийМетод.ТелоЗапроса.МассивТиповMIME = МассивТиповMIME; 298 | 299 | СтруктураОписания.Вставить("ЗаголовокТелаЗапроса", Заголовок); 300 | 301 | Возврат ЭтотОбъект; 302 | 303 | КонецФункции 304 | 305 | // 306 | // 307 | Функция СхемаТела(ТипОбъекта) Экспорт 308 | 309 | ПроверитьДанныеТела("ТипТела"); 310 | 311 | Для каждого ТипMIME Из СтруктураОписания.ТекущийМетод.ТелоЗапроса.МассивТиповMIME Цикл 312 | Если ТипMIME.Заголовок = СтруктураОписания.ЗаголовокТелаЗапроса Тогда 313 | ТипMIME.Схема = СтрШаблон("#/components/schemas/%1", ТипОбъекта); 314 | Прервать; 315 | КонецЕсли; 316 | КонецЦикла; 317 | 318 | Возврат ЭтотОбъект; 319 | 320 | КонецФункции 321 | 322 | #КонецОбласти 323 | 324 | // 325 | // 326 | Функция Сформировать() Экспорт 327 | 328 | ДобавитьПоследнийМетодВМассивМетодов(); 329 | 330 | МассивОписанийМетодов = Новый Массив; 331 | Если СтруктураОписания.Свойство("МассивМетодов") И 332 | ТипЗнч(СтруктураОписания.МассивМетодов) = Тип("Массив") Тогда 333 | 334 | Для каждого Метод Из СтруктураОписания.МассивМетодов Цикл 335 | 336 | Описание = Метод.Описание; 337 | Если ЗначениеЗаполнено(Метод.ДетальноеОписание) Тогда 338 | Описание = Новый Структура("Описание, ДетальноеОписание", 339 | Метод.Описание, Метод.ДетальноеОписание); 340 | КонецЕсли; 341 | 342 | МассивОписанийМетодов.Добавить( 343 | Swag_ФормированиеОписаний.ОписаниеМетода(Метод.Имя, Описание, 344 | Метод.Параметры, Метод.Ответы, Метод.ТелоЗапроса)); 345 | 346 | КонецЦикла; 347 | КонецЕсли; 348 | 349 | Возврат МассивОписанийМетодов; 350 | 351 | КонецФункции 352 | 353 | #КонецОбласти 354 | 355 | #Область СлужебныеПроцедурыИФункции 356 | 357 | Процедура ДобавитьПоследнийМетодВМассивМетодов() 358 | 359 | Если СтруктураОписания.Свойство("ТекущийМетод") И 360 | ТипЗнч(СтруктураОписания.ТекущийМетод) = Тип("Структура") 361 | И Не СтруктураОписания.ТекущийМетод.Количество() = 0 Тогда 362 | 363 | МассивМетодов = Новый Массив; 364 | Если СтруктураОписания.Свойство("МассивМетодов") И 365 | ТипЗнч(СтруктураОписания.МассивМетодов) = Тип("Массив") Тогда 366 | 367 | МассивМетодов = СтруктураОписания.МассивМетодов; 368 | КонецЕсли; 369 | 370 | МассивМетодов.Добавить(СтруктураОписания.ТекущийМетод); 371 | СтруктураОписания.Вставить("МассивМетодов", МассивМетодов); 372 | КонецЕсли; 373 | 374 | КонецПроцедуры 375 | 376 | Процедура ДобавитьПараметрВМассивПараметров(ИмяПараметра, ТипПараметра, НазваниеПроцедуры) 377 | 378 | Если СтруктураОписания = Неопределено Или 379 | Не СтруктураОписания.Свойство("ИмяМетода") Или 380 | ПустаяСтрока(СтруктураОписания.ИмяМетода) Тогда 381 | 382 | ВызватьИсключение СтрШаблон("%1: нельзя задавать параметр для неопределенного метода", 383 | НазваниеПроцедуры); 384 | КонецЕсли; 385 | Если ПустаяСтрока(ИмяПараметра) Тогда 386 | ВызватьИсключение СтрШаблон("%1: имя параметра не может быть пустым", НазваниеПроцедуры); 387 | КонецЕсли; 388 | 389 | СтруктураОписания.Вставить("ИмяТекущегоПараметра", ИмяПараметра); 390 | 391 | МассивПараметров = Новый Массив; 392 | Если СтруктураОписания.ТекущийМетод.Свойство("Параметры") И 393 | ТипЗнч(СтруктураОписания.ТекущийМетод.Параметры) = Тип("Массив") Тогда 394 | 395 | МассивПараметров = СтруктураОписания.ТекущийМетод.Параметры; 396 | КонецЕсли; 397 | 398 | Обязательный = Ложь; 399 | Если ТипПараметра = "path" Тогда 400 | Обязательный = Истина; 401 | КонецЕсли; 402 | 403 | МассивПараметров.Добавить(Новый Структура("Имя, Описание, ТипПараметра, Обязательный, 404 | |Устарел, ТипЗначения, Перечисление, МаксимальнаяДлина, МинимальнаяДлина", 405 | ИмяПараметра, , ТипПараметра, Обязательный)); 406 | СтруктураОписания.ТекущийМетод.Вставить("Параметры", МассивПараметров); 407 | 408 | КонецПроцедуры 409 | 410 | Процедура УстановитьЗначениеСвойстваПараметра(ИмяСвойстваПараметра, Значение, НазваниеПроцедуры) 411 | 412 | Если СтруктураОписания = Неопределено Или 413 | Не СтруктураОписания.Свойство("ИмяМетода") Или 414 | ПустаяСтрока(СтруктураОписания.ИмяМетода) Тогда 415 | 416 | ВызватьИсключение СтрШаблон("%1: нельзя задавать свойство параметра для неопределенного метода", 417 | НазваниеПроцедуры); 418 | КонецЕсли; 419 | Если Не СтруктураОписания.Свойство("ИмяТекущегоПараметра") Или 420 | ПустаяСтрока(СтруктураОписания.ИмяТекущегоПараметра) Тогда 421 | 422 | ВызватьИсключение СтрШаблон("%1: нельзя задавать свойство параметра для неопределенного параметра", 423 | НазваниеПроцедуры); 424 | КонецЕсли; 425 | 426 | Для каждого Параметр Из СтруктураОписания.ТекущийМетод.Параметры Цикл 427 | Если Параметр.Имя = СтруктураОписания.ИмяТекущегоПараметра Тогда 428 | Параметр[ИмяСвойстваПараметра] = Значение; 429 | Прервать; 430 | КонецЕсли; 431 | КонецЦикла; 432 | 433 | КонецПроцедуры 434 | 435 | Процедура ПроверитьДанныеОтвета(НазваниеПроцедуры) 436 | 437 | ПараметрШаблона = "свойство ответа"; 438 | ПроверитьДанныеМетода(НазваниеПроцедуры, ПараметрШаблона); 439 | Если Не СтруктураОписания.Свойство("КодТекущегоОтвета") Или 440 | Не ЗначениеЗаполнено(СтруктураОписания.КодТекущегоОтвета) Тогда 441 | 442 | ВызватьИсключение СтрШаблон("%1: нельзя задавать %2 для неопределенного ответа", 443 | НазваниеПроцедуры); 444 | КонецЕсли; 445 | 446 | КонецПроцедуры 447 | 448 | Процедура ПроверитьДанныеТела(НазваниеПроцедуры) 449 | 450 | ПараметрШаблона = "тип тела запроса"; 451 | ПроверитьДанныеМетода(НазваниеПроцедуры, ПараметрШаблона); 452 | Если Не СтруктураОписания.ТекущийМетод.Свойство("ТелоЗапроса") Или 453 | Не ТипЗнч(СтруктураОписания.ТекущийМетод.ТелоЗапроса) = Тип("Структура") Тогда 454 | 455 | ВызватьИсключение СтрШаблон("%1: нельзя задавать %2 для неопределенного тела", 456 | НазваниеПроцедуры, ПараметрШаблона); 457 | КонецЕсли; 458 | 459 | КонецПроцедуры 460 | 461 | Процедура ПроверитьДанныеМетода(НазваниеПроцедуры, ПараметрШаблона) 462 | 463 | Если СтруктураОписания = Неопределено Или 464 | Не СтруктураОписания.Свойство("ИмяМетода") Или 465 | ПустаяСтрока(СтруктураОписания.ИмяМетода) Тогда 466 | 467 | ВызватьИсключение СтрШаблон("%1: нельзя задавать %2 для неопределенного метода", 468 | НазваниеПроцедуры, ПараметрШаблона); 469 | КонецЕсли; 470 | 471 | КонецПроцедуры 472 | 473 | #КонецОбласти 474 | -------------------------------------------------------------------------------- /swagger/DataProcessors/Swag_ПроцессорОписанийОбъектов.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 5c26a926-3456-4ec2-bc77-359d8d5b047c 7 | 6095f9e8-eb26-4c9e-ae53-f1e4abec9e9c 8 | 9 | 10 | c4fcfa66-fba7-45bd-8401-295f84714f82 11 | 21d85d71-d606-4ca4-95d3-04af3cf54843 12 | 13 | 14 | 15 | Swag_ПроцессорОписанийОбъектов 16 | 17 | 18 | ru 19 | Процессор описаний объектов 20 | 21 | 22 | 23 | true 24 | 25 | 26 | false 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /swagger/HTTPServices/Swag_Сервис.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_Сервис 6 | 7 | 8 | ru 9 | Swagger сервис 10 | 11 | 12 | 13 | swagger 14 | AutoUse 15 | 20 16 | 17 | 18 | 19 | 20 | SwaggerFile 21 | 22 | 23 | ru 24 | Swagger file 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | GET 34 | 35 | 36 | ru 37 | GET 38 | 39 | 40 | 41 | GET 42 | SwaggerFileGET 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /swagger/HTTPServices/Swag_Сервис/Ext/Module.bsl: -------------------------------------------------------------------------------- 1 | // Возвращает файлы swagger-ui из соответствующих макетов 2 | // 3 | Функция SwaggerFileGET(Запрос) 4 | 5 | Возврат Swag_Запросы.ПолучитьSwaggerFileGET(Запрос); 6 | 7 | КонецФункции 8 | -------------------------------------------------------------------------------- /swagger/Languages/Русский.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | Adopted 7 | Русский 8 | 9 | ru 10 | 11 | 12 | -------------------------------------------------------------------------------- /swagger/Roles/Swag_ОсновнаяРоль.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Swag_ОсновнаяРоль 6 | 7 | 8 | ru 9 | Основная роль Swagger 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /swagger/Roles/Swag_ОсновнаяРоль/Ext/Rights.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | true 4 | true 5 | true 6 | 7 | DataProcessor.Swag_ПроцессорОписанийМетодов 8 | 9 | Use 10 | true 11 | 12 | 13 | View 14 | true 15 | 16 | 17 | 18 | DataProcessor.Swag_ПроцессорОписанийОбъектов 19 | 20 | Use 21 | true 22 | 23 | 24 | View 25 | true 26 | 27 | 28 | 29 | HTTPService.Swag_Сервис.URLTemplate.SwaggerFile.Method.GET 30 | 31 | Use 32 | true 33 | 34 | 35 | --------------------------------------------------------------------------------