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

18.08.23

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
OpenAPI.cfe
.cfe 15,83Mb ver:0.0.8
21
21 Скачать (1 SM) Купить за 1 850 руб.

На Инфостарте хватает публикаций на тему 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

См. также

SALE! %

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

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

12000 10000 руб.

02.09.2020    164884    914    402    

889

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 руб.

20.08.2024    9828    81    35    

90

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

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

22200 руб.

06.10.2023    16236    39    9    

75

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

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    24935    81    48    

125

SALE! %

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

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

15000 10000 руб.

10.11.2023    11024    40    27    

66

SALE! %

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

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

4800 3840 руб.

14.01.2013    189414    1146    0    

916

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

2220 руб.

21.02.2023    8286    8    38    

24

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

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

5000 руб.

07.02.2018    103529    244    100    

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

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

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

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

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

Это можно добавить, но повторюсь, тут главная проблема как фильтровать для разных потребителей описания сервисов. Придется в ПолучитьГлобальноеСоответствиеВебСервисов передавать какие-нибудь фильтры, чтобы на выходе получить только нужные адреса и методы.
13. starik-2005 3093 09.08.23 12:00 Сейчас в теме
(12)
передавать какие-нибудь фильтры
Да список сервисов/методов передавать - не виду проблем. Заодно система проверит, есть они там или нет ))) По крайней мере все будет взято не из головы разраба, а из матеданных конфы, которая может поменяться внезапнее грозы на чистом небе...
triviumfan; salexdv; +2 Ответить
15. salexdv 2360 09.08.23 22:13 Сейчас в теме
(3) Добавил загрузку из конфигурации. Теперь можно сделать так:
Сервис.ЗагрузитьСервисыИзКонфигурации();
Метод = Сервис.ПолучитьМетод("Бар", "ЗаказатьШот", "POST");
Метод.ДобавитьВариантОтвета(200, "Успешное выполнение").ДобавитьДанные(Ответ);
artbear; starik-2005; +2 Ответить
14. pyrkin_vanya 493 09.08.23 12:46 Сейчас в теме
Шикарно, спасибо. Как раз нужно делать описание к http-сервису. + однозначано.
16. malikov_pro 1325 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 269 18.08.23 12:46 Сейчас в теме
Выглядит как полезная фича, нужно попробовать, спасибо!!!
19. Aleskey_K 35 21.11.23 15:57 Сейчас в теме
Добрый день

Пробую описывать структуру, но заметил, что в тип "массив" попадает только первый элемент. В примерах не нашёл ничего подходящего.
20. OlegK 55 22.05.24 23:20 Сейчас в теме
Добрый день!

Пытаемся все повторить, но споткнулись на установке oscript upload.os

Ошибка:
oscript C:\inetpub\wwwroot\swagger-master\simple-ui\upload.os -name Swagger -path e:\Temp\SimpleConfig.cf -type xml -adminurl https://rps-wy.xyz/swagger-ui/dist/ -encoding=UTF-8

{?????? C:\inetpub\wwwroot\swagger-master\simple-ui\upload.os / ?????? ? ??????: 2,0 / ?????????? ?? ???????: 'cmdline'}


И непонятно что с кодировкой делать. Никак не получется понять, что за ошибка или сообщение.

Спасибо!
Прикрепленные файлы:
21. OlegK 55 23.05.24 22:47 Сейчас в теме
(20) Вот ошибка. Не хватает библиотеки cmdline
Что это? Как установить?

Спасибо!
Прикрепленные файлы:
22. OlegK 55 02.06.24 06:14 Сейчас в теме
Добрый день!


Делали все по инструкции, споткнулись на шаге загрузки конфигурации с oscript. Разворачивали на сервере, поэтому наша команда выглядит примерно вот так:
oscript d:\Oscript\upload.os -name SwaggerAPI -path e:\Temp\EmptyConfig.cf -type xml -adminurl http://localhost/onec-swagger-admin/ -host 127.0.0.1 -onecbase TEST_BASE
команда проходит без ошибок, но вместо структура как в примере получаем "No API definition provided" (см.скрин). Пробовали и на болванке как в примере и на http c прописанными структурами возврата - ничего.
До этого шага все соответствовало описанию в статье (отображался шаблон PetStore).
Подскажите плз в какую сторону копать? Может в файлах с гита нужно что-то дополнительно заполнить?
Прикрепленные файлы:
23. user1738091 24.09.24 16:25 Сейчас в теме
может я не увидел.... А есть ли сравнение между собой версий сервисов? Например такая задача - есть сервис, там н-ное количество полей и типов и после автоматизации забываем про все это на год например, потом все "вдруг" падает и перестает работать, в итоге после перебора полей выясняем, что добавили или новое поле или поменяли тип у старого и поэтому перестало работать все.
Оставьте свое сообщение