Некоторые размышления об организации API. Строим диалог систем

10.03.26

Интеграция - WEB-интеграция

В 1998 году впервые разработчики сайта попросили у меня «Отдай всё, что у тебя есть в 1С». Некоторые читатели с тех пор родились, выросли и сами услышали такую просьбу. Создание API сродни диалогу с иностранцем в отсутствие общего языка. Мы, 1Сники, не знаем архитектуру условного Айко, да и знать не хотим. Наш коллега с той стороны также относится к 1С. Приходится находить пересечения в знаниях, понятиях, вырабатывать общий взгляд на предметную область. API я перевожу как «Программный облик приложения» — лицо приложения, которые видят разработчики других систем. Нехорошо, если это лицо уродливо. Статья является обобщением соображений, из которых я исходил при создании конструктора API ЛеМурр.

Поддерживать актуальность документации можно и вручную, но лучше проектировать «самодокументирующееся» API

 

Сейчас http стал фактически стандартом обмена между разными системами. Исключением является обмен файлами, на случай отсутствия связи.

Для кого-то давно, для кого-то недавно в 1С появились веб сервисы. Почти 20 лет назад они поражали сразу двумя особенностями. С одной стороны, довольно высокой сложностью, с другой стороны тем, что SOAP вполне описывает структуру данных. Некоторым разочарованием было только то, что 1С так и не добавила комментарии в описание WSDL. Если бы комментарии имелись, то, возможно, это была бы полноценная документация API.

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

Оглядевшись, мы увидим, что в других системах с документацией тоже не очень хорошо. Например, OpenAPI строит документацию по коду и хранит её отдельно. Это означает, что актуальность не гарантирована.

Возникает справедливое желание совместить простоту работы http сервисов с «автодокументированием» wsdl. Задача не из трудных. Важно лишь задуматься об этом.

Сложность лишь в том, чтобы принять решение своевременно.  Архитектуру API следует продумывать до того, как сделан первый метод. Переделывать на порядок труднее, а если API уже используется, то на два порядка.

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

Работа «стрелочника» проста и понятна. Понять, что требуется, и передать управление тому, кто может исполнить требуемое.

Кроме прикладной логики, например, записать или прочитать данные, клиент может задать нашему API вопрос «Что умеешь?». Ответ на этот вопрос и будет документацией.

 

Случай из личного опыта.
 

 

 

Очень удобно, когда API умеет отвечать на запрос «что умеешь?». Причём как в человекочитаемом, так и в формате, пригодном для автоматической обработки.

При внедрении решений 1С документацию к API чаще всего пишет разработчик. Так пусть сразу и пишет её в коде! И не потребуется использовать костыли, в виде построения документации по комментариям. Достаточно одного параметра на входе, по которому станет понятно, что требуется вернуть описание API.

В объектно-ориентированных языках вопрос решается совсем просто. За каждый метод API назначаем класс-обработчик, внутри которого пишем метод, ответственный за документацию.

В 1С возможны другие решения. Например, можно в стиле «Конвертации данных 2» сделать справочник методов API, в котором описать параметры и добавить описание для программиста корреспондирующей системы. Отчёт по этому справочнику и будет документацией.

Ещё один вариант в том, чтобы написать в стиле «Конвертации данных 3» — с таблицами значений, ключами и портянками функций. Для каждого метода может быть три функции. Одна отвечает за запись, другая за чтение, третья возвращает описание.

Я выбрал стиль КД2.

 

Кто смутно мыслит, тот смутно излагает

 

 

«Если вы учёный, квантовый физик, и не можете в двух словах объяснить пятилетнему ребёнку, чем вы занимаетесь, — вы шарлатан», — Ричард Фейнман.

Разработчикам, как правило, мало интересны тонкости системы, с которой приходится налаживать обмен. Предубеждения одной системы могут оказаться несовместимыми с заблуждениями другой. Поэтому внутреннюю логику не стоит показывать наружу.

1С в типовых решениях всегда выносит внутренние термины и подходы в формат обмена. Ни разу не видел, чтобы какая-то сторонняя система использовала «универсальные» форматы 1С. Даже OData, один из самых простых API, вызывает головную боль у разработчиков других систем.

Часто создание API начинается с одного простого требования, например, «дайте нам остатки». Позже требования растут и ветвятся. На простой запрос хочется дать простой ответ, не заморачиваясь со строгой типизацией как в SOAP.

Случай из личного опыта
 
 

Управление легковым автомобилем не зависит от того, насколько всё сложно у него внутри.

Способность строить простые и понятные API является хорошей проверкой на понимание системы специалистом.

