Как настроить HTTP-сервис в 1С для передачи данных из базы в формате JSON?

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

Разработка механизмов интеграции через HTTP-сервисы — одна из самых востребованных задач для современного программиста 1С. Это позволяет сторонним приложениям (сайтам, мобильным приложениям или другим базам) обращаться к вашей информационной базе напрямую, минуя громоздкие COM-соединения или веб-сервисы SOAP. В рамках данной статьи мы подробно разберем, как создать свой первый HTTP-сервис, настроить получение данных и правильно упаковать их для отправки внешнему потребителю.

Основы архитектуры HTTP-сервиса в 1С

Для начала проанализируем структуру объекта HTTP-сервис в дереве метаданных. Любой сервис состоит из трех ключевых уровней:

  1. Корневой URL сервиса: Имя, по которому внешняя система будет обращаться к вашей базе (например, /myservice/v1).
  2. Шаблон URL: Конкретный путь внутри сервиса. Мы можем задать его как статично (/get_balance), так и с использованием параметров (/goods/{Articul}).
  3. Методы: Конкретные HTTP-действия, привязанные к шаблону. Чаще всего используются GET (для получения данных) и POST (для передачи данных в базу или выполнения действий).

Рассмотрим ситуацию: нам необходимо по запросу извне вернуть информацию о товаре по его штрихкоду. Для этого мы создаем шаблон с именем НоменклатураПоШтрихкоду и прописываем путь /goods/{BarCode}. В фигурных скобках указан параметр, который мы сможем извлечь в коде.

Реализация метода GET для получения данных

Когда мы определили структуру в конфигураторе, необходимо написать обработчик на языке 1С. Давайте разберем, как правильно сформировать ответ. Основная задача — не просто найти данные, но и вернуть их в понятном для веб-стандартов виде, чаще всего в формате JSON.

Посмотрим на пример реализации функции-обработчика:


Функция НоменклатураGET(Запрос)
    // 1. Подготавливаем объект ответа с кодом 200 (ОК)
    Ответ = Новый HTTPСервисОтвет(200);
    
    // 2. Извлекаем параметр из URL
    Штрихкод = Запрос.ПараметрыURL.Получить("BarCode");
    
    // 3. Инициализируем механизмы записи JSON
    ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
    Запись = Новый ЗаписьJSON;
    Запись.УстановитьСтроку(ПараметрыЗаписиJSON);
        
    // 4. Логика поиска данных в базе
    Номенклатура = НайтиНоменклатуруПоШтрихкоду(Штрихкод);
    
    Если Номенклатура <> Неопределено Тогда
        ДанныеОтвет = Новый Структура;
        ДанныеОтвет.Вставить("Номенклатура", Номенклатура.Наименование);
        ДанныеОтвет.Вставить("Артикул", Номенклатура.Артикул);
    Иначе
        // Если данные не найдены, меняем код ответа на 404
        Ответ.КодСостояния = 404;
        ДанныеОтвет = "Номенклатура со штрихкодом " + Штрихкод + " не найдена";
    КонецЕсли;
    
    // 5. Сериализуем данные в JSON и помещаем в тело ответа
    ЗаписатьJSON(Запись, ДанныеОтвет);
    РезультатСтрокой = Запись.Закрыть();
    
    Ответ.УстановитьТелоИзСтроки(РезультатСтрокой, КодировкаТекста.UTF8);
    Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
    
    Возврат Ответ;
КонецФункции

В данном примере мы использовали объект HTTPСервисЗапрос для получения входящих данных и HTTPСервисОтвет для формирования результата. Важно помнить, что просто передать объект 1С (например, СправочникСсылка) в ответ нельзя — его нужно обязательно преобразовать в строку или структуру, пригодную для JSON.

Передача сложных наборов данных: массивы и таблицы

Часто возникает вопрос: как передать не одно значение, а целый список (выборку из запроса или таблицу значений)? Если вы попробуете просто передать массив в метод УстановитьТелоИзСтроки, система выдаст строковое представление типа — "Массив", но не его содержимое. Для корректной передачи коллекции объектов мы должны использовать массив структур.

Разберем алгоритм преобразования результата запроса в JSON-ответ:


// Предположим, у нас есть Таблица Значений (ТЗ) с данными
ТабНакл = Новый Массив;

Для Каждого Стр Из ТЗ Цикл
    // Создаем структуру для каждой строки, чтобы ключи стали именами полей в JSON
    СтрокаДанных = Новый Структура;
    СтрокаДанных.Вставить("Товар", Строка(Стр.Товар)); // Ссылки преобразуем в текст или UUID
    СтрокаДанных.Вставить("Количество", Стр.Количество);
    СтрокаДанных.Вставить("Цена", Стр.Цена);
    
    ТабНакл.Добавить(СтрокаДанных);
КонецЦикла;

// Теперь записываем весь массив структур в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ТабНакл);
Результат = ЗаписьJSON.Закрыть();

Ответ = Новый HTTPСервисОтвет(200);
Ответ.УстановитьТелоИзСтроки(Результат);
Ответ.Заголовки.Вставить("Content-Type", "application/json");
Возврат Ответ;

Проанализируем этот подход: объект ЗаписатьJSON умеет автоматически обходить массивы и структуры 1С, превращая их в валидный JSON-массив объектов. Это стандартный и наиболее эффективный способ передачи табличных данных.

Важные технические нюансы и расширенные возможности

Для создания по-настоящему профессионального сервиса недостаточно просто вернуть данные. Выясним, какие еще аспекты необходимо учитывать:

1. Безопасность и аутентификация. По умолчанию доступ к HTTP-сервису требует авторизации. Рекомендуется создать в базе отдельного пользователя с минимальными правами, у которого в ролях разрешено право "Удаленный доступ (HTTP)". Для взаимодействия используйте Basic Authentication, передавая логин и пароль в заголовках запроса.

2. Обработка ошибок. Всегда оборачивайте код обработчика в блок Попытка ... Исключение. Если в коде 1С произойдет критическая ошибка, внешняя система должна получить внятный ответ с кодом 500 Internal Server Error, а не просто пустую страницу. В блоке исключения можно сформировать JSON с описанием ошибки для разработчика на той стороне.

3. Использование потоков (Stream). Если ваша выборка содержит тысячи строк, формирование огромной строки через ЗаписьJSON.Закрыть() может вызвать нехватку оперативной памяти. В таких случаях мы рекомендуем использовать временные файлы и метод УстановитьТелоИзПотока. Это позволит транслировать данные в ответ порциями.

4. Обработка метода OPTIONS (CORS). Если к вашему сервису обращаются из браузера с другого домена (например, через JavaScript/React), браузер сначала пошлет запрос OPTIONS. Чтобы сервис ответил, нужно добавить в заголовки ответа параметр Access-Control-Allow-Origin: * и разрешить соответствующие методы.

5. Отладка. Помните, что отладка HTTP-сервисов требует включенного режима отладки на веб-сервере (IIS или Apache) и в самой 1С (протокол HTTP). Точку останова следует ставить непосредственно в модуле HTTP-сервиса, предварительно подключившись к серверным сеансам в меню "Отладка -> Подключение".

Таким образом, работа с HTTP-сервисами в 1С сводится к правильному проектированию URL-шаблонов и аккуратной сериализации данных в JSON. Используя вышеописанные методы и примеры кода, вы сможете построить надежный интерфейс для взаимодействия вашей системы с внешним миром.

← На главную