Запускаем Swagger внутри 1С

18.08.23

Разработка - Инструментарий разработчика

Библиотека для написания и тестирования документации к http-сервисам с помощью Swagger.

Скачать исходный код

Наименование Файл Версия Размер
OpenAPI.cfe
.cfe 15,83Mb
15
.cfe 0.0.8 15,83Mb 15 Скачать

На Инфостарте хватает публикаций на тему Swagger и 1C. Долгое время я пользовался Swagger для 1С и даже дорабатывал формат комментариев и парсер под свои нужды. Инструмент отличный, но гибкости не хватало. 

В итоге родилась небольшая библиотека, которая позволяет программисту описать документацию буквально в несколько строк. Хотя вру, строк может быть довольно много, но пишется такая документация быстро. 

 

 

Как это работает?

Главным объектом библиотеки является Сервис, который может включать в себя любое количество шаблонов URL, что позволяет объединять документацию для довольно разных API в один документ.

Сервис = Обработки.oapi_Сервис.Создать();
Сервис.КраткоеОписание = "Бар ""Бухарин""";
Сервис.ПолноеОписание = "API нашего замечательного бара";
Сервис.ИспользоватьСхемыДанных = Истина;
Сервис.ДобавитьСервер("https://api.buhbuharin.io/");

Шаблон URL описывает конечный адрес (endpoint) http-cервиса

Шаблон = Сервис.ДобавитьШаблонURL("/shot", "Метод для заказа напитка");

В шаблон добавляются варианты возможных запросов и ответов.

Объект Сервис имеет методы ТипСтруктура, ТипСоответствие, ТипМассив, ТипЧисло, ТипСтрока, которые возращают "обертки" над встроенными типами. Обертка нужна, чтобы добавлять нормально описание типов и задавать схемы данных.

Метод = Шаблон.ДобавитьМетод("POST", "Заказ напитка");
Метод.ПолноеОписание  = "Возвращает цену напитка";

// Описываем тело входящего запроса
Заказ = Сервис.ТипСтруктура("Данные заказа", "Order");
Заказ.Вставить("drink_name" , Сервис.ТипСтрока("Водочка", "Название напитка"));
Заказ.Вставить("count" , Сервис.ТипЧисло(5, "Количество шотов", Ложь));
Метод.ДобавитьВариантЗапроса("Заказ напитка").ДобавитьДанные(Заказ);

// Описываем структуру возвращаемых данных
ДанныеЗаказа = Сервис.ТипСтруктура("Информация о напитке", "OrderInfo");
ДанныеЗаказа.Вставить("drink_name", Сервис.ТипСтрока("Водочка", "Название напитка"));
ДанныеЗаказа.Вставить("count"     , Сервис.ТипЧисло(5, "Количество шотов"));
ДанныеЗаказа.Вставить("price"     , Сервис.ТипЧисло(120.40, "Цена"));
ДанныеЗаказа.Вставить("sum"       , Сервис.ТипЧисло(602, "Сумма заказа"));

// Добавляем варианты ответов
Метод.ДобавитьВариантОтвета(200, "Успешное выполнение").ДобавитьДанные(ДанныеЗаказа);

В конце остается вызвать лишь один метод нашего сервиса и на выходе получить описание в формате JSON

ОписаниеJSON = Сервис.ПолучитьОписаниеOpenAPI();
А можно еще проще?

Можно не использовать расширенные типы, код станет проще, но тогда придется отказаться от схем данных и у полей не будет описания.

Сервис.ИспользоватьСхемыДанных = Ложь;

// Описываем структуру возвращаемых данных
ДанныеЗаказа = Новый Структура();
ДанныеЗаказа.Вставить("drink_name", "Водочка");
ДанныеЗаказа.Вставить("count"     , 5);
ДанныеЗаказа.Вставить("price"     , 120.40);
ДанныеЗаказа.Вставить("sum"       , 602);
Ответ = Сервис.ПреобразоватьТипы1СВРасширенныеТипы(ДанныеЗаказа);

// Добавляем варианты ответов
Метод.ДобавитьВариантОтвета(200, "Успешное выполнение").ДобавитьДанные(Ответ);

Зато при таком подходе ответ можно брать из реальной функции, получающей данные для http-сервиса.

Сервис.ИспользоватьСхемыДанных = Ложь;

// Описываем структуру возвращаемых данных
ДанныеЗаказа = БухаринСервисы.ПолучитьДанныеЗаказа(Запрос);
Ответ = Сервис.ПреобразоватьТипы1СВРасширенныеТипы(ДанныеЗаказа);

// Добавляем варианты ответов
Метод.ДобавитьВариантОтвета(200, "Успешное выполнение").ДобавитьДанные(Ответ);
А если еще проще?

Можно не добавлять вручную каждый шаблон и каждый метод. Библиотека умеет загружать структуру http-сервисов из конфигурации, после чего остается только добавить данные в методы.

