В современной экосистеме автоматизации бизнеса интеграция систем играет ключевую роль. Одним из наиболее эффективных и быстрых способов организовать взаимодействие между 1С и внешними приложениями (сайтами, мобильными приложениями, другими базами данных) является использование HTTP-сервисов. В рамках данной статьи мы подробно разберем, как создать собственный REST API на стороне 1С, настроить шаблоны URL и реализовать обработку запросов.
Для начала проанализируем, что представляет собой этот объект. В отличие от тяжеловесных Web-сервисов (SOAP), HTTP-сервисы работают по протоколу HTTP напрямую, используя стандартные методы: GET, POST, PUT, DELETE. Это делает их легковесными и совместимыми практически с любым современным языком программирования. Рассмотрим структуру объекта в дереве конфигурации:
Разберем процесс создания на конкретном примере. Предположим, нам нужно создать сервис для получения остатков товаров. Перейдем в раздел Общие — HTTP-сервисы и добавим новый объект с именем СкладскиеОстатки. В поле "Корневой URL" укажем stock.
Теперь добавим Шаблон URL. Назовем его ПолучитьОстаток. В поле "Шаблон" введем следующую конструкцию: /get/{Articul}. Здесь параметр в фигурных скобках {Articul} является динамическим — вместо него клиент будет подставлять конкретный артикул товара. Проанализируем ситуацию: такая структура позволяет нам гибко извлекать данные из строки запроса без необходимости парсить весь URL вручную.
Теперь создадим метод внутри шаблона. Выберем HTTP-метод GET. В поле "Обработчик" нажмем на лупу, чтобы система сгенерировала функцию в модуле сервиса. Разберем по шагам код, который позволит нам вернуть данные клиенту в формате JSON.
Функция ПолучитьОстатокGet(Запрос)
// Извлекаем параметр из URL
Артикул = Запрос.ПараметрыШаблона.Получить("Articul");
// Подготавливаем структуру ответа
ДанныеОтвета = Новый Структура;
ДанныеОтвета.Вставить("Артикул", Артикул);
ДанныеОтвета.Вставить("Остаток", 0);
ДанныеОтвета.Вставить("Статус", "Товар не найден");
// Выполняем поиск в базе (условный пример)
ЗапросКБД = Новый Запрос;
ЗапросКБД.Текст =
"ВЫБРАТЬ
| ТоварыНаСкладахОстатки.ВНаличииОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура.Артикул = &Артикул) КАК ТоварыНаСкладахОстатки";
ЗапросКБД.УстановитьПараметр("Артикул", Артикул);
Выборка = ЗапросКБД.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ДанныеОтвета.Остаток = Выборка.Остаток;
ДанныеОтвета.Статус = "Success";
КонецЕсли;
// Формируем JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеОтвета);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Формируем HTTP-ответ
Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ.Заголовки.Вставить("Content-Type", "application/json");
Возврат Ответ;
КонецФункции
В данном примере мы использовали объект HTTPСервисЗапрос для получения параметров и HTTPСервисОтвет для возврата результата. Обратите внимание на важность установки заголовка Content-Type, чтобы вызывающая сторона понимала, как интерпретировать полученный поток байт.
Зачастую нам нужно не только отдавать данные, но и принимать их (например, для создания заказа). Рассмотрим, как реализовать метод POST. Создадим новый шаблон /createOrder и соответствующий метод. В этом случае данные будут передаваться в теле (Body) запроса.
Выясним причину, по которой часто возникают ошибки при чтении тела запроса: это неверная кодировка или попытка прочитать поток дважды. Рассмотрим правильный алгоритм работы с входящим JSON:
Функция СоздатьЗаказPost(Запрос)
// Читаем тело запроса
СтрокаТела = Запрос.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаТела);
Попытка
ДанныеЗаказа = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// Здесь должна быть логика создания документа в 1С
// Например: Док = Документы.ЗаказПокупателя.СоздатьДокумент();
Ответ = Новый HTTPСервисОтвет(201); // Created
Ответ.УстановитьТелоИзСтроки("Заказ успешно создан");
Исключение
Ответ = Новый HTTPСервисОтвет(400); // Bad Request
Ответ.УстановитьТелоИзСтроки("Ошибка формата JSON: " + ОписаниеОшибки());
КонецПопытки;
Возврат Ответ;
КонецФункции
После написания кода сервис необходимо сделать доступным для внешнего мира. Рассмотрим подробнее процесс публикации. Для этого нам понадобится веб-сервер (например, Apache или IIS).
Посмотрим на алгоритм действий в конфигураторе:
СкладскиеОстатки.base_api) и нажмем "Опубликовать".После этого наш сервис будет доступен по адресу вида: http://server_name/base_api/hs/stock/get/A12345. Обратите внимание, что сегмент /hs/ добавляется платформой автоматически и указывает на то, что обращение идет именно к HTTP-сервису.
Проанализируем вопрос защиты данных. По умолчанию 1С потребует авторизацию. Мы можем использовать несколько подходов:
Важный момент: всегда проверяйте входящие данные на соответствие типам 1С. Если вы ожидаете число в поле Количество, обязательно выполните преобразование типов, прежде чем записывать данные в базу, чтобы избежать исключительных ситуаций.
Отладка таких сервисов имеет свои особенности. Чтобы точка останова сработала в модуле HTTP-сервиса, необходимо:
-debug).Разберем типичную ситуацию: запрос уходит, но 1С возвращает ошибку 404 Not Found. Проанализируем возможные причины: неверно указан корневой URL, пропущен сегмент /hs/ в пути, или после внесения изменений в структуру шаблонов не была обновлена публикация на веб-сервере. Всегда перепубликовывайте сервис после изменения структуры шаблонов или имен методов.
Использование HTTP-сервисов позволяет превратить вашу 1С в полноценный бэкенд для любого современного приложения. Мы рассмотрели базовые принципы создания, программирования и публикации, которые станут фундаментом для построения сложных интеграционных решений.