Разберем ситуацию, с которой часто сталкиваются разработчики при создании REST API на платформе 1С:Предприятие. При попытке вернуть нестандартный HTTP-статус (например, 422 Unprocessable Entity) в клиент-серверном варианте работы (через веб-сервер IIS или Apache) платформа выдает ошибку: Некорректные символы в заголовке HTTP. При этом в файловом варианте всё работает корректно. Выясним, почему это происходит и как исправить поведение системы.
Когда вы создаете объект HTTPСервисОтвет, платформа 1С пытается автоматически сформировать заголовок ответа, включая текстовую расшифровку статуса, так называемую Reason Phrase. Для стандартных статусов, таких как 200, 400 или 500, платформа делает это самостоятельно. Однако для «экзотических» или нетипичных для внутренних механизмов платформы кодов (особенно в диапазоне 418–499), автоматическое заполнение может отрабатывать некорректно.
В серверном варианте взаимодействия 1С с веб-сервером через модуль расширения (например, isapi_1c или mod_1c), если описание статуса оказывается пустым или содержит неверные символы, веб-сервер воспринимает такой ответ как нарушение протокола HTTP. Это приводит к разрыву соединения и выводу ошибки об «инвалидных символах в заголовке».
Самым надежным и элегантным решением данной проблемы является явное указание причины в конструкторе объекта HTTPСервисОтвет. Не полагайтесь на автоматическое определение платформой текстовой расшифровки кода. Вместо вызова конструктора только с числовым кодом, передайте вторым параметром строку с описанием статуса.
Разберем на примере кода, как именно нужно модифицировать обработчик вашего HTTP-сервиса, чтобы избежать ошибки:
Ответ = Новый HTTPСервисОтвет(422); используйте расширенный конструктор.Вот как должен выглядеть исправленный фрагмент кода:
Функция testget(Запрос)
// Явно указываем текстовое описание статуса для предотвращения ошибки
КодСостояния = 422;
Причина = "Unprocessable Entity";
Ответ = Новый HTTPСервисОтвет(КодСостояния, Причина);
// Дополнительно устанавливаем заголовки и тело ответа
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки("Ваше тело ответа здесь");
Возврат Ответ;
КонецФункции
Когда вы передаете строку Причина в конструктор HTTPСервисОтвет, вы принудительно задаете текстовую часть HTTP-ответа. Веб-сервер получает полностью сформированный и валидный заголовок, который соответствует стандартам RFC. Это снимает необходимость у платформы 1С пытаться «угадать» или самостоятельно сформировать строку причины, тем самым исключая передачу непечатных символов или пустых значений, вызывающих конфликт с IIS или Apache.
Рекомендуем придерживаться такой практики для всех статусов, которые не входят в базовый список наиболее часто используемых (200, 201, 400, 401, 403, 404, 500). Это сделает ваше API более предсказуемым и совместимым с любыми инфраструктурными настройками веб-серверов.
Новый HTTPСервисОтвет(Код, "Текст ошибки") при работе с нестандартными кодами состояний.Теперь ваше приложение будет корректно возвращать любые коды HTTP, а клиенты API получат ожидаемые ответы без ошибок со стороны веб-сервера.