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

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

Подготовка среды и чтение потока данных

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

Данные могут поступать в систему различными способами: это может быть прямой ответ от HTTP-запроса, содержимое файла на диске или строка, переданная из внешнего источника. В зависимости от источника данных метод инициализации ЧтениеJSON будет отличаться. Если вы работаете с файлом, система сама позаботится о буферизации, а при работе со строкой в памяти важно убедиться, что она не пустая и имеет валидную структуру.

Для начала работы достаточно создать экземпляр объекта и вызвать соответствующий метод установки источника. Обратите внимание, что при чтении из строки кодировка обычно определяется автоматически, но при работе с бинарными данными из файла может потребоваться явное указание кодировки UTF-8, так как именно она является стандартом для JSON.

⚠️ Внимание: Если структура JSON повреждена или содержит синтаксические ошибки (например, лишняя запятая в конце списка), объект ЧтениеJSON выбросит исключение при попытке чтения. Всегда оборачивайте процедуру чтения в конструкцию Попытка...Исключение.

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

ТекстJSON = "{""name"": ""Ivan"", ""age"": 25}";

Чтение = Новый ЧтениеJSON;

Чтение.УстановитьСтроку(ТекстJSON);

💡

Используйте метод ЧтениеJSON.Прочитать() в цикле, если вам нужно просто скопировать структуру в объект 1С без глубокого анализа каждого поля вручную.

Алгоритм последовательного обхода структуры

Самый надежный способ разбора сложного документа — это последовательный проход по всем узлам. Метод Прочитать() возвращает тип текущего элемента, что позволяет программисту понять, что именно находится перед ним: начало объекта, значение примитивного типа или конец коллекции. Такой подход универсален и работает даже с документами, структура которых вам заранее неизвестна.

В процессе обхода вам придется отслеживать контекст: находимся ли мы внутри массива или внутри объекта. Это важно, потому что в объекте за значением всегда следует имя свойства, а в массиве — просто следующее значение. Логика обработки должна ветвиться в зависимости от возвращаемого типа узла.

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

Тип узла (Перечисление) Описание Действие разработчика
НачалоОбъекта Символ "{" Создать новый объект Структура или Соответствие
НачалоМассива Символ "[" Создать новый объект Массив
ИмяСвойства Ключ объекта Сохранить имя для связки со следующим значением
Значение Данные (строка, число) Получить значение через Чтение.ТекущееЗначение
КонецОбъекта Символ "}" Завершить формирование текущей структуры

Реализация цикла чтения требует аккуратности. Вы должны проверять тип узла и действовать соответственно. Если вы встретили ИмяСвойства, следующим шагом обязательно будет чтение значения, которое нужно положить в структуру под этим именем.

📊 Какой способ парсинга JSON вы используете чаще?
Ручной обход через ЧтениеJSON
Автоматическое чтение в Структуру
Сторонние обработки
Не работаю с JSON

Автоматическое преобразование в объекты 1С

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

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

Для использования этого метода достаточно вызвать чтение сразу после установки строки. Результатом будет корневой объект, содержащий всю иерархию данных. Если JSON представляет собой список товаров, вы получите Массив структур, где каждая структура описывает один товар.

Чтение = Новый ЧтениеJSON;

Чтение.УстановитьСтроку(ОтветHTTP);

// Автоматически создаст Структуру или Массив

Данные = Чтение.Прочитать();

После выполнения этой команды переменная Данные будет содержать полноценный объект 1С, с которым можно работать стандартными методами: обращаться к свойствам по ключу, iterating циклом Для каждого и т.д. Это наиболее предпочтительный метод для типовых интеграций.

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

Что делать, если Автоматическое чтение выдает ошибку?

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

Работа с вложенными массивами и объектами

Реальные данные редко бывают плоскими. Чаще всего вы столкнетесь с многоуровневой вложенностью, где внутри объекта находится массив, а внутри элементов массива — снова объекты. При автоматическом чтении такая структура сохраняется полностью, и доступ к данным осуществляется через цепочку ключей.

