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

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

Далее мы подробно разберем алгоритм работы с объектом чтения, рассмотрим типичные сценарии использования и затронем вопросы производительности. Понимание внутренней логики парсера поможет вам писать устойчивый код, который не «упадет» при изменении формата ответа от внешнего сервиса. Мы также обсудим разницу между чтением в структуру и ручным перебором узлов.

Инициализация объекта чтения и подготовка потока данных

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

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

Для начала анализа структуры необходимо вызвать метод Прочитать, который продвинет указатель на первый узел и вернет тип этого узла. Тип возвращаемого значения определяется перечислением ТипУзлаJSON, что позволяет строить логику обработки через оператор Если или Выбор.

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

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

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

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

Если Чтение.Прочитать() = ТипУзлаJSON.НачалоОбъекта Тогда

// Мы внутри корневой структуры

КонецЕсли;

💡

Используйте метод Чтение.ТекущийУзел() только после успешного вызова Чтение.Прочитать(), иначе вы получите неопределенное значение.

Навигация по структуре объекта и чтение свойств

Когда курсор указывает на начало объекта (НачалоОбъекта), следующим шагом становится перебор его свойств. Внутри объекта данные хранятся в виде пар «Имя свойства — Значение». Для перехода к имени свойства используется метод ПрочитатьИмяСвойства, а для получения самого значения — повторный вызов Прочитать. Этот процесс циклически повторяется до тех пор, пока не встретится узел КонецОбъекта.

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

Значения свойств могут быть примитивными типами: строка, число, булево значение или null. Для каждого типа в 1С предусмотрен свой метод получения данных: ПрочитатьКакСтроку, ПрочитатьКакЧисло, ПрочитатьКакБулево. Использование строго типизированных методов чтения предпочтительнее, чем универсальное ТекущееЗначение, так как это сразу приводит данные к нужному типу 1С и ускоряет работу.

  • 🔹 Имя свойства всегда считывается перед значением внутри объекта.
  • 🔹 ТипУзлаJSON.КонецОбъекта сигнализирует о завершении перебора полей текущей структуры.
  • 🔹 Пропуск значений возможен через метод Прочитать(), если тип узла вам не интересен.

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

📊 Какой способ чтения JSON вы используете чаще?
Через ЧтениеJSON
Через Преобразование в Структуру
Через сторонние обработки
Не работаю с JSON

Обработка массивов и вложенных элементов

Массивы в JSON представляют собой упорядоченные списки значений, которые в 1С часто соответствуют объектам типа Массив или СписокЗначений. Когда курсор встречает узел НачалоМассива, начинается цикл чтения элементов этого массива. В отличие от объектов, у элементов массива нет имен, поэтому метод ПрочитатьИмяСвойства здесь не используется. Вы просто читаете значения одно за другим.

Логика обработки массива строится на бесконечном цикле, который прерывается при достижении узла КонецМассива. Внутри цикла вы должны анализировать тип текущего узла. Если элемент массива является простым значением, вы считываете его immédiatement. Если же элемент — это сложный объект, вы должны обработать его внутреннюю структуру, следуя правилам, описанным в предыдущем разделе.

Частой ошибкой является попытка прочитать имя свойства внутри массива. Это приведет к ошибке выполнения, так как концепция имен свойств неприменима к индексным коллекциям JSON. Всегда контролируйте тип текущего узла перед вызовом методов чтения имен. Это особенно критично в гетерогенных массивах, где элементы могут иметь разные типы данных.

Пока Чтение.Прочитать() <> ТипУзлаJSON.КонецМассива Цикл

Тип = Чтение.ТипТекущегоУзла;

Если Тип = ТипУзлаJSON.Значение Тогда

Элемент = Чтение.ПрочитатьКакСтроку();

МассивРезультат.Добавить(Элемент);

ИначеЕсли Тип = ТипУзлаJSON.НачалоОбъекта Тогда

// Рекурсивная обработка вложенного объекта

ОбрабатыватьОбъект(Чтение);

КонецЕсли;

КонецЦикла;

💡

Вложенные структуры требуют аккуратного управления состоянием курсора. Убедитесь, что после обработки вложенного объекта курсор стоит строго на узле КонецОбъекта перед продолжением цикла родителя.

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

Преобразование JSON в структуру 1С

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

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

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

Тип узла JSON Метод чтения в 1С Результирующий тип 1С
Значение (строка) ПрочитатьКакСтроку() Строка
Значение (число) ПрочитатьКакЧисло() Число
Значение (булево) ПрочитатьКакБулево() Булево
Null Прочитать() Неопределено

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

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

Почему Структура может не подойти?

Структура в 1С требует, чтобы имена ключей были строками без специальных символов, нарушающих синтаксис идентификаторов. Если JSON приходит от сторонней системы с ключами типа "user-id" или "order date", попытка создать структуру с такими ключами через конструктор вызовет исключение. Соответствие лишено этого ограничения.

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

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

Кроме синтаксических ошибок, существуют логические ошибки данных. Например, поле, которое должно быть числом, приходит в виде строки "N/A". Если вы вызовете ПрочитатьКакЧисло для такого узла, система выдаст ошибку преобразования типа. Для защиты от этого можно использовать метод ПрочитатьКакЗначение, который вернет значение в виде варианта (Строка, Число и т.д.), а затем проводить безопасную проверку типа перед приведением.

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

  • 🔸 Попытка..Исключение обязательна для блока инициализации чтения.
  • 🔸 Проверка ТипУзлаJSON перед чтением значения предотвращает ошибки приведения типов.
  • 🔸 Журнал регистрации должен содержать текст исключения для отладки проблем интеграции.

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

☑️ Контрольный список надежного чтения JSON

Выполнено: 0 / 5

Производительность и работа с большими объемами

При обработке больших JSON-файлов (размером в десятки или сотни мегабайт) подход «прочитать всё в строку» становится неэффективным. Загрузка огромной строки в память может вызвать переполнение стека или существенное замедление работы клиента-серверного взаимодействия. В таких случаях рекомендуется использовать потоковое чтение непосредственно из файла или сетевого потока без предварительной буферизации в строковую переменную.

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

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

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

Оптимизация кода чтения также включает отказ от лишних проверок внутри циклов. Вынесите константы и часто используемые объекты за пределы циклов чтения. Минимизация вызовов тяжелых методов внутри основного цикла обработки элементов массива может ускорить выполнение кода в разы.

💡

Потоковое чтение из файла или сети является единственным верным решением для обработки файлов размером более 50-100 МБ, позволяя избежать ошибок нехватки памяти.

Можно ли читать JSON без использования объекта ЧтениеJSON?

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

Что делать, если в JSON есть даты в нестандартном формате?

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

Как обработать null значения в JSON?

При встрече узла ТипУзлаJSON.Null метод Прочитать() просто продвинет курсор. В этом случае переменной следует присвоить значение Неопределено. Не пытайтесь вызывать методы типа ПрочитатьКакСтроку для узла Null, это вызовет ошибку.

Поддерживает ли 1С чтение JSONP?

Нет, нативный парсер 1С ожидает чистый JSON. Если вы получаете JSONP (JSON с оберткой в виде вызова функции), необходимо предварительно обрезать строку, удалив имя функции и скобки, оставив только чистую JSON-структуру перед передачей её в ЧтениеJSON.

В чем разница между Структурой и Соответствием при чтении?

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