Как обработать POST-запрос с JSON в HTTP-сервисе 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с внешними сайтами или мобильными приложениями часто возникает задача получения данных через POST-запросы. В отличие от простых GET-запросов, где параметры передаются прямо в URL (строке адреса), POST-запросы обычно несут основную информацию в «теле» (body). Чаще всего этим телом является файл или строка в формате JSON. В рамках данной статьи мы подробно разберем, как принять такой запрос в 1С, правильно прочитать данные и на что стоит обратить внимание при настройке обмена. В качестве практической основы можно использовать готовую заготовку интеграции 1С со сторонними сервисами через HTTP и JSON.

Понимание структуры POST-запроса

Для начала проанализируем, чем отличается передача параметров в строке запроса от передачи данных в теле. Когда мы обращаемся к методу через ?параметр=значение, платформа 1С автоматически помещает эти данные в коллекцию ПараметрыЗапроса или ПараметрыURL объекта HTTPСервисЗапрос. Однако при отправке JSON-файла сайт-отправитель помещает весь текст JSON в тело HTTP-пакета после всех заголовков.

Как правильно заметили участники обсуждения, для 1С практически не имеет значения, какой метод используется (POST, PUT или DELETE), если мы говорим о технической возможности получения данных. Главное — знать, как обратиться к содержимому этого запроса. Рассмотрим пошагово процесс обработки.

Базовая реализация обработки JSON

Предположим, у нас создан HTTP-сервис с шаблоном URL и методом POST. В модуле сервиса мы создаем функцию-обработчик. Основная задача здесь — извлечь строку из тела запроса и превратить ее в понятный для 1С объект (Структуру или Соответствие).

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


Функция ИмяМетодаPOST(Запрос)
    
    // 1. Получаем тело запроса в виде строки
    // Платформа считает данные из тела и представит их как обычный текст
    ТекстЗапроса = Запрос.ПолучитьТелоКакСтроку();
    
    Если ПустаяСтрока(ТекстЗапроса) Тогда
        Возврат Новый HTTPСервисОтвет(400); // Bad Request
    КонецЕсли;
    
    // 2. Подготавливаем объект для чтения JSON
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ТекстЗапроса);
    
    // 3. Десериализуем данные в структуру 1С
    Попытка
        Данные = ПрочитатьJSON(ЧтениеJSON, Истина);
        ЧтениеJSON.Закрыть();
    Исключение
        // Если JSON некорректен, возвращаем ошибку
        Возврат Новый HTTPСервисОтвет(400);
    КонецПопытки;
    
    // Теперь в переменной "Данные" у нас структура, с которой можно работать
    // Например: ИмяКлиента = Данные.client_name;
    
    Возврат Новый HTTPСервисОтвет(200);
    
КонецФункции

Важные нюансы работы с кодировками и заголовками

Проанализируем ситуацию, когда вместо русских букв приходят «кракозябры». Это происходит из-за несовпадения кодировок. По стандарту JSON должен передаваться в кодировке UTF-8. Мы настоятельно рекомендуем проверять заголовок Content-Type, который присылает отправитель. В идеале он должен выглядеть так: application/json; charset=utf-8.

Если отправитель не указал кодировку, метод ПолучитьТелоКакСтроку() может отработать некорректно. В таких случаях можно явно указать кодировку, если она вам известна заранее, используя параметры метода или предварительно считывая тело в ДвоичныеДанные.

Работа с большими объемами данных через потоки

Если ваша система предполагает получение тяжелых JSON-файлов (например, выгрузка каталога товаров на десятки мегабайт), метод ПолучитьТелоКакСтроку() может стать «бутылочным горлышком». При его вызове вся строка целиком загружается в оперативную память сервера, что может привести к падению рабочего процесса 1С.

Рассмотрим более профессиональный подход с использованием потоков. Это позволяет обрабатывать данные «на лету», значительно экономя ресурсы системы:


// Вместо ПолучитьТелоКакСтроку используем поток
ПотокЗапроса = Запрос.ПолучитьТелоКакПоток();

ЧтениеJSON = Новый ЧтениеJSON;
// Открываем чтение напрямую из потока
ЧтениеJSON.ОткрытьПоток(ПотокЗапроса);

Данные = ПрочитатьJSON(ЧтениеJSON, Истина);

ЧтениеJSON.Закрыть();
ПотокЗапроса.Закрыть();

Особенности преобразования типов: Даты и Числа

Выясним одну важную деталь: в формате JSON нет типа данных «Дата». Даты обычно передаются как строки (например, в формате ISO 8601: "2023-10-27T15:30:00"). При использовании функции ПрочитатьJSON по умолчанию вы получите обычную строку.

Чтобы 1С автоматически распознала дату, мы можем использовать специальные параметры функции ПрочитатьJSON. Рассмотрим использование функции-обработчика для восстановления типов:


// Пример восстановления даты при чтении
Данные = ПрочитатьJSON(ЧтениеJSON, Истина, "ИмяПоляСДатой", СервисВозможностейТипов.ТипДата);

Или, если структура JSON сложная, после прочтения данных в структуру нам придется самостоятельно преобразовывать строки в даты, используя функцию Дата() или специализированные парсеры строк формата ISO.

Настройка веб-сервера для приема POST-запросов

Часто проблема кроется не в коде 1С, а в настройках веб-сервера (IIS или Apache). Если при попытке отправить POST-запрос вы получаете ошибку 404 или 405 (Method Not Allowed), проверьте следующие моменты:

  1. Разрешенные методы: В настройках модуля расширения 1С на веб-сервере должны быть разрешены все необходимые глаголы (GET, POST, OPTIONS и т.д.).
  2. Размер запроса: В IIS по умолчанию ограничение на размер запроса может составлять около 30 МБ. Если файл больше, сервер обрубит соединение до того, как данные попадут в 1С.
  3. Авторизация: Убедитесь, что пользователь, под которым веб-сервер подключается к 1С, имеет права на использование HTTP-сервисов и соответствующие роли в конфигурации.

Безопасность и CORS

Если вы принимаете POST-запросы напрямую из браузера (например, с фронтенда другого сайта), вы столкнетесь с механизмом CORS. Браузер сначала отправит предварительный запрос OPTIONS. Если ваш HTTP-сервис не ответит на него правильно (не вернет заголовки Access-Control-Allow-Origin), основной POST-запрос с JSON-данными просто не будет отправлен.

Посмотрим, как должен выглядеть минимальный ответ для поддержки безопасности:


Ответ = Новый HTTPСервисОтвет(200);
Ответ.Заголовки.Вставить("Access-Control-Allow-Origin", "*");
Ответ.Заголовки.Вставить("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
Ответ.Заголовки.Вставить("Access-Control-Allow-Headers", "Content-Type");
Возврат Ответ;

Инструменты для тестирования

Чтобы не зависеть от разработчиков сайта и оперативно проверять свой код, мы рекомендуем использовать специализированные утилиты, такие как Postman или Insomnia. В них можно легко сформировать POST-запрос, вставить JSON в закладку «Body», установить нужные заголовки и сразу увидеть ответ от 1С с подробным описанием ошибок, если они возникнут. Это значительно ускоряет процесс отладки по сравнению с попытками тестирования «вслепую» через реальный сайт. Для тестирования запросов непосредственно в среде 1С подойдёт обработка для проверки и отладки REST API.

← На главную