Работа с форматом JSON (JavaScript Object Notation) стала стандартом де-факто для обмена данными между современными информационными системами. В 1С:Предприятие, начиная с версии платформы 8.3.6, появились нативные механизмы для удобной работы с этим форматом, и сегодня использование JSON в 1С 8.3 является базовым навыком для любого разработчика. С его помощью решаются самые разные задачи, включая такие, как выгрузка метаданных конфигурации в JSON для внешнего анализа (есть обработка автоматической выгрузки данных запросов в JSON) или документирования. Рассмотрим подробно, как программно читать входящие JSON-данные и формировать ответы, используя встроенные объекты платформы.
В этой статье мы разберем основные объекты: ЧтениеJSON и ЗаписьJSON, а также проанализируем методы сериализации сложных структур данных, таких как массивы и структуры.
Для работы с форматом JSON в платформе 1С выделено несколько ключевых объектов. Рассмотрим их нативные методы и практическое применение:
ЧтениеXML.ПрочитатьJSON и ЗаписатьJSON, которые позволяют значительно упростить код, работая с объектами 1С (Структурами, Массивами, Соответствиями) напрямую.Для удобства отладки и визуального контроля данных в процессе разработки часто применяют просмотр 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" следует автоматически преобразовывать в тип Дата.
Теперь разберем обратную задачу: у нас есть данные в 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(Запись, ДанныеДляОтправки);
// Получаем итоговую строку
РезультатСтрока = Запись.Закрыть();
Проанализируем параметры записи:
ПереносСтрокJSON.Авто — позволяет получить "красивый" (human-readable) JSON с отступами, что удобно для отладки. Для боевых систем, где важен объем трафика, лучше использовать ПереносСтрокJSON.Нет." " (пробел) задает символ отступа.Истина экранирует символы (например, кавычки или слэши), обеспечивая валидность JSON.Часто возникает вопрос: как записать в JSON ссылку на справочник или документ? Если мы попытаемся просто передавать ссылки напрямую, внешняя система может их не понять. Поэтому правильной практикой является предварительная подготовка данных.
Массив структур.Посмотрим на функцию-хелпер, которая преобразует Таблицу Значений в Массив Структур для последующей записи в JSON:
Функция ПреобразоватьТЗвМассив(ТаблицаЗначений)
Результат = Новый Массив;
Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
СтруктураСтроки = Новый Структура;
// Перебираем колонки, чтобы сформировать структуру
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
Значение = СтрокаТЗ[Колонка.Имя];
// Здесь можно добавить обработку типов, например, приводить Ссылки к Строкам
Если ЕтьСсылочныйТип(Значение) Тогда
Значение = Строка(Значение);
КонецЕсли;
СтруктураСтроки.Вставить(Колонка.Имя, Значение);
КонецЦикла;
Результат.Добавить(СтруктураСтроки);
КонецЦикла;
Возврат Результат;
КонецФункции
Используя такую функцию, вы легко сможете передать результат запроса в метод ЗаписатьJSON.
Иногда требуется полный контроль над процессом формирования JSON, когда структура файла должна строго соответствовать спецификации стороннего API и не совпадает со структурой данных 1С. В этом случае мы не используем ЗаписатьJSON для всей структуры сразу, а формируем документ поузлово. Для проектирования таких строгих структур и работы с современными технологиями может пригодиться специализированный редактор схем JSON для искусственного интеллекта.
Рассмотрим пример ручного формирования JSON-объекта:
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
// Начало корневого объекта "{"
Запись.ЗаписатьНачалоОбъекта();
// Свойство "status": "ok"
Запись.ЗаписатьИмяСвойства("status");
Запись.ЗаписатьЗначение("ok");
// Начало массива "data": [
Запись.ЗаписатьИмяСвойства("data");
Запись.ЗаписатьНачалоМассива();
// Элемент массива - объект "{"
Запись.ЗаписатьНачалоОбъекта();
Запись.ЗаписатьИмяСвойства("id");
Запись.ЗаписатьЗначение(100);
Запись.ЗаписатьКонецОбъекта(); // "}"
// Конец массива "]"
Запись.ЗаписатьКонецМассива();
// Конец корневого объекта "}"
Запись.ЗаписатьКонецОбъекта();
JSONСтрока = Запись.Закрыть();
Такой подход более трудоемкий, но он позволяет избежать проблем с типами данных, которые не могут быть автоматически сериализованы, и дает 100% контроль над структурой выходного файла.
Мы рассмотрели основные методы работы с JSON в 1С. Подводя итог, выделим ключевые моменты:
ЧтениеJSON и ЗаписьJSON как базовые объекты потока.ПрочитатьJSON для быстрого получения Структур и Массивов из строки.ЗаписатьНачалоОбъекта, ЗаписатьИмяСвойства и т.д.Эти методы покрывают подавляющее большинство задач интеграции 1С с веб-сервисами, интернет-магазинами и мобильными приложениями.