При разработке HTTP-сервисов в 1С часто возникает проблема некорректного отображения данных, когда вместо кириллических символов мы видим «кракозябры». Это происходит из-за того, что данные передаются в одной кодировке (например, UTF-8), а сервер интерпретирует их как другую (например, ANSI/Windows-1251). В этой статье мы подробно разберем, как решить эту проблему профессионально, не прибегая к созданию временных файлов на диске.
Когда вы получаете текст через Запрос.ПолучитьТелоКакСтроку(), платформа 1С пытается интерпретировать байтовый поток в соответствии со своими настройками по умолчанию. Если отправитель не указал корректный заголовок Content-Type с параметром charset, 1С может ошибочно применить стандартную кодировку системы. Результат «Р—апуск» — это типичный маркер того, что UTF-8 строка была прочитана как однобайтовая Windows-1251.
Вместо того чтобы записывать данные во временный файл и считывать их обратно, мы воспользуемся мощным механизмом ПотокВПамяти. Это решение работает гораздо быстрее, не засоряет файловую систему сервера и идеально подходит для высоконагруженных HTTP-сервисов.
Рассмотрим по шагам реализацию этого метода:
ПотокВПамяти.ЧтениеДанных, принудительно указав правильную кодировку UTF-8.Пример кода для реализации данного метода:
ПотокВПамяти = Новый ПотокВПамяти;
ЗаписьДанных = Новый ЗаписьДанных(ПотокВПамяти);
ЗаписьДанных.ЗаписатьСтроку(ИспорченнаяСтрока, КодировкаТекста.ANSI);
ЗаписьДанных.Закрыть();
ПотокВПамяти.Перейти(0, ПозицияВПотоке.Начало);
ЧтениеДанных = Новый ЧтениеДанных(ПотокВПамяти);
ПравильнаяСтрока = ЧтениеДанных.ПрочитатьСтроку();
ЧтениеДанных.Закрыть();
Лучший способ решения проблем с кодировкой — это предотвращение их возникновения на этапе передачи данных. Если вы контролируете сервер-отправитель или используете WinHttp.WinHttpRequest.5.1 для отправки запросов из 1С, всегда явно указывайте кодировку в заголовках. Это позволит принимающей стороне сразу правильно распознать поток данных.
При настройке исходящего запроса обязательно добавьте следующие заголовки:
WinHttp.SetRequestHeader("Accept-Charset", "utf-8");
WinHttp.setRequestHeader("Content-Type", "application/json; charset=utf-8");
Таким образом, вы сообщаете серверу, в каком формате приходят данные, что избавляет вас от необходимости программной конвертации текста «на лету».
Подводя итог, можно выделить следующие рекомендации для стабильной работы с HTTP-запросами в 1С:
ПотокВПамяти, ЗаписьДанных и ЧтениеДанных.charset=utf-8 в Content-Type, если вы управляете отправителем.ПотокВПамяти будет самым надежным «спасательным кругом», позволяющим привести текст к читаемому виду без потери производительности.Применяя эти методы, вы сделаете ваш код надежным, а обмен данными между системами — безошибочным!