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

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

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

Основы формата JSON в контексте платформы 1С

Формат JavaScript Object Notation представляет собой текстовое представление данных, основанное на парах «ключ-значение» и упорядоченных списках. Для платформы 1С:Предприятие это не просто строка, а потенциальная структура метаданных. Понимание соответствия типов JSON типам 1С является критически важным этапом перед началом написания кода.

Когда вы получаете строку от внешнего сервиса, она выглядит как обычный текст. Однако внутри нее закодированы логические связи. Например, булевы значения true и false в JSON должны быть корректно сопоставлены с типом Булево в 1С, а числовые значения могут требовать проверки на соответствие типу Число или Дата.

  • 📦 Объект JSON (фигурные скобки {}) преобразуется в тип Структура или Соответствие.
  • 📚 Массив JSON (квадратные скобки []) становится типом Массив в коде 1С.
  • 🔢 Примитивы (строки, числа, null) маппятся в соответствующие скалярные типы платформы.

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

⚠️ Внимание: В старых версиях платформы (до 8.3.10) поддержка UTF-8 с BOM могла работать некорректно при чтении файлов. Всегда проверяйте кодировку входящего потока данных, чтобы избежать появления «кракозябр» в начале строки.

Метод ЧтениеJSON: пошаговый разбор потока данных

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

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

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

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

Пока Чтение.Прочитать() Цикл

ТипТокена = Чтение.ТипТокена;

// Обработка токена

КонецЦикла;

Использование ЧтениеJSON требует от разработчика внимательного отслеживания состояния парсера. Вы должны самостоятельно определять, когда начинается объект, когда заканчивается массив и где находятся значения. Это дает гибкость, но увеличивает объем кода.

💡

Используйте метод ЧтениеJSON, если объем входящих данных превышает 100 МБ. Это позволит избежать переполнения оперативной памяти сервера 1С.

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

Использование ПарсерТекста для быстрой конвертации

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

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

Попытка

Данные = ПарсерТекста.ПрочитатьJSON(JSONСтрока);

Исключение

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

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

Результатом работы ПарсерТекста будет объект типа Структура, если корневой элемент JSON — объект, или Массив, если корень — список. Доступ к данным осуществляется стандартными методами: Данные.ИмяКлюча или Данные.Получить("ИмяКлюча").

📊 Какой метод разбора JSON вы используете чаще?
ЧтениеJSON (потоковый)
ПарсерТекста (мгновенный)
Регулярные выражения
Сторонние обработки

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

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

Реальные данные редко бывают плоскими. Чаще всего вы сталкиваетесь с глубоко вложенными структурами, где внутри массива объектов лежат другие массивы. Навигация по таким данным требует аккуратности и проверки типов на каждом уровне.

Представим ситуацию: вы получили список заказов, и в каждом заказе есть список товаров. Чтобы добраться до названия товара, нужно сначала получить массив заказов, затем конкретный заказ (структуру), и уже внутри него — массив товаров.

Уровень вложенности Тип в JSON Тип в 1С Метод доступа
Корень Object Структура Свойство или Получить()
Список заказов Array Массив Получить(Индекс)
Товар в заказе Object Структура Свойство
Атрибут цены Number Число Прямое чтение

При обращении к элементам массива всегда проверяйте его размерность методом ВГраница(). Попытка обратиться к несуществующему индексу вызовет исключение, которое может прервать выполнение всей транзакции.

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

⚠️ Внимание: Если внешний сервис изменил структуру ответа и убрал какое-то поле, прямой доступ к свойству Объект.ОтсутствующееПоле вернет Неопределено, а не вызовет ошибку. Однако попытка вызвать метод у Неопределено приведет к падению кода.

Обработка ошибок и некорректных данных

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

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

  • 🛡️ Всегда проверяйте, что переменная действительно содержит строку перед парсингом.
  • 🔍 Логгируйте первые 100 символов полученной строки при ошибке для отладки.
  • 🔄 Реализуйте механизм повторных попыток при временных сбоях сети.

Частой проблемой является несоответствие типов. Например, поле «Дата» может прийти как строка в формате ISO 8601, а может как Unix-timestamp (число). Ваш код должен быть готов к обоим вариантам, используя функцию ТипЗнч() для динамической проверки.

Как обрабатывать null в JSON?

Значение null из JSON преобразуется в значение Неопределено типа 1С. При попытке записать такое значение в поле базы данных, имеющее тип, отличный от Универсальный, возникнет ошибка. Необходимо явно проверять данные перед записью.

Практический пример: загрузка курса валют

Рассмотрим полный пример загрузки курса валют из внешнего API. Мы получим JSON, разберем его и сохраним значение в переменную. Этот сценарий покрывает 90% типовых задач разработчика 1С.

Сначала мы формируем HTTP-запрос. Получив ответ, мы извлекаем тело ответа в строку. Затем используем ПарсерТекста для получения структуры. Из структуры извлекаем массив валют и находим нужную.

Функция ПолучитьКурсВалюты(КодВалюты)

СтрокаJSON = ПолучитьДанныеОтСервиса(); // Условная функция

Попытка

СтруктураДанных = ПарсерТекста.ПрочитатьJSON(СтрокаJSON);

МассивВалют = СтруктураДанных.Valutes;

Для каждого Элемент Из МассивВалют Цикл

Если Элемент.CharCode = КодВалюты Тогда

Возврат Элемент.Value;

КонецЕсли;

КонецЦикла;

Исключение

ЗаписьЖурналаРегистрации("ОшибкаJSON", УровеньЖурналаРегистрации.Ошибка, , ОписаниеОшибки());

Возврат Null;

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

КонецФункции

Обратите внимание на использование ЗаписьЖурналаРегистрации. Это критически важный элемент администрирования. Без логов вы не сможете понять, почему обмен данными перестал работать в 3 часа ночи.

💡

Всегда разделяйте логику получения данных (HTTP-запрос) и логику их разбора (Парсинг). Это упростит тестирование и замену источников данных в будущем.

Часто задаваемые вопросы (FAQ)

Как преобразовать структуру 1С обратно в JSON строку?

Для обратной сериализации используйте объект ЗаписьJSON или метод ПарсерТекста.ЗаписатьJSON(). Передайте в метод вашу структуру или массив, и он вернет корректно форматированную строку.

Почему ПарсерТекста выдает ошибку "Неверный формат JSON"?

Чаще всего проблема в лишних символах до или после скобок (например, пробелы, служебные заголовки сервера). Проверьте строку на наличие BOM-символов или обрежьте её, оставив только диапазон от первой { до последней }.

Можно ли разобрать JSON, если ключи содержат пробелы или спецсимволы?

Да, но обращаться к таким ключам через точку (как к свойству) нельзя. Необходимо использовать метод Получить("Имя Ключа"), передавая имя ключа строкой в явном виде.

Как обработать очень большой JSON файл (гигабайты)?

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