Как правильно организовать чтение и запись JSON в 1С:Предприятие 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

В этой статье мы разберем основные объекты: ЧтениеJSON и ЗаписьJSON, а также проанализируем методы сериализации сложных структур данных, таких как массивы и структуры.

Основные инструменты платформы

Для работы с форматом JSON в платформе 1С выделено несколько ключевых объектов. Рассмотрим их нативные методы и практическое применение:

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

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

Чтение JSON из строки или файла

Рассмотрим ситуацию, когда мы получили строку JSON (например, ответ от HTTP-сервиса) и нам необходимо преобразовать её в понятные для 1С типы данных — Структуру или Соответствие. Когда выполняется интеграция 1С с веб-сервисами, этот процесс обычно разбивается на несколько шагов — для этого подойдёт готовое решение для организации REST API обмена. На этапе парсинга крайне полезна проверка на заполненность обязательных полей в строке JSON, чтобы исключить ошибки при обращении к отсутствующим свойствам.

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


// Создаем объект чтения
Чтение = Новый ЧтениеJSON;

// Если данные находятся в файле
Чтение.ОткрытьФайл("C:\Exchange\data.json");

// Если данные пришли в виде строки
Чтение.УстановитьСтроку(ВходящаяСтрокаJSON);

После инициализации у нас есть два пути: последовательное чтение (по узлам) или чтение сразу в структуру данных 1С. Второй вариант используется в 90% случаев, так как он гораздо удобнее. Используем метод ПрочитатьJSON. Если вам нужно наглядно представить иерархию полученных данных в интерфейсе, можно реализовать преобразование JSON в дерево значений для более удобного анализа.


// Читаем данные в Структуру или Массив
Попытка
    Данные = ПрочитатьJSON(Чтение, Истина); 
    // Второй параметр "Истина" указывает, что имена свойств JSON нужно приводить 
    // к требованиям именования переменных 1С (если это возможно), 
    // и возвращать результат как Структуру/Массив, а не как Соответствие.
Исключение
    Сообщить("Ошибка при чтении JSON: " + ОписаниеОшибки());
КонецПопытка;

Чтение.Закрыть();

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

Обработка дат при чтении

Стандарт JSON не имеет специального типа для дат. Обычно даты передаются в виде строки (например, в формате ISO 8601). Давайте выясним, как заставить 1С автоматически распознавать даты, используя настройки сериализации дат в ISO 8601.

Для этого в методе ПрочитатьJSON существуют дополнительные параметры. Посмотрим на пример конфигурации имен свойств и формата дат:


НастройкиСериализации = Новый НастройкиСериализацииJSON;
НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
    
Данные = ПрочитатьJSON(Чтение, Истина, , ФорматДатыJSON.ISO);

Указав ФорматДатыJSON.ISO, мы сообщаем платформе, что строки вида "2023-10-05T14:30:00" следует автоматически преобразовывать в тип Дата.

Формирование и запись JSON

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

Создадим простой пример. Допустим, нам нужно отправить информацию о контрагенте. Сформируем структуру данных:


ДанныеДляОтправки = Новый Структура;
ДанныеДляОтправки.Вставить("Name", "ООО Ромашка");
ДанныеДляОтправки.Вставить("INN", "1234567890");
ДанныеДляОтправки.Вставить("Active", Истина);
ДанныеДляОтправки.Вставить("RegistrationDate", ТекущаяДата());

// Добавим вложенный массив контактов
Контакты = Новый Массив;
Контакты.Добавить(Новый Структура("Type, Value", "Phone", "+79990000000"));
Контакты.Добавить(Новый Структура("Type, Value", "Email", "info@romashka.local"));

ДанныеДляОтправки.Вставить("Contacts", Контакты);

Теперь нам нужно сериализовать эту структуру в строку JSON. Для этого используем объект ЗаписьJSON.


Запись = Новый ЗаписьJSON;
    
// Указываем параметры записи. 
// "ЗаписатьВСтроку" означает, что результат мы заберем методом Закрыть().
ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина); 
Запись.УстановитьСтроку(ПараметрыЗаписи);

// Выполняем сериализацию
ЗаписатьJSON(Запись, ДанныеДляОтправки);

// Получаем итоговую строку
РезультатСтрока = Запись.Закрыть();

Проанализируем параметры записи:

  1. ПереносСтрокJSON.Авто — позволяет получить "красивый" (human-readable) JSON с отступами, что удобно для отладки. Для боевых систем, где важен объем трафика, лучше использовать ПереносСтрокJSON.Нет.
  2. Второй параметр " " (пробел) задает символ отступа.
  3. Третий параметр Истина экранирует символы (например, кавычки или слэши), обеспечивая валидность JSON.

Сериализация ссылочных типов и Таблиц Значений

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

  1. Не сериализуйте ссылки напрямую. Лучше приведите их к строке (Код, Наименование) или другому идентификатору, понятному внешней системе (например, артикул для номенклатуры).
  2. Таблица Значений не сериализуется автоматически. Перед записью таблицу значений необходимо преобразовать в Массив структур.

Посмотрим на функцию-хелпер, которая преобразует Таблицу Значений в Массив Структур для последующей записи в JSON:


Функция ПреобразоватьТЗвМассив(ТаблицаЗначений)
    
    Результат = Новый Массив;
    
    Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
        СтруктураСтроки = Новый Структура;
        
        // Перебираем колонки, чтобы сформировать структуру
        Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
            Значение = СтрокаТЗ[Колонка.Имя];
            
            // Здесь можно добавить обработку типов, например, приводить Ссылки к Строкам
            Если ЕтьСсылочныйТип(Значение) Тогда
                Значение = Строка(Значение);
            КонецЕсли;
            
            СтруктураСтроки.Вставить(Колонка.Имя, Значение);
        КонецЦикла;
        
        Результат.Добавить(СтруктураСтроки);
    КонецЦикла;
    
    Возврат Результат;

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

Используя такую функцию, вы легко сможете передать результат запроса в метод ЗаписатьJSON.

Собственная функция сериализации

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

Рассмотрим пример ручного формирования JSON-объекта:


Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();

// Начало корневого объекта "{"
Запись.ЗаписатьНачалоОбъекта(); 

// Свойство "status": "ok"
Запись.ЗаписатьИмяСвойства("status");
Запись.ЗаписатьЗначение("ok");

// Начало массива "data": [
Запись.ЗаписатьИмяСвойства("data");
Запись.ЗаписатьНачалоМассива();

// Элемент массива - объект "{"
Запись.ЗаписатьНачалоОбъекта();
Запись.ЗаписатьИмяСвойства("id");
Запись.ЗаписатьЗначение(100);
Запись.ЗаписатьКонецОбъекта(); // "}"

// Конец массива "]"
Запись.ЗаписатьКонецМассива();

// Конец корневого объекта "}"
Запись.ЗаписатьКонецОбъекта();

JSONСтрока = Запись.Закрыть();

Такой подход более трудоемкий, но он позволяет избежать проблем с типами данных, которые не могут быть автоматически сериализованы, и дает 100% контроль над структурой выходного файла.

Заключение

Мы рассмотрели основные методы работы с JSON в 1С. Подводя итог, выделим ключевые моменты:

Эти методы покрывают подавляющее большинство задач интеграции 1С с веб-сервисами, интернет-магазинами и мобильными приложениями.

← На главную