Как создать веб-заглушку с динамическим JSON-ответом для GET-запросов из 1С?

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

В процессе разработки интеграций между 1С и внешними системами часто возникает ситуация, когда внешнее API еще не готово или недоступно для тестирования, а механизм обмена в 1С уже нужно отлаживать. В таких случаях идеальным решением становится создание "заглушки" (mock-сервера). Особая сложность возникает, когда 1С должна получать не статичные данные, а динамически меняющийся JSON в зависимости от действий оператора (например, имитация изменения статуса заказа или подтверждения операции). Рассмотрим, как реализовать такую систему несколькими способами.

Проблема использования клиентского JavaScript

Для начала разберем типичную ошибку начинающих разработчиков. Попытка реализовать логику записи данных в файл через браузерный JavaScript (как предлагал автор в начале обсуждения) обречена на провал. Браузер в целях безопасности не позволяет скрипту на странице записывать файлы на серверную файловую систему напрямую. Кроме того, когда 1С выполняет HTTPЗапрос, она получает лишь текстовое содержимое страницы. Встроенный в 1С механизм HTTPСоединение не является браузером — он не исполняет JavaScript, находящийся внутри html-кода. Поэтому нам необходимо решение на стороне сервера.

Решение 1: Использование легковесного сервера на Python (Bottle или FastAPI)

Одним из самых быстрых способов развернуть полноценную заглушку является использование микрофреймворков. Рассмотрим пример на библиотеке Bottle. Нам нужно создать сервер, который будет хранить "состояние" в памяти и отдавать его по запросу от 1С.

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


from bottle import route, run, request, response
import json

# Глобальная переменная для хранения текущего ответа
current_data = {"status": "wait", "message": "Ожидание действий оператора"}

@route('/get_json')
def index():
    response.content_type = 'application/json'
    return json.dumps(current_data)

@route('/set_status/<new_status>')
def update(new_status):
    global current_data
    current_data["status"] = new_status
    current_data["message"] = f"Статус изменен на {new_status}"
    return "Статус обновлен успешно!"

run(host='localhost', port=8080)

Разберем, как это работает по шагам:

  1. Сервер запускается на локальном компьютере и слушает порт 8080.
  2. Когда 1С обращается по адресу http://localhost:8080/get_json, сервер возвращает текущее содержимое переменной current_data.
  3. Оператор может открыть в браузере ссылку http://localhost:8080/set_status/success. Это приведет к срабатыванию функции update, которая изменит значение в памяти сервера.
  4. При следующем запросе от 1С она получит уже обновленный JSON.

Важный нюанс: Чтобы 1С корректно обработала ответ, мы обязательно устанавливаем заголовок Content-Type: application/json. В 1С это позволит использовать метод ПрочитатьJSON() без предварительных манипуляций со строками.

Решение 2: Создание HTTP-сервиса внутри самой 1С

Если вы не хотите устанавливать дополнительное ПО (Python, Node.js), наиболее правильным и надежным способом будет создание HTTP-сервиса в самой 1С. Это позволит вам управлять ответами прямо из интерфейса вашей базы.

Рассмотрим алгоритм реализации:

  1. В конфигураторе создайте новый объект HTTP-сервис (например, с именем MockService).
  2. Укажите корневой URL (например, stub).
  3. Создайте шаблон URL (например, get_data) и добавьте в него метод GET.
  4. Для хранения "состояния" (того самого JSON, который должен меняться) используйте Константу или Регистр сведений.

Проанализируем пример кода обработчика GET-запроса в модуле HTTP-сервиса:


Функция get_dataGET(Запрос)
    
    Ответ = Новый HTTPСервисОтвет(200);
    
    // Получаем текущую настройку из БД (например, из константы)
    ТекстJSON = Константы.ТекущийОтветЗаглушки.Получить();
    
    Ответ.УстановитьТелоИзСтроки(ТекстJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    Ответ.Заголовки.Вставить("Content-Type", "application/json");
    
    Возврат Ответ;
    
КонецФункции

Теперь создадим простую обработку для оператора. На форме разместим кнопки "Оплачено", "Ошибка", "В работе". При нажатии на кнопку будем просто записывать нужный текст JSON в константу ТекущийОтветЗаглушки. Таким образом, любая внешняя система (или другая база 1С), обратившись к вашему HTTP-сервису, получит ровно то, что выбрал оператор в текущий момент.

Сравнение подходов

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

Сторонний сервер (Python/Node.js):

HTTP-сервис 1С:

Технические нюансы отладки

Проанализируем несколько важных моментов, которые часто упускают при создании заглушек:

1. Заголовки CORS: Если вы все же решили сделать фронтенд-страницу для оператора, которая будет отправлять fetch или ajax запросы к вашей заглушке, сервер должен возвращать заголовок Access-Control-Allow-Origin: *. Без него браузер заблокирует запрос из соображений безопасности.

2. Коды состояния: Не ограничивайтесь только кодом 200 OK. Настоящее API может возвращать 404 Not Found, 400 Bad Request или 500 Internal Server Error. В коде заглушки предусмотрите возможность смены кода ответа, чтобы проверить, как ваша 1С реагирует на ошибки.

3. Инструменты визуализации: Для быстрой проверки работы вашей заглушки без написания кода в 1С используйте утилиты вроде Postman или Insomnia. Это позволит вам убедиться, что сервер отдает именно JSON и именно с нужными заголовками.

Рассмотренные методы позволяют создать гибкую среду для тестирования интеграций любой сложности, минимизируя простои в разработке из-за неготовности смежных систем.

← На главную