Например, если вы получаете ответ от интернет-магазина, то в корне может лежать объект "Заказ", внутри него массив "Товары", а в каждом товаре — объект "Артикул" с полями "Код" и "Баркод". Чтобы достать код товара, вам нужно последовательно обратиться к каждому уровню вложенности, проверяя существование ключей, чтобы не получить ошибку выполнения.

При ручном парсинге работа с вложенностью требует использования стека или рекурсии. Вам нужно запоминать текущий контекст: если вы вошли в массив, все последующие значения до конца массива должны добавляться в текущий список. Если вы вошли в объект, значения должны маппиться на ключи. Это усложняет код, но дает гибкость.

  • 📦 Вложенные объекты: Преобразуются в структуру 1С, доступ к полям через Данные.Свойство или Данные["Свойство"].
  • 📋 Массивы значений: Преобразуются в объект Массив, перебор осуществляется циклом Для каждого Элемент из Массив.
  • 🔢 Примитивные типы: Числа, строки и булевы значения преобразуются в соответствующие типы 1С автоматически.

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

💡

Используйте метод Структура.Получить() с параметром по умолчанию, чтобы избежать ошибок при обращении к несуществующим ключам во вложенных объектах.

Обработка ошибок и валидация данных

Ни одна интеграция не застрахована от сбоев. Внешняя система может вернуть пустой ответ, изменить формат данных или прислать невалидный JSON. robust-код должен предусматривать все эти сценарии. Основным инструментом защиты является блок обработки исключений.

Помимо синтаксических ошибок, существуют логические ошибки. Например, поле "Цена" пришло в виде строки "free" вместо числа. Если вы попытаетесь записать это в числовое поле регистра или документа, 1С выдаст ошибку преобразования типа. Поэтому после парсинга часто требуется этап валидации и нормализации данных.

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

Попытка

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

Данные = Чтение.Прочитать();

Исключение

Сообщить("Ошибка разбора JSON: " + ОписаниеОшибки());

Возврат Неопределено;

КонецПопытки;

Практические примеры и оптимизация

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

Также стоит учитывать особенности кодировки. Если вы читаете файл, убедитесь, что он сохранен в UTF-8 без BOM, иначе первые символы могут быть интерпретированы неверно. Для веб-запросов 1С обычно сама корректно обрабатывает заголовки Content-Type и кодировку ответа.

Используйте профиль производительности, если операция парсинга выполняется часто. Иногда проще попросить партнеров по обмену изменить формат выгрузки на более плоский или использовать формат XML, который в некоторых сценариях 1С обрабатывает быстрее благодаря встроенным схемам данных (XDTO).

⚠️ Внимание: Интерфейсы и методы работы с HTTP-запросами могут обновляться в новых версиях платформы. Всегда сверяйтесь с синтаксис-помощником вашей конкретной версии 1С, если стандартные методы не срабатывают.

☑️ Проверка перед запуском обмена

Выполнено: 0 / 4
Как распарсить JSON, если я не знаю его структуру заранее?

Используйте метод ЧтениеJSON.Прочитать() в цикле Пока Чтение.Прочитать(). Анализируйте свойство Чтение.ТипТекущегоУзла. Если это ИмяСвойства, запоминайте имя. Если Значение, сохраняйте его в временную структуру, используя последнее запомненное имя как ключ. Это позволит построить дерево данных динамически.

Можно ли записать объект 1С обратно в строку JSON?

Да, для этого используется объект ЗаписьJSON. Вы создаете экземпляр, устанавливаете строку в качестве потока вывода, а затем вызываете метод Записать(), передавая туда вашу структуру или массив. Система автоматически выполнит сериализацию.

Почему при чтении числа теряется точность?

Это редкая ситуация, но она возможна при очень больших числах. JSON стандарт не ограничивает длину числа, а тип Число в 1С имеет свои ограничения. Если вы работаете с финансовыми данными высокой точности, рекомендуется читать такие поля как строки, а затем преобразовывать их в 1С явным образом с нужной точностью.

Как обработать экранированные кавычки внутри строки JSON?

Объект ЧтениеJSON делает это автоматически. Вам не нужно вручную заменять \" на кавычки. При чтении значения типа Значение вы получите уже очищенную строку, готовую к использованию в коде 1С.