// Получаем все сервисы из конфигурации
Сервис.ЗагрузитьСервисыИзКонфигурации();
Метод = Сервис.ПолучитьМетод("Бар", "ЗаказатьШот", "POST");
Метод.ДобавитьВариантОтвета(200, "Успешное выполнение").ДобавитьДанные(Ответ);

// Загружаем только определенные http-сервисы
ПараметрыЗагрузки = Сервис.ПараметрыЗагрузкиСервисовИзКонфигурации();
ПараметрыЗагрузки.ВключатьСервисы.Добавить("Бар");
Сервис.ЗагрузитьСервисыИзКонфигурации(ПараметрыЗагрузки);
Как подключить?

Добавляете расширение в конфигурацию, снимаете Безопасный режим, добавляете пользователю роль OpenAPI и пользуетесь.

В расширение встроена обработка для демонстрации возможностей, имеющая Swagger Editor прямо на борту.

В обработке и общем модуле oapi_Документация можно "пощупать" демонстрационные примеры.

А можно сразу начать писать документацию к своим сервисам с помощью встроенного редактора.

Да что там писать, можно сразу и тестировать тут же.

Ну или просто любоваться полученным JSON

Что с этим делать потом?

Тут есть несколько вариантов:

  • Делаем http-сервис, который отдает нам JSON. Снаружи дергаем сервис, и полученный файл прокидываем внутрь Docker. Радуемся сами или радуем потребителя(ей) нашего API
  • Делаем общий модуль, который формирует файлы для всех потребителей наших API, загружаем файлы на какой-нибудь общедоступный ресурс и скидываем потребителю ссылку вида https://editor.swagger.io/?url=https://example.com/api.json
Тестировалось в следующих условиях:

ОС Windows 10 x64, релизы платформы 8.3.17.1386, 8.3.18.891, 8.3.20.1838. Swagger Editor и консоль кода на linux, возможно, заработают, но нужен напильник.

Особенности:
  • Поддерживается версия Open API 3.0.3, но не в полном объеме. Например, в спецификацию не вставляются контакты и ссылки на внешние документы
  • Авторизация поддерживается только Basic Access
  • По некоторым причинам у расширения указан режим совместимости 8.3.10
Связанные публикации:
Исходники:

Исходники можно взять тут https://github.com/salexdv/swagger_1c

Swagger API документация Open API

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    127543    688    389    

740

Infostart PrintWizard - создание и редактирование печатных форм в 1С 8.3

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 руб.

06.10.2023    8503    25    6    

47

Infostart УДиФ: Управление данными и формами 1С

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 руб.

10.11.2023    4809    12    2    

38

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 руб.

14.01.2013    179039    1086    0    

863

Бустер Конвертации данных 3 (Infostart Toolkit)

Инструментарий разработчика 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 руб.

07.10.2021    15142    3    12    

38

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    100027    239    97    

298

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28463    4    10    

16

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18569    6    8    

40
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. 0ct0ber 09.08.23 09:23 Сейчас в теме
Интересное решение, плюсанул. Но как по мне, лучше потратить немного времени на изучение OpenAPI. При разработке спецификации возникнет потребность в конструкциях, которые не реализованы у автора.
2. salexdv 2334 09.08.23 09:31 Сейчас в теме
(1) Буду рад, если вы напишите, что это за конструкции, чтобы расширить возможности библиотеки.
baracuda; +1 Ответить
4. 0ct0ber 09.08.23 09:48 Сейчас в теме
(2)oneof-anyof-allof-not Сам сталкивался с необходимостью реализации конструкции oneOf. Может это и редкий кейс, но встретить можно.
8. salexdv 2334 09.08.23 10:14 Сейчас в теме
(4) Согласен, что такого нет, но реализовать такое тоже можно. Отчасти, сейчас это решается добавлением примеров (отдельный метод). Еще нет перечислений т.е. возможных значений поля, но скоро появятся.
3. starik-2005 3040 09.08.23 09:43 Сейчас в теме
А по метаданным оно не умеет ходить и рисовать АПИ самостоятельно? Вроде бы еще один шаг - и роботы захватят мир. Не?
5. salexdv 2334 09.08.23 09:48 Сейчас в теме
(3) Увы но нет, поэтому еще один шаг и останутся только роботы и 1Сники. Умеет ходить по исходникам и собирать документацию из описания функций Swagger для 1С
6. starik-2005 3040 09.08.23 10:03 Сейчас в теме
(5)
нет
А что мешает?
Для Каждого Ст ИЗ Метаданные.HTTPСервисы Цикл
  //... много интересных слов
КонецЦикла;
Для Каждого Ст ИЗ Метаданные.WebСервисы Цикл
  //... еще больше интересных слов
