Как при чтении JSON в 1С сохранить строковые значения и избежать автоматического приведения типов?

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

При работе с внешними API в среде 1С часто возникает ситуация, когда при парсинге входящего JSON платформа автоматически определяет типы данных. Например, если в JSON поле передано как "id": 5272092 (без кавычек), стандартный парсер 1С распознает его как число. Если таких полей десятки или сотни, ручное приведение каждого из них к строке с помощью функции Строка() становится трудоемкой и неэффективной задачей. Давайте разберем, как автоматизировать этот процесс и корректно обработать данные.

Почему 1С преобразует типы?

Стандартный парсер 1С строго следует спецификации JSON. Согласно правилам, отсутствие кавычек вокруг значения однозначно интерпретирует его как число. Платформа 1С в методе ПрочитатьJSON пытается максимально точно сопоставить данные из строки с типами данных системы. Изменить поведение парсера на «читать все как текст» глобально невозможно, так как это нарушило бы логику работы с форматами данных.

Решение: использование функции восстановления данных

Вместо того чтобы вручную перебирать все поля после чтения, мы можем воспользоваться встроенным механизмом ИмяФункцииВосстановления. Этот параметр метода ПрочитатьJSON позволяет указать функцию, которая будет автоматически вызываться для каждого свойства при чтении. Это идеальный способ перехватить «числовые» значения на лету и преобразовать их в нужный нам строковый формат.

Разберем, как это реализовать на практике. Вам потребуется создать функцию, которая будет принимать значение и, в зависимости от его типа, возвращать его в требуемом виде:


Функция ОбработчикВосстановленияДанных(ИмяСвойства, Значение) Экспорт
    Если ТипЗнч(Значение) = Тип("Число") Тогда
        Возврат Формат(Значение, "ЧГ=0");
    КонецЕсли;
    Возврат Значение;
КонецФункции

Теперь при вызове метода ПрочитатьJSON мы передаем имя этой функции в качестве параметра:


ЧтениеJSON = Новый ЧтениеJSON();
ЧтениеJSON.УстановитьСтроку(ОтветJSON);

Данные = ПрочитатьJSON(ЧтениеJSON, Ложь, , "ОбработчикВосстановленияДанных");

Такой подход позволяет один раз написать обработчик, который будет автоматически приводить любые числа (включая длинные идентификаторы) к строковому виду во всей структуре или соответствии, полученном после чтения.

Альтернативные методы и рекомендации

Если проект требует строгого соблюдения типизации или данные имеют очень сложную вложенную структуру, стоит рассмотреть следующие подходы:

  1. Сериализация через XDTO: Если вы часто работаете с определенным форматом данных, описание схемы в XDTO-пакете позволяет задать типы данных для каждого поля на уровне платформы. При использовании СериализаторXDTO, 1С будет опираться на схему, а не на стандартный парсинг, что гарантирует правильное приведение типов.
  2. Контроль на стороне API: Всегда помните, что если данные, которые вы получили в виде строк, вам нужно будет отправить обратно в этот же API, то «обман» системы (принудительное преобразование чисел в строки) может привести к ошибкам на стороне получателя. Если сервис ожидает число, передача строки может вызвать исключение при валидации входящих данных.
  3. Использование Формат(): При необходимости конвертации чисел в строки, всегда используйте Формат(Значение, "ЧГ=0") вместо простого Строка(Значение). Это защитит вас от появления лишних пробелов (разделителей групп разрядов), которые платформа может автоматически добавлять в строковое представление числа в зависимости от региональных настроек пользователя.

Подводя итог, использование ИмяФункцииВосстановления является наиболее гибким и профессиональным способом решения задачи. Это избавляет вас от необходимости писать громоздкие циклы обхода структур и делает код более поддерживаемым и читаемым.

← На главную