В современной разработке на платформе 1С задачи интеграции с веб-сервисами, сайтами и внешними API встречаются практически ежедневно. Стандартом де-факто для обмена данными стал формат JSON. Часто у разработчиков возникают вопросы: как превратить строку JSON в понятную для 1С структуру? Как правильно обработать даты? Как работать с вложенными массивами? Спектр задач может быть широк: от простого обмена до полной выгрузки метаданных конфигурации в JSON для анализа структуры системы.
В этой статье мы подробно разберем, как работать с форматом JSON в 1С, используя встроенные механизмы платформы. Мы проанализируем лучшие практики, рассмотрим примеры кода и углубимся в детали объектов, предназначенных для сериализации и десериализации данных.
Для работы с этим форматом в платформе 1С версии 8.3 существуют специализированные объекты. Рассмотрим их подробнее:
ПрочитатьJSON и ЗаписатьJSON, которые позволяют быстро преобразовывать данные из примитивных типов 1С (Структура, Массив, Строка, Число, Булево) в JSON и обратно.Давайте перейдем к решению конкретных задач, с которыми сталкиваются программисты.
Представим ситуацию: мы получили ответ от HTTP-сервиса в виде строки. Нам нужно превратить эту строку в Структуру или Массив, чтобы работать с данными привычным образом. На этапе отладки, чтобы быстро проверить корректность данных, полезно использовать вспомогательный инструмент для просмотра JSON с форматированием и раскраской.
Рассмотрим базовый алгоритм действий:
Посмотрим на пример кода, который решает эту задачу:
// Входная строка с данными JSON
СтрокаJSON = "{""name"": ""Иван"", ""age"": 30, ""city"": ""Москва""}";
// Инициализируем объект чтения
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаJSON);
// Преобразуем JSON в структуру 1С
Данные = ПрочитатьJSON(Чтение);
// Теперь мы можем обращаться к полям как к свойствам структуры
Сообщить("Имя клиента: " + Данные.name);
Сообщить("Возвраст: " + Данные.age);
Чтение.Закрыть();
Обратите внимание, что метод УстановитьСтроку подготавливает "поток" для чтения. Функция ПрочитатьJSON выполняет всю "магию", автоматически сопоставляя объекты JSON с типами 1С: объекты превращаются в Структуру, массивы — в Массив.
В реальных задачах данные редко бывают плоскими. Обычно мы получаем сложную иерархию, где массивы содержат структуры, которые, в свою очередь, содержат другие массивы. Для визуального анализа таких данных удобно использовать средства преобразования JSON в дерево значений.
Посмотрим на пример более сложного JSON:
{
"order_id": 12345,
"items": [
{
"product": "Товар 1",
"quantity": 2,
"price": 100
},
{
"product": "Товар 2",
"quantity": 1,
"price": 500
}
]
}
При чтении такого объекта мы получим следующую структуру данных в 1С:
items — Массив.Давайте напишем код для обхода такой структуры. Это критически важно для загрузки табличных частей документов:
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ВходящаяСтрокаJSON);
Результат = ПрочитатьJSON(Чтение);
// Обращаемся к верхнему уровню
НомерЗаказа = Результат.order_id;
// Обходим массив товаров
Для Каждого СтрокаТовара Из Результат.items Цикл
Товар = СтрокаТовара.product;
Количество = СтрокаТовара.quantity;
Цена = СтрокаТовара.price;
// Здесь можно выполнять создание строк документа
// Например: НоваяСтрока = Объект.Товары.Добавить();
КонецЦикла;
Чтение.Закрыть();
Одной из частых проблем при интеграции является формат даты. В стандарте JSON нет специального типа данных для даты, поэтому они передаются строкой. Форматы могут быть разными, например, ISO 8601 ("2023-10-05T14:30:00Z") или формат Microsoft ("/Date(1234567890)/").
Проанализируем способы решения этой проблемы.
Способ 1. Автоматическое определение
Функция ПрочитатьJSON имеет параметры, позволяющие указать ожидаемый формат даты. Если вы знаете, что внешний сервис отдает даты в формате ISO, можно настроить чтение соответствующим образом.
Настройки = Новый НастройкиСериализацииJSON;
Настройки.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ISO;
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(СтрокаСДатой);
// Передаем настройки четвертым параметром (обратите внимание на порядок параметров)
Данные = ПрочитатьJSON(Чтение, Ложь, , Настройки);
Способ 2. Ручное преобразование (Функция восстановления)
Если формат даты нестандартный, мы можем использовать "функцию восстановления". Это мощный механизм, который позволяет перехватить процесс чтения каждого свойства и обработать его вручную.
Давайте создадим функцию, которая будет искать поля с названием "date" и преобразовывать строку в дату 1С:
Функция ПреобразоватьСвойства(Свойство, Значение, ДополнительныеПараметры) Экспорт
// Если имя поля содержит "date", пробуем преобразовать строку
Если НРег(Свойство) = "date" И ТипЗнч(Значение) = Тип("Строка") Тогда
// Здесь используем функцию преобразования XML, так как формат ISO похож
Попытка
Возврат XMLЗначение(Тип("Дата"), Значение);
Исключение
// Если не вышло, возвращаем как есть
Возврат Значение;
КонецПопытки;
КонецЕсли;
Возврат Значение;
КонецФункции
Теперь применим эту функцию при чтении:
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ВходящийJSON);
// Указываем имя функции восстановления третьим параметром
Данные = ПрочитатьJSON(Чтение, Истина, "ПреобразоватьСвойства", , ЭтотОбъект);
Иногда данные приходят не через HTTP-сервис, а в виде файла на диске. В этом случае метод УстановитьСтроку нам не подходит. Используем метод ОткрытьФайл.
Разберем нюансы кодировки. По умолчанию 1С пытается определить кодировку, но для надежности (особенно если файл в UTF-8 без BOM) лучше указывать её явно.
Чтение = Новый ЧтениеJSON;
// Открываем файл с явным указанием кодировки UTF-8
Чтение.ОткрытьФайл("C:\Exchange\data.json", "UTF-8");
Пока Чтение.Прочитать() Цикл
// Этот цикл используется для потокового чтения больших файлов,
// если мы не хотим загружать весь файл в память функцией ПрочитатьJSON.
// Но для простых задач проще использовать ПрочитатьJSON(Чтение)
КонецЦикла;
// Или читаем целиком
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Теперь рассмотрим обратную задачу: нам нужно отправить данные из 1С во внешнюю систему. Создание JSON-строки вручную (склеиванием строк) — плохая практика, приводящая к ошибкам с экранированием кавычек и спецсимволов. Используйте объект ЗаписьJSON или специализированный генератор объектов для JSON, который позволяет строить структуры в удобном Fluent-стиле — для этого подойдёт консоль отладки и генератор JSON-структур для разработчика.
Пример записи простой структуры:
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(); // Будем писать в память (в строку)
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("Client", "ООО Ромашка");
СтруктураДанных.Вставить("Active", Истина);
СтруктураДанных.Вставить("Balance", 1500.50);
// Автоматическая сериализация
ЗаписатьJSON(Запись, СтруктураДанных);
РезультатСтрока = Запись.Закрыть(); // Получаем готовую JSON строку
Если вы разрабатываете сложные интеграции, например для работы с искусственным интеллектом, вам может потребоваться специализированный редактор схем JSON, чтобы гарантировать строгое соответствие структуры требованиям принимающей стороны.
При получении данных через объект HTTPСоединение, ответ сервера часто приходит в виде двоичных данных или текста с определенной кодировкой. Перед тем как скармливать данные объекту ЧтениеJSON, убедитесь, что вы правильно извлекли тело ответа.
Рассмотрим правильную последовательность действий:
Ответ = Соединение.Получить(Запрос);Если Ответ.КодСостояния = 200 Тогда...Тело = Ответ.ПолучитьТелоКакСтроку("UTF-8");Тело в ЧтениеJSON.УстановитьСтроку(Тело).Важный момент: Если сервер возвращает JSON с ошибкой (например, при 400 Bad Request), часто полезно всё равно распарсить тело ответа, чтобы получить текст ошибки из поля error или message внутри JSON.
В процессе разработки мы можем столкнуться со следующими проблемами:
null: В JSON значение может быть null. В 1С при чтении это значение преобразуется в Неопределено. Учитывайте это в условиях: Если Значение <> Неопределено Тогда...123, а в другой — строкой "123". 1С это прочитает честно (как Число и как Строку). При обработке данных приводите типы явно: Строка(Данные.id).Использование встроенных механизмов платформы 1С для работы с JSON позволяет сделать код надежным, читаемым и быстрым. Избегайте ручного разбора строк и всегда проверяйте структуру полученных данных перед обращением к свойствам — есть готовая обработка выгрузки метаданных конфигурации в JSON.