КонецЦикла;
7. salexdv 2334 09.08.23 10:10 Сейчас в теме
(6) В этом плане, конечно, ничего не мешает, но такой подход позволяет всего лишь описать структуру шаблонов URL, а самое ценное - это описание данных, которые ожидает на вход http-сервис и которые он отдает потребителю. Сама по себе документация, где описаны только конечные адреса API и методы (GET/POST) по сути бесполезна.
9. starik-2005 3040 09.08.23 10:36 Сейчас в теме
(7) Ну так параметры описаны и у них даже комменты есть, полагаю. Сам по себе скелет, в который останется лишь вписать инфу о методе и параметрах, уже сократит кучу работы.
10. salexdv 2334 09.08.23 11:06 Сейчас в теме
(9) Параметры описаны, вот только как достать исходники, не выгружая конфигурацию, чтобы добраться до этого описания?
Можно сделать скелет, но кода всё равно не станет меньше т.к. для добавления данных всё равно из скелета надо вытянуть шаблон/метод.
Вместо кода
Шаблон = Сервис.ДобавитьШаблонURL("/shot");
Метод = Шаблон.ДобавитьМетод("POST");

Будет код
Метод = Сервис.ПолучитьМетод("/shot", "POST");

Вроде бы съекономили, вот только код создания склелета тоже дело непростое. Например, в моей базе есть куча http-сервисов, но не все они для одного потребителя, и о некоторых из сервисов потребителю знать не надо, поэтому создавать скелет надо с отпределенными фильтрами.
Но PR всё равно приму с удовольствием :-)
11. starik-2005 3040 09.08.23 11:39 Сейчас в теме
(10)
Вроде бы съекономили
Мне кажется, что все не так нужно делать. Будь, как говорится, проще:
1. Получаем скелет всех сервисов и всех методов со всеми параметрами. Можно даже в какое-нить соответствие, чтобы по ключу можно было бы сразу проверять, если ли такой сервис и такой метод/параметр метода/что за параметр (урл или именно параметр).
2. Дальше по сервису/методу/параметру заполняем инфу.
3. Отправляем рендерится в сваггер.

Типа так:
СоответствиеВебСервисов = ПолучитьГлобальноеСоответствиеВебСервисов();
// на выходе у нас СоответствиеВебСервисов[ИмяСервиса][ИмяМетода].СтруктураСОписанием.Свойства[ИмяСвойства].СтруктураСОписанием...
СоответствиеВебСервисов["TestCase"]["Test"].Описание = "БлаБлаБла";
jsonForSwagger = ЗарендеритьВДжиСан(СоответствиеВебСервисов);

Как-то так...
12. salexdv 2334 09.08.23 11:47 Сейчас в теме
(11) Ну я тоже самое и написал, Просто соответствие соответствий (структур) скрыто за объектом
Сервис.ПолучитьМетод("/shot", "POST").Описание = "БлаБлаБла";

Это можно добавить, но повторюсь, тут главная проблема как фильтровать для разных потребителей описания сервисов. Придется в ПолучитьГлобальноеСоответствиеВебСервисов передавать какие-нибудь фильтры, чтобы на выходе получить только нужные адреса и методы.
13. starik-2005 3040 09.08.23 12:00 Сейчас в теме
(12)
передавать какие-нибудь фильтры
Да список сервисов/методов передавать - не виду проблем. Заодно система проверит, есть они там или нет ))) По крайней мере все будет взято не из головы разраба, а из матеданных конфы, которая может поменяться внезапнее грозы на чистом небе...
triviumfan; salexdv; +2 Ответить
15. salexdv 2334 09.08.23 22:13 Сейчас в теме
(3) Добавил загрузку из конфигурации. Теперь можно сделать так:
Сервис.ЗагрузитьСервисыИзКонфигурации();
Метод = Сервис.ПолучитьМетод("Бар", "ЗаказатьШот", "POST");
Метод.ДобавитьВариантОтвета(200, "Успешное выполнение").ДобавитьДанные(Ответ);
artbear; starik-2005; +2 Ответить
14. pyrkin_vanya 488 09.08.23 12:46 Сейчас в теме
Шикарно, спасибо. Как раз нужно делать описание к http-сервису. + однозначано.
16. malikov_pro 1296 10.08.23 08:19 Сейчас в теме
(13) Хранить в метаданных неудобно, функционал сильно ограничен

готовый генератор
https://infostart.ru/1c/articles/1136245/

вариант реализовать маршрутизацию и обработку кодом (реализовано), брать описание из обработчиков (нужно реализовывать)
https://infostart.ru/1c/articles/1131305/

вариант генерировать сервис от описания OpenAPI
https://infostart.ru/1c/tools/1257654/
artbear; triviumfan; JohnyDeath; +3 Ответить
17. it_depDi 14.08.23 20:46 Сейчас в теме
Хорошая идея, если соединить с коннектором или любым распространенным решением для 1с в качестве расширения (скажем, универсальным инструментам) - было бы удобно развивать и поддерживать
18. van_za 246 18.08.23 12:46 Сейчас в теме
Выглядит как полезная фича, нужно попробовать, спасибо!!!
19. Aleskey_K 35 21.11.23 15:57 Сейчас в теме
Добрый день

Пробую описывать структуру, но заметил, что в тип "массив" попадает только первый элемент. В примерах не нашёл ничего подходящего.
Оставьте свое сообщение