Да, существуют не только автомобили, но и самолёты и строго типизированные API, но их на порядок меньше, чем «велосипедов», работающих в каждом предприятии. Я не против SOAP как такового, а лишь за уместное его применение.

 

Что делать, если метод API работает слишком долго? Выход есть!

 

Стрижка только начата

 

Не всегда получается сделать быстрый метод. Увеличивать таймаут http запросов тоже не всегда возможно. Есть целых три решения:

  1. «Асинх». Присвоим запросу идентификатор. Система, получившая запрос, сообщает, что начала обработку, «ждите ответа как соловей лета». Результат сохраняет, например, в регистре сведений. Получить результат можно через время запросом с таким же идентификатором.
  2. «Обратный вызов». После завершения работы метода API 1С может вызвать метод корреспондирующей системы. Увы, данный способ реализуем не всегда. У корреспондента может не быть входа.
  3. «Событийный подход» или webhook. Очень часто система сама знает, какие данные нужны корреспонденту. Нет смысла ждать. Можно отправлять данные по мере готовности на его API, если оно есть и доступно.

Если подумать головой, то три приведённых решения напрашиваются сами. Искусство состоит в том, чтобы все три подхода отрабатывал один код. Для всех методов API хорошо бы предусмотреть обработчики «после выборки данных», «после записи» или «перед отправкой». Это ещё один повод задуматься над архитектурой API до написания первой строки кода.

 

Каждому корреспонденту — своё API или всё-таки шина?

 

 

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

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

Внедрение шины означает пересмотр взаимодействия всех систем. Большая и не очень понятная руководству затея. «Всё уже работает. Траты не обоснованы», — скажет начальник и будет прав.
Разработчик взгрустнёт и пойдёт писать интерфейс со всем зоопарком.

Нет смысла пытаться засунуть все системы в один большой API. Во-первых, через некоторое время станет невозможно понять, какой метод для какой системы создавался и на чём отразится его изменение. Во-вторых, неизбежно возникнут трудности с разделением прав.

Из вышеизложенного следует необходимость предусмотреть создание нескольких API. По одному на каждую систему, с которой строим обмен.

 

Как запутаться самому и запутать всех

 

Король Лир раздал владения дочерям и собирался гостить по очереди у каждой. Его решение привело державу к краху.

 

Лучший способ устроить локальный хаос — сделать API, принимающий фрагменты кода и возвращающий результат исполнения кода.

У любого вопроса есть простое, понятное и при этом неправильное решение
 
 

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

Решение исполнять сторонний код происходит либо от настойчивого продавливания размытых требований: «Дайте кнопу “Сделать всё”», либо от лени разработчика, который перекладывают свою работу на других.

API является уровнем абстракции над системой. Внутреннее устройство должно как можно меньше просвечивать через этот уровень абстракции. Платформа 1С хорошо изолирует разработчика от работы с SQL сервером, что позволило платформе работать с разными SQL серверами.

Второй способ запутаться это дать доступ в базу сторонним поставщикам

Данные из сторонних сервисов система должна забирать самостоятельно. Сервис предоставляет API, система под контролем своих администраторов обращается и забирает данные. Никак иначе.

Случай из личного опыта
 
 

 

Гибкость хуже воровства

 

Варианты отчётов изначально не предназначены для построения интерфейсов с другими системами, но использовать их возможно, несмотря на опасности.

 

Как сказал так и сделали.

 

Неоднократно приходилось слышать просьбы «Хотим видеть на сайте вот этот отчёт, только с оформлением в стиле личного кабинета». Можно, конечно, сформировать в 1С табличный документ и вернуть его в виде html. И выглядит это удовлетворительно. В оформление сайта не попадает, но заказчик часто готов мириться.

Более красивое решение — конвертировать результат в json и уже на клиенте преобразовать его с требуемым оформлением.

Большинство отчётов возможно получить в виде дерева значения, которое относительно несложно преобразуется в json. Если приложить усилия, то на каждой группировке отчёта можно описать свои поля.

Решение простое, красивое, с одним огромным «НО!». Варианты отчёта слишком легко правятся. Пользователь, не знающий о том, что этот вариант отчёта используется в API, может изменить его, и система начнёт врать.

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

Если вариант отчёта работает как метод API, перед его формированием необходимо программно проверять или устанавливать его ключевые настройки.

Найти типовой отчёт без «тараканов» очень непросто
 
 

Также возможно создать отдельный вариант отчёта, скрытый от пользователей, и отдавать его результат. Говорят, что в БСП есть галка, запрещающая менять вариант отчёта, но её работоспособность надо проверять.

 

Критикуя — предлагай! Предлагая — исполняй!

 

 

Всё вышеизложенное я отразил в конструкторе API ЛеМурр. Точнее сначала написал Ле Мурра и только потом эту статью, где обобщил соображения, из которых исходил при создании расширения имени учёного кота Мурра.

 

