Разработка механизмов интеграции через HTTP-сервисы — одна из самых востребованных задач для современного программиста 1С. Это позволяет сторонним приложениям (сайтам, мобильным приложениям или другим базам) обращаться к вашей информационной базе напрямую, минуя громоздкие COM-соединения или веб-сервисы SOAP. В рамках данной статьи мы подробно разберем, как создать свой первый HTTP-сервис, настроить получение данных и правильно упаковать их для отправки внешнему потребителю.
Для начала проанализируем структуру объекта HTTP-сервис в дереве метаданных. Любой сервис состоит из трех ключевых уровней:
/myservice/v1)./get_balance), так и с использованием параметров (/goods/{Articul}).GET (для получения данных) и POST (для передачи данных в базу или выполнения действий).Рассмотрим ситуацию: нам необходимо по запросу извне вернуть информацию о товаре по его штрихкоду. Для этого мы создаем шаблон с именем НоменклатураПоШтрихкоду и прописываем путь /goods/{BarCode}. В фигурных скобках указан параметр, который мы сможем извлечь в коде.
Когда мы определили структуру в конфигураторе, необходимо написать обработчик на языке 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. Используя вышеописанные методы и примеры кода, вы сможете построить надежный интерфейс для взаимодействия вашей системы с внешним миром.