При интеграции с внешними API разработчики на 1С часто сталкиваются с ошибкой «Непредвиденный символ при чтении JSON». Эта проблема возникает в тех случаях, когда встроенный парсер 1С ожидает строгого соответствия стандарту JSON, а получает данные, содержащие мусор, неверную кодировку или даже другой формат файла. Давайте разберем по шагам, как диагностировать и устранить эту неприятность.
Первое, что мы должны сделать при получении ошибки парсинга, будь то ответ API или выгрузка метаданных в JSON, — это посмотреть, что именно вернул сервер. Часто мы ожидаем JSON, но по факту получаем совсем другое. Проанализируем заголовки ответа: если в Content-Type указано text/html, значит, вместо ожидаемых данных пришла страница с ошибкой (например, 404 Not Found или 500 Internal Server Error). В этом случае парсер 1С справедливо сообщает о «непредвиденном символе», так как он видит теги <html> вместо фигурных скобок {.
Также обратите внимание на Content-Encoding. Если там указано gzip, то данные приходят в сжатом бинарном виде. Встроенный объект ЧтениеJSON в 1С не умеет «на лету» распаковывать поток. Вам потребуется сначала получить тело ответа как бинарные данные, распаковать их, и только после этого передавать на десериализацию.
Иногда проблема кроется в невидимых символах. Маркер BOM (Byte Order Mark) в начале файла часто вызывает сбои в работе парсеров 1С. Также важно помнить, что 1С работает с UTF-8, и если внешний сервис отдает данные в другой кодировке, символы будут искажены.
Если вы подозреваете наличие лишних символов, попробуйте сохранить полученный ответ в файл и посмотреть на него в hex-редакторе. Это позволит увидеть скрытые байты, которые не отображаются в обычном текстовом редакторе.
Если стандартный механизм ПрочитатьJSON не справляется из-за специфики формата, который «понимают» PHP или другие системы, но «отвергает» 1С, можно рассмотреть использование сторонних библиотек. Существуют проверенные сообществом коннекторы, которые более гибко подходят к парсингу. Рассмотрим пример кода, который помогает обойти типичные проблемы:
// Пример использования продвинутого чтения
Попытка
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ОтветСервера);
Результат = ПрочитатьJSON(Чтение, Истина);
Исключение
// В случае ошибки логируем сырые данные для анализа
ЗаписьЖурналаРегистрации("Парсинг JSON", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
Если вы уверены, что проблема в «грязном» JSON, приходящем от внешней системы, мы можем применить методы очистки перед тем, как передавать строку в ПрочитатьJSON:
{ и индекс последней закрывающей }.СтрПолучитьСтроку или Сред, чтобы обрезать всё лишнее, что находится до и после основного объекта.СтрЗаменить для их удаления.Никогда не пытайтесь «угадать» проблему. Используйте отладчик: выведите переменную с полученным ответом в файл:
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(ОтветСервера);
ТекстовыйДокумент.Записать("C:\Temp\debug_json.txt", КодировкаТекста.UTF8);
После этого откройте файл в продвинутом редакторе (например, Notepad++), включите отображение всех символов и прогоните через онлайн-валидатор JSON. Это позволит точно увидеть, на каком именно символе спотыкается парсер. Чаще всего решение проблемы лежит на поверхности: либо это некорректный ответ сервера, либо сжатие, либо скрытые служебные символы в начале потока.
Помните: если сервис, написанный на PHP, работает успешно, значит, либо он более либерален к формату, либо он автоматически выполняет декодирование или распаковку, которую мы пропустили в реализации на 1С. Разберитесь с заголовками ответа, и вы найдете истинную причину!