Работа с обменом данными в современной экосистеме 1С: Предприятие практически невозможна без понимания формата JSON. Разработчики часто сталкиваются с необходимостью обработать ответ от внешнего API или прочитать конфигурационный файл, который приходит в виде обычной текстовой строки. Превращение этой строки в полноценный объект ЧтениеJSON или структуру данных — критически важный этап интеграции.
Встроенные средства платформы позволяют выполнять конвертацию достаточно эффективно, но требуют соблюдения строгих правил синтаксиса. Ошибки в кодировке или формате могут привести к падению процесса чтения. В этой статье мы детально разберем механизмы десериализации, рассмотрим типичные сценарии использования и способы обработки исключительных ситуаций при работе с JSON-строками.
Вы узнаете, какие классы используются для чтения, как правильно настроить параметры потока и что делать, если входящие данные не соответствуют стандартам. Мы избежим абстрактных теорий и сосредоточимся на практическом коде, который можно сразу внедрить в ваши обработки или внешние подключения.
Базовые принципы работы с JSON в 1С
Основным инструментом для работы с данным форматом является объект ЧтениеJSON. Он предназначен исключительно для последовательного чтения данных из потока. Важно понимать, что этот объект не создает структуру данных в памяти автоматически, он лишь предоставляет методы для поочередного чтения узлов дерева.
Для того чтобы преобразовать строку в доступный для чтения формат, её необходимо сначала поместить в поток. Платформа 1С работает с потоками байтов, поэтому прямая передача строковой переменной в конструктор читателя невозможна. Требуется промежуточный этап создания ПотокВПамяти.
Процесс инициализации выглядит следующим образом: создается поток, в него записывается строка в нужной кодировке (обычно UTF-8), после чего поток передается методу УстановитьСтроку объекта чтения. Только после выполнения этих шагов можно приступать к навигации по структуре JSON.
Стоит отметить, что формат JSON в 1С строго типизирован. Числа, строки, булевы значения и null обрабатываются по-разному. Неправильное ожидание типа данных при чтении может вызвать ошибку выполнения. Всегда проверяйте тип текущего узла перед попыткой получить его значение.
⚠️ Внимание: Кодировка строки должна строго соответствовать реальной кодировке данных. Если вы попытаетесь прочитать UTF-8 строку как Win-1251, специальные символы (кириллица, эмодзи) превратятся в нечитаемый набор знаков.
Всегда используйте кодировку UTF-8 без BOM при работе с веб-сервисами, так как это стандарт де-факто для обмена данными в интернете.
Алгоритм преобразования строки в поток данных
Первым шагом в цепочке преобразования является подготовка байтового представления строки. В 1С это делается через объект ДвоичныеДанные или напрямую через методы потока. Рассмотрим наиболее надежный способ, гарантирующий сохранность всех символов.
Сначала мы создаем объект ПотокВПамяти. Это виртуальный файл, который хранится в оперативной памяти процесса 1С. Затем мы используем метод ЗаписатьТекст, явно указывая кодировку. Это критически важный момент, который часто упускают новички.
После записи текста необходимо сбросить позицию потока в начало. Если этого не сделать, объект чтения начнет сканировать поток с конца, где данных уже нет, и сразу сообщит об окончании чтения. Для этого используется метод УстановитьПозицию(0).
СтрокаJSON = "{""name"": ""Ivan"", ""age"": 25}";
Поток = Новый ПотокВПамяти();
Поток.ЗаписатьТекст(СтрокаJSON, КодировкаТекста.UTF8);
Поток.УстановитьПозицию(0);
Теперь поток готов к передаче в читатель. Такой подход универсален и работает как в управляемых, так и в обычных формах приложения. Он также позволяет легко масштабировать решение для работы с большими объемами данных, если заменить поток в памяти на поток файла.
☑️ Подготовка потока к чтению
Инициализация объекта ЧтениеJSON и настройка
После подготовки потока наступает этап создания самого читателя. Объект ЧтениеJSON обладает рядом настроек, которые влияют на поведение парсера. По умолчанию он настроен на строгое соответствие стандарту RFC 7159.
Однако в реальной жизни часто приходится сталкиваться с "грязными" данными, где, например, используются одинарные кавычки вместо двойных или отсутствуют кавычки у ключей. В таких случаях можно воспользоваться свойством ИспользоватьДвойныеКавычкиДляСтрок или другими флагами, хотя поддержка нестандартного JSON в 1С ограничена.
Процесс открытия данных выглядит просто: вызывается метод УстановитьСтроку (если данные уже в строке и платформа позволяет) или УстановитьПоток. В большинстве случаев для строковой переменной предпочтительнее вариант с потоком, описанный выше, так как он дает полный контроль над кодировкой.
| Параметр настройки | Тип значения | Описание влияния на парсинг |
|---|---|---|
| ИспользоватьДвойныеКавычкиДляСтрок | Булево | Разрешает использование двойных кавычек для имен ключей и строк |
| ТребоватьЗапятуюПослеПоследнегоЭлемента | Булево | Строгий режим: запрещает замыкающую запятую в массивах |
| ПропускатьНеизвестныеСвойства | Булево | Игнорирует поля, не описанные в ожидаемой структуре (для маппинга) |
Некоторые разработчики пытаются использовать упрощенные методы чтения, но для надежной системы лучше явно задавать параметры. Это делает код более предсказуемым при обновлении платформы 1С.
Навигация по структуре и чтение значений
Когда объект ЧтениеJSON инициализирован, начинается процесс навигации. Основной метод здесь — Прочитать(). Он перемещает указатель на следующий узел и возвращает тип прочитанного элемента. Цикл чтения продолжается до тех пор, пока метод не вернет КонецДанных.
Внутри цикла необходимо анализировать свойство ТипТекущегоУзла. В зависимости от типа (НачалоОбъекта, КонецОбъекта, ИмяСвойства, Значение), выполняются разные действия. Для извлечения конкретных данных используются методы ПрочитатьИмяСвойства() и ПрочитатьЗначение().
Рассмотрим пример чтения простого объекта. Сначала мы читаем начало объекта, затем в цикле проверяем, не конец ли это. Если нет, читаем имя свойства, а следом — его значение. Значение автоматически преобразуется в тип 1С: Число в Число, Строка в Строку.
Чтение = Новый ЧтениеJSON();
Чтение.УстановитьПоток(Поток);
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипТекущегоУзла = ТипУзлаJSON.ИмяСвойства Тогда
Имя = Чтение.ПрочитатьИмяСвойства();
Значение = Чтение.ПрочитатьЗначение();
// Обработка пары Ключ-Значение
КонецЕсли;
КонецЦикла;
Такой подход требует внимательности к вложенности. Если внутри объекта есть массив или другой объект, метод Прочитать() сообщит о начале вложенной структуры, и вам придется организовать рекурсию или стек для корректного обхода.
Особенность чтения массивов
При чтении массива тип узла будет ТипУзлаJSON.НачалоМассива. Внутри цикла нужно просто читать значения подряд, не ожидая имен свойств, до наступления КонецМассива.
Преобразование в Структуру или Соответствие
Чтение "на лету" удобно для потоковой обработки, но часто нам нужно получить готовый объект 1С, с которым удобно работать дальше. Для этого данные из JSON обычно маппят в Структуру или Соответствие.
Алгоритм преобразования подразумевает создание новой структуры. При чтении имени свойства мы добавляем новый ключ в структуру, а при чтении значения — записываем его. Если значение является сложным объектом, процесс рекурсивно повторяется для вложенной структуры.
Существуют готовые обработки сообщества, которые делают это автоматически, но понимание принципа необходимо для отладки.
- 📦 Структура — идеальный вариант, если набор полей известен заранее и фиксирован.
- 🔑 Соответствие — лучше использовать, если ключи динамические или содержат спецсимволы.
- 📋 Массив — используется для хранения списков однотипных объектов, прочитанных из JSON-массива.
При заполнении структуры проверяйте типы данных. Если в JSON пришло число, а в 1С ожидается строка, может потребоваться явное преобразование типов функциями Строка() или Число().
⚠️ Внимание: При рекурсивном преобразовании глубоких структур следите за глубиной вложенности. Слишком глубокие деревья могут привести к переполнению стека вызовов в старых версиях платформы.
Обработка ошибок и валидация данных
Работа с внешними данными всегда сопряжена с риском получения некорректной информации. Строка может быть обрезана, содержать лишние символы или нарушать синтаксис JSON. В 1С такие ситуации обрабатываются через механизм исключений Попытка..Исключение.
Объект ЧтениеJSON генерирует исключение при первой же встрече с синтаксической ошибкой. Сообщение об ошибке обычно содержит номер строки и позиции, где произошел сбой, что значительно упрощает диагностику проблем во входящем пакете данных.
Рекомендуется всегда оборачивать блок инициализации чтения и основной цикл в конструкцию обработки исключений. Это предотвратит падение всего сеанса 1С и позволит записать ошибку в журнал регистрации для последующего анализа системным администратором.
Попытка
Чтение.УстановитьПоток(Поток);
// Цикл чтения
Исключение
Сообщить("Ошибка формата JSON: " + ОписаниеОшибки());
КонецПопытки;
Также стоит выполнять предварительную валидацию строки перед попыткой чтения. Проверка на пустоту, наличие открывающих скобок { или [ может сэкономить ресурсы процессора на запуск тяжелого парсера для заведомо неверных данных.
Всегда обрабатывайте исключения при парсинге JSON. Никогда не полагайтесь на то, что внешний сервис пришлет идеальные данные.
Часто задаваемые вопросы (FAQ)
Как прочитать JSON, если он закодирован в Base64?
Сначала необходимо декодировать строку из Base64 в обычную строку или двоичные данные с помощью встроенных функций 1С, например, ПолучитьДанныеИзBase64. После этого полученную строку можно записать в поток и передать в ЧтениеJSON стандартным способом.
Можно ли изменить прочитанное значение JSON обратно в строку?
Да, для обратного преобразования используется объект ЗаписьJSON. Вы создаете поток в памяти, подключаете к нему запись, сериализуете структуру или значения, а затем считываете текст из потока функцией ПрочитатьТекст.
Почему возникает ошибка "Неверная кодировка" при чтении?
Эта ошибка возникает, когда байты в потоке не соответствуют указанной кодировке. Чаще всего проблема в том, что строка была записана в поток в кодировке по умолчанию системы (например, Windows-1251), а читатель ожидает UTF-8, или наоборот.
Как обработать JSON массив, в котором объекты имеют разный набор полей?
В этом случае лучше всего использовать объект Соответствие вместо Структуры. При чтении просто добавляйте найденные свойства в соответствие. Отсутствие ключа в одном из элементов массива не вызовет ошибки, в отличие от строгой типизации структур.
Есть ли ограничение на размер JSON строки в 1С?
Ограничение зависит от доступной оперативной памяти процесса 1С и разрядности платформы (32 или 64 бита). Для очень больших файлов (сотни мегабайт) рекомендуется использовать потоковое чтение из файла на диске, а не загружать всю строку в память сразу.