Вступайте в нашу телеграмм-группу Инфостарт

API интеграция архитектура web hook обмен данными json-rpc json асинхронный метод

См. также

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM / LOGICSTARS. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM / LOGICSTAR разных брендов в одной информационной базе в ручном и автоматическом режиме.

42700 руб.

03.08.2020    23595    35    24    

27

WEB-интеграция Программист 1С:Предприятие 8 1С:Бухгалтерия 3.0 Бытовые услуги, сервис Платные (руб)

Расширение для автоматизации передачи данных между сервисом Vetmanager с 1С: Бухгалтерия 3.0. Решение позволяет загружать документы и справочники из Ветменеджер в 1С:Бухгалтерию, сокращая время на ручной ввод данных и минимизируя ошибки.

24000 руб.

02.02.2021    22295    67    52    

42

WEB-интеграция Загрузка и выгрузка в Excel Программист Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

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

12200 руб.

29.08.2025    2030    6    0    

7

WEB-интеграция Программист Бизнес-аналитик 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика ИТ-компания Платные (руб)

Модуль "Экспортер" — это расширение для 1С, предназначенное для автоматизации процессов выгрузки данных. Оно позволяет эффективно извлекать, преобразовывать и передавать данные из систем 1С в интеграционную платформу Spot2D. Подсистема упрощает настройку, снижает количество ручных операций и обеспечивает удобный контроль данных.

17568 руб.

20.12.2024    5620    25    4    

27
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DmitryKlimushkin 152 10.03.26 11:33 Сейчас в теме
Интеграции - зло!))
Только что в другой статье с коллегой спорили в том числе и по теме всех этих "интеграций-обменов-выгрузок". Так что немного повторюсь)
Есть техническая сторона вопроса, это собственно сам обсуждаемый API. Вот только я уверен, что очень сильно проредил бы значимую часть используемых подключений несложным организационным решением. Я бы сначала ознакомился с должностным функционалом сотрудников и положениями о структурных подразделениях. Перед тем, как одаривать паству разного рода информацией, бывает интересно узнать - а кто вообще и чем занимается? Пока не задашь внятные рамки компетенций и полномочий, всем очень хочется видеть всё, да ещё в самых немыслимых разрезах и подробностях) Учетная система становится похожей на Интернет, в которой сидят и тупо "серфят" масса сотрудников, при том, что владеют вполне достаточной информацией для исполнения прямых своих обязанностей.
2. Трактор 1277 10.03.26 11:40 Сейчас в теме
(1) Сколько организационные вопросы не решай, а API делать придётся. Потому как в конторе как правило больше одной системы. Даже 1Сных часто несколько.
3. DmitryKlimushkin 152 10.03.26 11:47 Сейчас в теме
(2) Не! Я вполне за это решение. Сам с удовольствием пользуюсь. Но, как и в кондитерских изделиях, надо знать меру в том, что тебе очень нравится)
4. KRIHA 117 10.03.26 14:31 Сейчас в теме
Хорошо написано! Читал с упоением!
P.S. Я так понимаю все же - комментарии, восхищения и критика самого ляМурра - это не здесь?
5. KRIHA 117 10.03.26 14:46 Сейчас в теме
У меня вопрос Автору - про пункт "Гибкость хуже воровства" - там где внезапно про варианты отчетов: я не уловил почему возник переход к этой теме - я не уловил суть.
6. Трактор 1277 10.03.26 14:56 Сейчас в теме
(5) Как-то очень давно жила ленивая обезьяна. Лень ей было лазить по деревьям за фруктами и охотиться за потомками динозавров - птицами. Взяла эта обезьяна палку и стала сбивать фрукты и птиц палкой. Так лень сделала из обезьяны человека.

Но лень оправдана не всегда. Да, очень хочется на невнятные требования ответить "Присылайте код - верну результат исполнения" или "Вот вам АПИ, которое возвращает результат любого отчёта". Сказамши так разработчик ссокращает сиюминутные усилия, но получает геморрой в будущем. И если исполнение чужого кода можно сравнить с пилением сука на котором сидишь, то тупое исполнение варианта отчета можно сравнить с бездумным подбрасыванием палки вверх - на лысину упасть может.
7. KRIHA 117 10.03.26 14:57 Сейчас в теме
(6) про лысину это я понял, камень в мой огород )))))))))))))))
8. Трактор 1277 10.03.26 14:59 Сейчас в теме
(7) вот так лысых и вычисляют :-)
Я в том возрасте, когда примерно четверть друзей не пользуются расчёской. Простор для троллинга широк.
Для отправки сообщения требуется регистрация/авторизация