Реализация собственного API в 1С:Предприятие 8.3 — это стандартная задача при интеграции с внешними сайтами, мобильными приложениями или сервисами партнеров. В данной статье мы подробно разберем, как построить надежную систему обмена данными на базе 1С:Управление торговлей 11.4, используя механизмы HTTP-сервисов, и решим ключевые вопросы безопасности и производительности.
Проанализируем ситуацию: для взаимодействия с веб-разработчиками (PHP, Python, JavaScript) использование HTTP-сервисов является более предпочтительным. Разберем почему:
Учитывая, что платформа 8.3.10 и выше позволяет создавать HTTP-сервисы в расширениях конфигурации, мы рекомендуем использовать именно этот способ, чтобы не снимать основную конфигурацию с поддержки.
Одной из главных сложностей при создании API является требование системы ввести логин и пароль пользователя 1С (Basic Auth). Рассмотрим, как реализовать современную авторизацию по токенам, чтобы клиенты не использовали учетные данные пользователей базы напрямую.
Разберем по шагам алгоритм создания системы токенов:
КлючиДоступаAPI с измерениями Пользователь (справочник Контрагенты или Пользователи) и Токен (строка или UUID), а также ресурсом СрокДействия (Дата).default.vrd на веб-сервере пропишем техническую учетную запись 1С с минимальными правами. Это позволит веб-серверу авторизовать запрос на уровне платформы автоматически.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
Ответ.УстановитьТелоИзСтроки("Превышен лимит запросов в минуту");
Возврат Ответ;
КонецЕсли;
КонецЕсли;
Рассмотрим рекомендации по развертыванию сервиса для высоконагруженных систем:
JSON для ответов. В 1С это реализуется через объект ЗаписьJSON. Это стандарт де-факто, который поймет любой клиент (от PHP до 1С).Помните, что в отличие от 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 требует не только написания кода самого сервиса, но и тщательной проработки механизмов авторизации и защиты производительности. Использование расширений, системы токенов и промежуточных таблиц кэширования позволит вам создать стабильный и быстрый интерфейс для взаимодействия с любыми внешними системами.