Почему при отладке в 1С возникает ошибка "Текущее значение JSON не может быть получено" и как ее исправить?

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

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

Давайте подробно разберем, почему возникает эта ситуация, проанализируем реальный пример и выясним, какие существуют способы решения этой проблемы.

Анализ исходной ситуации

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


Попытка
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(СтрокаJSONРезультат);
    Результ = ПрочитатьJSON(Чтение);
    
    // Обработка успешного ответа...
    Отв.Ok = Истина;
    Отв.Result = Результ;
    Возврат Отв;
Исключение
    Попытка
        // Попробуем прочитать в соответствие
        Чтение = Новый ЧтениеJSON;
        Чтение.УстановитьСтроку(СтрокаJSONРезультат);
        Результ = ПрочитатьJSON(Чтение, Истина); // Параметр Истина указывает читать в Соответствие
        Отв.Ok = Истина;
        Отв.Result = Результ;
        Возврат Отв;
    Исключение
        Отв.Ok = Ложь;
        Отв.Result = ОписаниеОшибки() + " " + СтрокаJSONРезультат;
        Возврат Отв;
    КонецПопытки;
КонецПопытки;

В данном коде разработчик сначала пытается прочитать JSON в структуру (поведение по умолчанию), а если возникает ошибка — пробует прочитать его в соответствие, передавая параметр Истина в функцию ПрочитатьJSON().

Чтение в соответствие часто помогает избежать ошибок, если ключи в JSON не соответствуют правилам именования переменных в 1С (например, если ключ начинается с цифры, как "0": "значение"). Однако, даже при чтении в соответствие код уходит в исключение, а отладчик на объекте Чтение показывает ошибку.

Посмотрим на фрагмент проблемного JSON:


{"success":true,"data":{"id":00000000,"user_token":"1a1a1a...","name":"Имя Фамилия","0":"1a1a1a..."}}

В чем кроется истинная причина ошибки?

Фраза «Текущее значение JSON не может быть получено» — это системное сообщение отладчика 1С. Оно отображается, когда вы пытаетесь просмотреть свойство ТекущееЗначение объекта ЧтениеJSON, но парсер платформы не смог спозиционироваться на валидном узле. Это означает, что чтение прервалось из-за грубой синтаксической ошибки в самой строке.

Проанализируем наш JSON. Обратите внимание на пару ключ-значение: "id":00000000. Именно здесь кроется корень проблемы.

Платформа 1С использует очень строгий встроенный парсер, который неукоснительно следует официальной спецификации формата (RFC 8259). Согласно стандарту, числовые значения в JSON не могут содержать ведущие нули. Разрешен только единственный ноль перед десятичной точкой (например, 0.15 или просто 0). Запись вида 00000000 или 0123 является невалидной.

Некоторые браузеры или сторонние библиотеки могут "прощать" такую разметку и автоматически преобразовывать ее, но 1С считает число 00000000 грубым нарушением синтаксиса и выбрасывает исключение до того, как дело дойдет до создания Структуры или Соответствия. Поэтому передача параметра Истина в метод чтения здесь бессильна — файл не проходит даже базовую проверку на валидность разметки.

Варианты решения проблемы

Рассмотрим, как мы можем исправить эту ошибку и заставить 1С успешно прочитать данные.

1. Исправление на стороне сервера (API)

Самый правильный и надежный путь — обратиться к разработчикам стороннего сервиса, который отдает вам этот JSON. Значение, состоящее из нулей, скорее всего, подразумевает некую строку (код, идентификатор), а не математическое число. В валидном JSON оно должно передаваться в кавычках:

"id": "00000000"

Если API начнет возвращать идентификаторы в строковом формате, встроенный парсер 1С прочитает документ без единой ошибки.

2. Предварительная очистка (санитаризация) строки в 1С

Если изменить ответ стороннего сервера невозможно (например, это публичное API, на которое вы не можете повлиять), нам придется исправлять строку средствами 1С до того, как передать её в объект ЧтениеJSON.

Мы можем использовать регулярные выражения (через COM-объект VBScript.RegExp для Windows-сред) для поиска невалидных чисел и оборачивания их в кавычки.


// Пример использования регулярных выражений для исправления JSON
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.IgnoreCase = Истина;
RegExp.Global = Истина;
RegExp.MultiLine = Истина;

// Ищем числа с ведущими нулями, которые не обернуты в кавычки
RegExp.Pattern = "(""id""\s*:\s*)(0[0-9]+)";

Если RegExp.Test(СтрокаJSONРезультат) Тогда
    // Оборачиваем найденное невалидное число в кавычки
    СтрокаJSONРезультат = RegExp.Replace(СтрокаJSONРезультат, "$1""$2""");
КонецЕсли;

// Теперь строку можно безопасно читать
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSONРезультат);
Результ = ПрочитатьJSON(Чтение, Истина);

Если структура всегда жестко фиксирована и вы точно знаете, что проблема возникает только с полем "id":00000000, можно обойтись простым методом СтрЗаменить, хотя это и менее универсальный подход.

3. Проверка HTTP-статусов перед чтением

В рамках обсуждения подобных проблем стоит упомянуть еще одну частую причину сообщения "Текущее значение JSON не может быть получено". Иногда удаленный сервер "падает" или возвращает ошибку авторизации. В таких случаях вместо ожидаемого JSON ответа (начинающегося с { или [) приходит HTML-страница (например, с тегом <!DOCTYPE HTML> и текстом "502 Bad Gateway").

Попытка скормить HTML-код в объект ЧтениеJSON приведет точно к такой же ошибке в отладчике. Чтобы этого избежать, перед разбором строки всегда проверяйте код ответа сервера:


HTTPОтвет = HTTPСоединение.Получить(HTTPЗапрос);

Если HTTPОтвет.КодСостояния = 200 Тогда
    СтрокаJSON = HTTPОтвет.ПолучитьТелоКакСтроку();
    // Инициализация чтения JSON
Иначе
    Сообщить("Ошибка сервера: " + HTTPОтвет.КодСостояния);
    // Логирование тела ответа для диагностики
КонецЕсли;

Итоги

Мы выяснили, что ошибка парсинга возникает из-за нестрогого соблюдения стандарта JSON на стороне отдающей системы. Платформа 1С не терпит вольностей вроде чисел с ведущими нулями. Подведем краткие итоги для построения отказоустойчивых интеграций:

  1. Всегда проверяйте валидность проблемной строки в сторонних онлайн-валидаторах JSON. Это сразу покажет, есть ли синтаксические нарушения.
  2. Ключи-числа (например, "0") в 1С успешно читаются, если использовать чтение в Соответствие (параметр Истина). Но это не спасает от невалидных значений (без кавычек).
  3. Если сервер отдает невалидный формат, приоритетным решением является исправление на стороне сервера. Если это невозможно — применяйте регулярные выражения для подготовки строки перед парсингом в 1С.
  4. Всегда логируйте сырую строку (ответ сервера) перед попыткой ее разобрать. Это критически важно для разбора полетов в отладчике.
← На главную