Современные системы обмена данными все чаще используют формат JSON, и платформа 1С:Предприятие не является исключением. Разработчики и администраторы регулярно сталкиваются с необходимостью импорта конфигураций, получения ответов от веб-сервисов или обработки выгрузок из сторонних CRM. Умение корректно прочитать и распарсить структуру файла является базовым навыком для любого специалиста, работающего с интеграциями в экосистеме 1С.
В отличие от XML, где навигация по дереву элементов интуитивно понятна, работа с JSON требует понимания специфической иерархии объектов и массивов. Платформа предоставляет мощный встроенный механизм, который позволяет избежать написания сложных регулярных выражений. Однако, неправильное использование потоков или игнорирование типов данных может привести к ошибкам выполнения или некорректному чтению информации.
В этой статье мы детально разберем алгоритм действий, необходимый для успешного чтения данных. Вы узнаете, как инициализировать объект чтения, как проходить по узлам дерева и как преобразовывать полученные значения в привычные типы 1С. Мы рассмотрим как чтение из физического файла на диске, так и обработку строки, полученной из HTTP-запроса.
Подготовка окружения и базовые понятия
Прежде чем приступать к написанию кода, необходимо убедиться, что ваша конфигурация поддерживает работу с современными форматами данных. Класс ЧтениеJSON доступен во всех актуальных версиях платформы, начиная с версии 8.3.8. Для работы вам потребуется создать новый модуль, будь то общая форма, модуль менеджера или внешний обработчик.
Ключевым элементом здесь является объект ЧтениеJSON. Он работает по принципу потока (stream), последовательно считывая символы и токены из источника. Это означает, что вы не можете просто "загрузить весь файл в память" одной командой, как это иногда делают с текстовыми файлами. Вам нужно программно управлять курсором чтения.
⚠️ Внимание: Файл должен быть сохранен в кодировке UTF-8. Если вы попытаетесь прочитать файл в кодировке ANSI или Windows-1251 без предварительной конвертации, объект
ЧтениеJSONвыдаст ошибку синтаксического анализа на первом же символе.
Важно также понимать структуру самого JSON. Данные могут представлять собой как одиночный объект, так и массив объектов. Алгоритм чтения будет незначительно отличаться в зависимости от того, с чего начинается файл. В 1С нет автоматического приведения типов, поэтому разработчик должен явно указывать, какого типа значение он ожидает получить.
Перед началом работы откройте ваш JSON файл в любом текстовом редакторе (например, Notepad++ или VS Code) и убедитесь, что там нет скрытых символов BOM в начале файла, они могут вызвать ошибку парсинга.
Инициализация объекта чтения и открытие источника
Первым шагом в любом сценарии является создание экземпляра класса ЧтениеJSON. Это делается стандартным способом через конструктор нового объекта. После создания необходимо указать источни данных. Чаще всего это физический путь к файлу на сервере или клиентском компьютере.
Для открытия файла используется метод ОткрытьФайл. Он принимает строковый аргумент с полным путем. Если файл находится в каталоге данных информационной базы, путь можно сформировать динамически. Ошибки при открытии, например, отсутствие файла или запрет доступа, необходимо обрабатывать в блоке Попытка...Исключение.
Чтение = Новый ЧтениеJSON;
Попытка
Чтение.ОткрытьФайл("C:\Data\config.json");
Исключение
Сообщить("Ошибка открытия файла: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Альтернативный сценарий — чтение из строки. Это актуально, когда JSON приходит в теле HTTP-ответа или хранится в поле типа Длинный текст в базе данных. В этом случае вызывается метод ОткрытьСтроку. Логика дальнейшей обработки остается идентичной, меняется только источник входных данных.
☑️ Проверка перед запуском
После успешного открытия источник считается активным. Объект чтения занимает системные ресурсы, поэтому критически важно не забыть освободить их после завершения работы. Это делается вызовом метода Закрыть, который обычно помещают в блок КонецПопытки конструкции обработки исключений.
Навигация по структуре данных JSON
Самый ответственный этап — это проход по узлам дерева. Объект ЧтениеJSON предоставляет метод Прочитать, который перемещает указатель на следующий элемент. Возвращаемое значение этого метода — перечисление ТипЧтенияJSON, которое говорит нам, что именно мы нашли: начало объекта, конец массива, имя свойства или значение.
Цикл чтения обычно строится на условии, пока метод Прочитать возвращает значение, отличное от КонецДанных. Внутри цикла используется оператор Выбор (Switch) для реакции на разные типы токенов. Это позволяет гибко реагировать на структуру документа любой сложности.
- 📂 НачалоОбъекта — сигнализирует о входе в новую структуру данных (фигурные скобки).
- 📦 НачалоМассива — указывает на начало списка элементов (квадратные скобки).
- 🏷️ ИмяСвойства — возвращает строковое имя текущего поля, значение которого идет следующим.
- 📝 Значение — содержит непосредственно данные (число, строку, булево значение).
Важно помнить о вложенности. Когда вы встречаете НачалоОбъекта, вы должны быть готовы рекурсивно или циклически обрабатывать его содержимое до тех пор, пока не встретите соответствующий КонецОбъекта. Игнорирование этого правила приведет к рассинхронизации чтения и пропуску данных.
Что такое ТипЧтенияJSON?
Это перечисление, содержащее константы: Неизвестно, НачалоОбъекта, КонецОбъекта, НачалоМассива, КонецМассива, ИмяСвойства, Значение, КонецДанных. Знание этих констант обязательно для написания корректного парсера.
Для хранения текущего состояния часто используют переменные-флаги или стек. Например, если вы читаете имя свойства "ID", следующая итерация цикла обязательно вернет значение этого ID. Логика программы должна это предвидеть и сохранять имя свойства во временную переменную.
Извлечение и преобразование значений
Когда курсор находится на типе Значение, необходимо извлечь данные. Метод ТекущееЗначение возвращает вариант (Variant), который может содержать число, строку, дату или булево значение. Прямое присваивание переменной типа 1С может вызвать ошибку приведения типов, если формат не совпадает.
Особое внимание следует уделить датам. В JSON даты часто передаются в строковом формате или как количество миллисекунд (Unix timestamp). Платформа 1С не всегда автоматически распознает строку "2023-10-05T14:48:00" как дату. Возможно, потребуется явное преобразование через функцию Дата или парсинг строки.
| Тип в JSON | Тип в 1С | Нюансы конвертации |
|---|---|---|
| String | Строка | Прямое соответствие, проблем нет. |
| Number | Число | Дробная часть разделяется точкой, 1С поймет корректно. |
| Boolean | Булево | true/false преобразуются в Истина/Ложь. |
| Null | Неопределено | Требуется проверка на Неопределено перед использованием. |
Если значение представляет собой Null, метод ТекущееЗначение вернет Неопределено. Попытка записать такое значение в реквизит справочника, где заполнение обязательно, приведет к ошибке записи. Всегда проверяйте данные перед сохранением в регистры или документы.
⚠️ Внимание: Числа с плавающей точкой в JSON могут иметь высокую точность. При записи в реквизиты 1С с типом
Число(15,2)может произойти округление. Сверяйте требования к точности в техническом задании интеграции.
Обработка массивов и вложенных структур
Реальные данные редко бывают плоскими. Чаще всего JSON представляет собой список объектов, внутри которых есть другие списки. Для обработки таких структур удобно использовать рекурсивные процедуры. Вы создаете функцию, которая принимает объект ЧтениеJSON и текущий уровень вложенности.
При встрече НачалоМассива цикл продолжается до тех пор, пока не будет получен КонецМассива. Внутри этого цикла каждый элемент может быть снова объектом, что требует повторного вызова логики обработки объекта. Такой подход делает код универсальным и независимым от глубины вложенности.
Пример логики: если мы читаем массив заказов, то каждый элемент массива — это заказ. Внутри заказа может быть массив товаров. Алгоритм должен уметь переключать контекст: "сейчас мы читаем заказ", "теперь мы читаем товар". Это реализуется через анализ имени свойства, которое предшествовало входу в структуру.
Использование рекурсии при чтении вложенных JSON-структур значительно упрощает код и делает его устойчивым к изменениям в глубине вложенности данных со стороны поставщика интеграции.
Не забывайте сбрасывать временные переменные при переходе от одного элемента массива к другому. Если вы накапливаете данные в общий массив 1С, убедитесь, что новый элемент структуры добавляется корректно, а не перезаписывает предыдущий из-за ошибки логики.
Завершение работы и обработка ошибок
Корректное завершение процедуры чтения так же важно, как и ее начало. После выхода из цикла чтения необходимо вызвать метод Закрыть() у объекта ЧтениеJSON. Это освобождает файловый дескриптор и память. Если этого не сделать, при повторном запуске обработки файл может оставаться заблокированным операционной системой.
Обработка исключений должна охватывать весь блок работы с файлом. Ошибки могут возникать на любом этапе: от отсутствия прав доступа до нарушения синтаксиса JSON (например, лишняя запятая в конце списка). Текст ошибки следует логировать в журнал регистрации для последующего анализа.
Попытка
// ... код чтения ...
Исключение
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка, , ОписаниеОшибки());
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
В производственной среде рекомендуется реализовать механизм "грязного чтения". Если в файле встречается неизвестное поле или неверный тип, система не должна падать с критической ошибкой. Лучше пропустить проблемный элемент, записать предупреждение и продолжить обработку остальных данных.
Используйте режим отладки 1С с точками останова внутри цикла чтения, чтобы визуально отслеживать изменение свойства ТипЧтенияJSON на каждой итерации. Это лучший способ понять логику парсера.
Часто задаваемые вопросы (FAQ)
Можно ли читать очень большие JSON файлы (более 100 Мб)?
Да, класс ЧтениеJSON работает потоково и не загружает весь файл в оперативную память сразу. Однако скорость обработки может быть низкой. Для огромных файлов рекомендуется разбивать их на части на стороне источника или использовать асинхронную обработку в фоновом задании.
Как прочитать JSON, если я не знаю структуру заранее?
Вам придется написать универсальный парсер, который просто проходит по всем узлам и выводит имя свойства и значение в таблицу значений или лог. Для анализа структуры можно использовать внешние онлайн-валидаторы перед написанием кода.
Почему возникает ошибка "Неверная дата" при чтении?
Скорее всего, дата в JSON записана в формате, отличном от ожидаемого 1С. Попробуйте прочитать значение как Строку, а затем программно преобразовать её в тип Дата, используя функцию ДатаВремя() или парсинг подстроки.
Можно ли использовать ЧтениеJSON на клиенте?
Да, объект ЧтениеJSON доступен в клиентском контексте. Однако чтение файлов с локального диска клиента возможно только при наличии соответствующих прав и подтверждений безопасности браузера или толстого клиента.
Как отличить пустой массив от null?
Пустой массив будет иметь последовательность токенов НачалоМассива -> КонецМассива. Значение null придет как токен Значение, где ТекущееЗначение равно Неопределено. Логика обработки должна различать эти два случая.