Как на базе 1С:Управление торговлей 11.4 создать производительный HTTP-сервис с авторизацией по токенам

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Реализация собственного API в 1С:Предприятие 8.3 — это стандартная задача при интеграции с внешними сайтами, мобильными приложениями или сервисами партнеров. В данной статье мы подробно разберем, как построить надежную систему обмена данными на базе 1С:Управление торговлей 11.4, используя механизмы HTTP-сервисов, и решим ключевые вопросы безопасности и производительности.

Выбор технологии: HTTP-сервис или Web-сервис?

Проанализируем ситуацию: для взаимодействия с веб-разработчиками (PHP, Python, JavaScript) использование HTTP-сервисов является более предпочтительным. Разберем почему:

  1. Простота протокола: HTTP-сервисы работают с привычными для веба форматами данных (JSON, XML) и стандартными методами (GET, POST, PUT, DELETE).
  2. Легкость интеграции: Сторонним разработчикам не нужно разбираться в сложных WSDL-описаниях, которые характерны для SOAP (Web-сервисов).
  3. Производительность: HTTP-сервисы имеют меньший «оверхед» (служебную нагрузку) на передачу данных.

Учитывая, что платформа 8.3.10 и выше позволяет создавать HTTP-сервисы в расширениях конфигурации, мы рекомендуем использовать именно этот способ, чтобы не снимать основную конфигурацию с поддержки.

Решение проблемы авторизации и обход окна логина 1С

Одной из главных сложностей при создании API является требование системы ввести логин и пароль пользователя 1С (Basic Auth). Рассмотрим, как реализовать современную авторизацию по токенам, чтобы клиенты не использовали учетные данные пользователей базы напрямую.

Разберем по шагам алгоритм создания системы токенов:

  1. Создадим в базе (или расширении) новый Регистр сведений КлючиДоступаAPI с измерениями Пользователь (справочник Контрагенты или Пользователи) и Токен (строка или UUID), а также ресурсом СрокДействия (Дата).
  2. В файле публикации default.vrd на веб-сервере пропишем техническую учетную запись 1С с минимальными правами. Это позволит веб-серверу авторизовать запрос на уровне платформы автоматически.
  3. Проверку прав будем выполнять программно внутри метода HTTP-сервиса. Клиент передает токен в заголовке запроса (например, Authorization: Bearer [токен]).

Рассмотрим пример кода для проверки токена внутри метода GET нашего сервиса:


Функция ОстаткиТоваровGet(Запрос)
    
    Токен = Запрос.Заголовки.Получить("Authorization");
    Если Токен = Неопределено Тогда
        Возврат Новый HTTPСервисОтвет(401); // Не авторизован
    КонецЕсли;
    
    // Очищаем префикс Bearer, если он есть
    ЧистыйТокен = СтрЗаменить(Токен, "Bearer ", "");
    
    ЗапросКБД = Новый Запрос;
    ЗапросКБД.Текст = 
        "ВЫБРАТЬ
        |   КлючиДоступаAPI.Пользователь
        |ИЗ
        |   РегистрСведений.КлючиДоступаAPI КАК КлючиДоступаAPI
        |ГДЕ
        |   КлючиДоступаAPI.Токен = &Токен
        |   И КлючиДоступаAPI.СрокДействия > &ТекущаяДата";
    
    ЗапросКБД.УстановитьПараметр("Токен", ЧистыйТокен);
    ЗапросКБД.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
    
    Результат = ЗапросКБД.Выполнить();
    Если Результат.Пустой() Тогда
        Возврат Новый HTTPСервисОтвет(403); // Доступ запрещен
    КонецЕсли;
    
    // Логика получения данных...
    
КонецФункции

Защита от перегрузок и «зацикленных» запросов

Проанализируем риски: если клиент запустит запрос остатков в бесконечном цикле или попытается выкачать всю номенклатуру (десятки тысяч позиций) одним запросом, это может парализовать работу всей базы УТ 11.4. Выясним, как этого избежать.

Использование «Плоских» таблиц (Кэширование):

Не выполняйте тяжелые запросы к виртуальным таблицам остатков (ЗапасыИДоступностьОстатки) непосредственно в момент HTTP-запроса. Вместо этого создайте отдельный регистр сведений ВитринаДанныхAPI. Настройте регламентное задание, которое раз в 10-15 минут будет собирать актуальные остатки и цены в этот плоский регистр. Ваш API должен читать данные только из него. Это обеспечит мгновенный ответ и минимальную нагрузку на систему.

Реализация Throttling (Ограничение частоты):

Добавим в наш регистр КлючиДоступаAPI ресурсы ДатаПоследнегоЗапроса и СчетчикЗапросов. При каждом обращении будем анализировать эти данные:


// Пример логики ограничения запросов
Если ЗаписьРегистра.ДатаПоследнегоЗапроса >= НачалоМинуты(ТекущаяДата()) Тогда
    Если ЗаписьРегистра.СчетчикЗапросов > МаксимальныйЛимит Тогда
        Ответ = Новый HTTPСервисОтвет(429); // Too Many Requests
        Ответ.УстановитьТелоИзСтроки("Превышен лимит запросов в минуту");
        Возврат Ответ;
    КонецЕсли;
КонецЕсли;

Архитектурные советы по масштабированию

Рассмотрим рекомендации по развертыванию сервиса для высоконагруженных систем:

Документирование API

Помните, что в отличие от Web-сервисов, HTTP-сервисы не предоставляют автоматического описания методов. Проанализируем, как упростить жизнь разработчикам на стороне клиента. Хорошей практикой считается использование формата OpenAPI (Swagger). Вы можете составить JSON-файл с описанием всех эндпоинтов, параметров и структур ответов. Это позволит партнерам генерировать код интеграции автоматически.

Разберем типичную структуру ответа для получения цен:


{
  "timestamp": "2023-10-27T10:00:00",
  "status": "success",
  "data": [
    {
      "sku": "00-00001234",
      "name": "Товар пример",
      "price": 1500.50,
      "currency": "RUB",
      "stock": 15
    }
  ]
}

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

← На главную