Как исправить ошибку десериализации JSON в 1С при наличии недопустимых символов в именах ключей?

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

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

Выясняем причину: Почему возникает ошибка десериализации?

Рассмотрим типовую ситуацию. Программист пишет код для обработки ответа от сервера, используя стандартные средства платформы. На первый взгляд код выглядит безупречно:


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

Однако при выполнении этого кода возникает исключение. Проанализируем структуру JSON, которую пытается обработать система. В данных часто встречаются ключи следующего вида: "organizations-req", "price_unit" или "external_id". Проблема кроется в том, что по умолчанию функция ПрочитатьJSON пытается преобразовать объекты JSON в тип Структура языка 1С.

Важный технический нюанс: Имена свойств объекта Структура в 1С должны соответствовать правилам именования переменных. Они не могут содержать дефисы (минусы), пробелы или начинаться с цифр. Как только парсер встречает ключ вроде "organizations-req", платформа не может создать свойство структуры с таким именем и выбрасывает ошибку: "Недопустимое имя свойства".

Решение №1: Использование объекта "Соответствие" (Map)

Самый простой и эффективный способ обойти ограничение именования — это указать платформе использовать объект Соответствие вместо Структура. Объект Соответствие позволяет использовать в качестве ключа практически любые строковые значения, включая те, что содержат дефисы.

Разберем, как изменить вызов функции. Нам нужно передать второй параметр в функцию ПрочитатьJSON, установив его в значение Истина:


// Вторым параметром передаем Истина, чтобы получить Соответствие вместо Структуры
Результат = ПрочитатьJSON(ЧтениеJSON, Истина);

Теперь, если в JSON придет ключ "organizations-req", система просто создаст элемент соответствия, где ключом будет строка "organizations-req". Обращение к данным в этом случае будет выглядеть так: Результат.Получить("organizations-req").

Решение №2: Правильная диагностика через ОписаниеОшибки

Зачастую разработчики скрывают истинную причину проблемы, используя пустые блоки Исключение или записывая в лог общие фразы. Чтобы быстро локализовать проблему, необходимо всегда выводить подробное описание ошибки. Проанализируем, как дополнить код для информативной отладки:


Попытка
    Результат = ПрочитатьJSON(ЧтениеJSON, Истина);
Исключение
    ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
    ЗаписатьЛог(ТекстОшибки); // Или Сообщить(ТекстОшибки);
    ВызватьИсключение;
КонецПопытки;

Именно благодаря детальному описанию ошибки (ИнформацияОбОшибке().Описание) можно увидеть конкретное сообщение: "Недопустимое имя свойства: 'organizations-req' для чтения JSON в объект Структура". Это сразу снимает все вопросы о валидности JSON и указывает на ограничения типов данных 1С. Для автоматической проверки структуры и генерации безопасных алгоритмов чтения можно использовать инструмент для валидации JSON и генерации кода 1С.

Решение №3: Предварительная обработка текста (Очистка BOM)

Иногда ошибка возникает еще до начала парсинга имен свойств — на этапе метода УстановитьСтроку. Это может быть вызвано наличием так называемого BOM (Byte Order Mark) — невидимых символов в начале строки, которые некоторые серверы добавляют при кодировании в UTF-8.

Если вы уверены, что JSON валиден, но 1С отказывается его принимать, попробуем очистить строку от лишних символов:


// Удаляем символ BOM, если он присутствует
ТекстОтвета = СтрЗаменить(ТекстОтвета, Символ(65279), "");
ЧтениеJSON.УстановитьСтроку(ТекстОтвета);

Решение №4: Трансформация имен ключей (Замена символов)

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

Посмотрим на пример реализации:


// Заменяем дефисы на нижнее подчеркивание в ключах
// Внимание: этот метод может повредить данные, если дефисы есть в значениях
ТекстОтвета = СтрЗаменить(ТекстОтвета, """organizations-req"":", """organizations_req"":");

ЧтениеJSON.УстановитьСтроку(ТекстОтвета);
Результат = ПрочитатьJSON(ЧтениеJSON, Ложь); // Читаем в Структуру

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

Работа с датами в JSON

Проанализируем поле dt_delivery из примера автора: "dt_delivery":"2023-11-15". По умолчанию 1С прочитает это значение как строку. Чтобы система автоматически преобразовала его в тип Дата, рекомендуется использовать дополнительные параметры функции ПрочитатьJSON.

Рассмотрим, как это сделать правильно:

  1. Создадим массив имен свойств, которые нужно интерпретировать как дату.
  2. Укажем формат даты (обычно это ISO или JavaScript).

МассивИменДаты = Новый Массив;
МассивИменДаты.Добавить("dt_delivery");

// Чтение с автоматической конвертацией даты
Результат = ПрочитатьJSON(ЧтениеJSON, Истина, МассивИменДаты, ФорматДатыJSON.ISO);

Подведем итоги

Для стабильной работы десериализации JSON в 1С рекомендуем придерживаться следующих правил:

Следуя этим шагам, вы сможете успешно интегрировать 1С с любыми современными API, независимо от того, какие символы они используют в своих структурах данных. Для отправки запросов и анализа сырых ответов веб-сервисов непосредственно в рабочей базе подойдёт инструмент для тестирования REST API в 1С.

← На главную