Читайте дальше...
Создание JSON из структуры и соответствия
// Преобразование структуры и соответствия в JSON-строку
Процедура СоздатьJSONИзСтруктуры()
// Из структуры
Данные = Новый Структура;
Данные.Вставить("имя", "Иван");
Данные.Вставить("возраст", 30);
Данные.Вставить("активен", Истина);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
Результат = ЗаписьJSON.Закрыть();
Сообщить("JSON из структуры:");
Сообщить(Результат);
// Из соответствия
Соответствие = Новый Соответствие;
Соответствие.Вставить("город", "Москва");
Соответствие.Вставить("улица", "Тверская");
Соответствие.Вставить("дом", 10);
ЗаписьJSON2 = Новый ЗаписьJSON;
ЗаписьJSON2.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON2, Соответствие);
Результат2 = ЗаписьJSON2.Закрыть();
Сообщить("JSON из соответствия:");
Сообщить(Результат2);
КонецПроцедуры
Создание JSON из массива и списка значений
// Преобразование массива и списка значений в JSON-массив
Процедура СоздатьJSONИзМассива()
// Из массива
Массив = Новый Массив;
Массив.Добавить("Первый");
Массив.Добавить("Второй");
Массив.Добавить(123);
Массив.Добавить(Истина);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Массив);
Результат = ЗаписьJSON.Закрыть();
Сообщить("JSON из массива:");
Сообщить(Результат);
// Из массива структур
Товары = Новый Массив;
Товар1 = Новый Структура;
Товар1.Вставить("наименование", "Ноутбук");
Товар1.Вставить("цена", 50000);
Товары.Добавить(Товар1);
Товар2 = Новый Структура;
Товар2.Вставить("наименование", "Монитор");
Товар2.Вставить("цена", 15000);
Товары.Добавить(Товар2);
ЗаписьJSON2 = Новый ЗаписьJSON;
ЗаписьJSON2.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON2, Товары);
Результат2 = ЗаписьJSON2.Закрыть();
Сообщить("JSON из массива структур:");
Сообщить(Результат2);
КонецПроцедуры
Чтение JSON в структуру и соответствие
// Парсинг JSON-строки в структуру и соответствие
Процедура ПрочитатьJSONВСтруктуру()
JSONСтрока = "
{
""наименование"": ""Ноутбук"",
""цена"": 50000,
""характеристики"": {
""процессор"": ""Intel i7"",
""память"": 16
},
""наличие"": true
}";
// Чтение в структуру
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(JSONСтрока);
Данные = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
Сообщить("Прочитанные данные (структура):");
Сообщить("Наименование: " + Данные.наименование);
Сообщить("Цена: " + Данные.цена);
Сообщить("Процессор: " + Данные.характеристики.процессор);
Сообщить("Наличие: " + Данные.наличие);
// Чтение в соответствие (сохраняется порядок)
ЧтениеJSON2 = Новый ЧтениеJSON;
ЧтениеJSON2.УстановитьСтроку(JSONСтрока);
ДанныеСоответствие = ПрочитатьJSON(ЧтениеJSON2, Ложь);
ЧтениеJSON2.Закрыть();
Сообщить("Прочитанные данные (соответствие):");
Для Каждого КлючЗначение Из ДанныеСоответствие Цикл
Сообщить(КлючЗначение.Ключ + ": " + КлючЗначение.Значение);
КонецЦикла;
КонецПроцедуры
Чтение JSON-массива
// Парсинг JSON-массива в массив 1С
Процедура ПрочитатьJSONМассив()
JSONСтрока = "
[
{
""товар"": ""Ноутбук"",
""количество"": 5
},
{
""товар"": ""Монитор"",
""количество"": 3
},
{
""товар"": ""Клавиатура"",
""количество"": 10
}
]";
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(JSONСтрока);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Сообщить("Прочитано элементов: " + Данные.Количество());
Для Инд = 0 По Данные.Количество() - 1 Цикл
Элемент = Данные[Инд];
Сообщить(Строка(Инд+1) + ". " + Элемент.товар + " - " + Элемент.количество + " шт.");
КонецЦикла;
КонецПроцедуры
Сохранение и загрузка JSON в файл
// Запись JSON в файл и чтение JSON из файла
Процедура СохранитьИЗагрузитьJSONФайл()
ИмяФайла = "C:\Temp\data.json";
// Подготавливаем данные
Данные = Новый Структура;
Данные.Вставить("дата", Формат(ТекущаяДата(), "ДФ=yyyy-MM-dd HH:MM:SS"));
Данные.Вставить("пользователь", Пользователи.ТекущийПользователь().Имя);
Товары = Новый Массив;
Для Инд = 1 По 3 Цикл
Товар = Новый Структура;
Товар.Вставить("код", Инд);
Товар.Вставить("наименование", "Товар " + Инд);
Товар.Вставить("цена", Инд * 1000);
Товары.Добавить(Товар);
КонецЦикла;
Данные.Вставить("товары", Товары);
// Запись в файл
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
JSONСтрока = ЗаписьJSON.Закрыть();
Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
Запись.Записать(JSONСтрока);
Запись.Закрыть();
Сообщить("JSON сохранен в файл: " + ИмяФайла);
// Чтение из файла
Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8);
ПрочитаннаяСтрока = Чтение.Прочитать();
Чтение.Закрыть();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ПрочитаннаяСтрока);
ВосстановленныеДанные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Сообщить("Прочитано из файла:");
Сообщить("Дата: " + ВосстановленныеДанные.дата);
Сообщить("Пользователь: " + ВосстановленныеДанные.пользователь);
Сообщить("Количество товаров: " + ВосстановленныеДанные.товары.Количество());
// Удаляем файл
УдалитьФайлы(ИмяФайла);
КонецПроцедуры
Преобразование таблицы значений в JSON
// Экспорт таблицы значений в JSON-формат
Процедура ТаблицаЗначенийВJSON()
// Создаем таблицу
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Код", Новый ОписаниеТипов("Число"));
Таблица.Колонки.Добавить("Наименование");
Таблица.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
Таблица.Добавить().Код = 1; Таблица[0].Наименование = "Ноутбук"; Таблица[0].Цена = 50000;
Таблица.Добавить().Код = 2; Таблица[1].Наименование = "Монитор"; Таблица[1].Цена = 15000;
Таблица.Добавить().Код = 3; Таблица[2].Наименование = "Клавиатура"; Таблица[2].Цена = 2000;
// Преобразуем таблицу в массив структур
МассивДанных = Новый Массив;
Для Каждого СтрокаТ Из Таблица Цикл
СтрокаДанных = Новый Структура;
Для Каждого Колонка Из Таблица.Колонки Цикл
СтрокаДанных.Вставить(Колонка.Имя, СтрокаТ[Колонка.Имя]);
КонецЦикла;
МассивДанных.Добавить(СтрокаДанных);
КонецЦикла;
// Записываем в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, МассивДанных);
Результат = ЗаписьJSON.Закрыть();
Сообщить("Таблица значений в формате JSON:");
Сообщить(Результат);
// Обратно: из JSON в таблицу значений
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Результат);
ПрочитанныйМассив = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
НоваяТаблица = Новый ТаблицаЗначений;
Если ПрочитанныйМассив.Количество() > 0 Тогда
// Добавляем колонки
Для Каждого Ключ Из ПрочитанныйМассив[0].Ключи() Цикл
НоваяТаблица.Колонки.Добавить(Ключ);
КонецЦикла;
// Добавляем строки
Для Каждого Элемент Из ПрочитанныйМассив Цикл
СтрокаНовой = НоваяТаблица.Добавить();
Для Каждого Ключ Из Элемент.Ключи() Цикл
СтрокаНовой[Ключ] = Элемент[Ключ];
КонецЦикла;
КонецЦикла;
КонецЕсли;
Сообщить("Восстановленная таблица:");
Для Каждого СтрокаТ Из НоваяТаблица Цикл
Сообщить(СтрокаТ.Код + " | " + СтрокаТ.Наименование + " | " + СтрокаТ.Цена);
КонецЦикла;
КонецПроцедуры
Работа с вложенными JSON-структурами
// Обработка сложных вложенных JSON-данных
Процедура ВложенныеJSONСтруктуры()
// Создаем сложную структуру
Данные = Новый Структура;
Данные.Вставить("компания", "ООО Ромашка");
Контакты = Новый Структура;
Контакты.Вставить("телефон", "8-800-123-45-67");
Контакты.Вставить("email", "info@romashka.ru");
Контакты.Вставить("адрес", Новый Структура("город, улица, дом", "Москва", "Тверская", 10));
Данные.Вставить("контакты", Контакты);
Сотрудники = Новый Массив;
Для Инд = 1 По 3 Цикл
Сотрудник = Новый Структура;
Сотрудник.Вставить("табельный", Инд);
Сотрудник.Вставить("фио", "Сотрудник " + Инд);
Сотрудник.Вставить("отдел", "Отдел " + Строка(Инд % 2 + 1));
Навыки = Новый Массив;
Навыки.Добавить("Навык " + Строка(Инд * 1));
Навыки.Добавить("Навык " + Строка(Инд * 2));
Сотрудник.Вставить("навыки", Навыки);
Сотрудники.Добавить(Сотрудник);
КонецЦикла;
Данные.Вставить("сотрудники", Сотрудники);
// Сериализуем в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
JSONСтрока = ЗаписьJSON.Закрыть();
Сообщить("Сложный JSON:");
Сообщить(JSONСтрока);
// Десериализуем обратно
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(JSONСтрока);
Восстановленные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Сообщить("Восстановленные данные:");
Сообщить("Компания: " + Восстановленные.компания);
Сообщить("Телефон: " + Восстановленные.контакты.телефон);
Сообщить("Адрес: " + Восстановленные.контакты.адрес.город +
", " + Восстановленные.контакты.адрес.улица +
", " + Восстановленные.контакты.адрес.дом);
Сообщить("Сотрудники:");
Для Каждого Сотр Из Восстановленные.сотрудники Цикл
Сообщить(" " + Сотр.фио + " (" + Сотр.отдел + ")");
Сообщить(" Навыки: " + СтрСоединить(Сотр.навыки, ", "));
КонецЦикла;
КонецПроцедуры
Форматированный вывод JSON (pretty print)
// Генерация читаемого JSON с отступами
Процедура ФорматированныйJSON()
Данные = Новый Структура;
Данные.Вставить("успех", Истина);
Данные.Вставить("сообщение", "Данные загружены");
Данные.Вставить("результаты", Новый Массив);
Для Инд = 1 По 2 Цикл
Результат = Новый Структура;
Результат.Вставить("ид", Инд);
Результат.Вставить("название", "Элемент " + Инд);
Данные.результаты.Добавить(Результат);
КонецЦикла;
// Форматированный вывод с отступами
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписьJSON.ЗаписатьНачалоОбъекта();
// Параметр Ложь означает не использовать форматирование по умолчанию
// Мы управляем форматированием вручную
ЗаписьJSON.ЗаписатьИмяСвойства("успех");
ЗаписьJSON.ЗаписатьЗначение(Данные.успех);
ЗаписьJSON.ЗаписатьИмяСвойства("сообщение");
ЗаписьJSON.ЗаписатьЗначение(Данные.сообщение);
ЗаписьJSON.ЗаписатьИмяСвойства("результаты");
ЗаписьJSON.ЗаписатьНачалоМассива();
Для Каждого Рез Из Данные.результаты Цикл
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьИмяСвойства("ид");
ЗаписьJSON.ЗаписатьЗначение(Рез.ид);
ЗаписьJSON.ЗаписатьИмяСвойства("название");
ЗаписьJSON.ЗаписатьЗначение(Рез.название);
ЗаписьJSON.ЗаписатьКонецОбъекта();
КонецЦикла;
ЗаписьJSON.ЗаписатьКонецМассива();
ЗаписьJSON.ЗаписатьКонецОбъекта();
Результат = ЗаписьJSON.Закрыть();
Сообщить("Форматированный JSON:");
Сообщить(Результат);
// Альтернативный способ через ПараметрыЗаписиJSON
Параметры = Новый ПараметрыЗаписиJSON;
Параметры.Отступ = 4; // 4 пробела
ЗаписьJSON2 = Новый ЗаписьJSON;
ЗаписьJSON2.УстановитьСтроку(Параметры);
ЗаписатьJSON(ЗаписьJSON2, Данные);
Результат2 = ЗаписьJSON2.Закрыть();
Сообщить("Форматированный JSON (через ПараметрыЗаписиJSON):");
Сообщить(Результат2);
КонецПроцедуры
Обработка ошибок при парсинге JSON
// Безопасный парсинг JSON с обработкой ошибок
Процедура БезопасныйПарсингJSON()
// Корректный JSON
КорректныйJSON = "{\"имя\": \"Иван\", \"возраст\": 30}";
// Некорректные JSON (для теста)
НекорректныйJSON1 = "{\"имя\": \"Иван\", \"возраст\": 30"; // отсутствует закрывающая скобка
НекорректныйJSON2 = "{\"имя\": \"Иван\", возраст: 30}"; // значение без кавычек
Функция БезопасноПрочитатьJSON(JSONСтрока)
ЧтениеJSON = Новый ЧтениеJSON;
СтруктураОшибки = Новый Структура;
СтруктураОшибки.Вставить("успех", Ложь);
СтруктураОшибки.Вставить("данные", Неопределено);
СтруктураОшибки.Вставить("ошибка", "");
Попытка
ЧтениеJSON.УстановитьСтроку(JSONСтрока);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
СтруктураОшибки.успех = Истина;
СтруктураОшибки.данные = Данные;
Возврат СтруктураОшибки;
Исключение
СтруктураОшибки.ошибка = ОписаниеОшибки();
Возврат СтруктураОшибки;
КонецПопытки;
КонецФункции
// Тестируем корректный JSON
Результат = БезопасноПрочитатьJSON(КорректныйJSON);
Если Результат.успех Тогда
Сообщить("Корректный JSON прочитан успешно:");
Сообщить("Имя: " + Результат.данные.имя);
Сообщить("Возраст: " + Результат.данные.возраст);
Иначе
Сообщить("Ошибка: " + Результат.ошибка);
КонецЕсли;
// Тестируем некорректный JSON
Результат2 = БезопасноПрочитатьJSON(НекорректныйJSON1);
Если Результат2.успех Тогда
Сообщить("JSON прочитан успешно");
Иначе
Сообщить("Некорректный JSON:");
Сообщить("Ошибка: " + Результат2.ошибка);
КонецЕсли;
// Валидация JSON перед парсингом (упрощенная)
Функция ВалидныйJSON(JSONСтрока)
Попытка
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(JSONСтрока);
ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Возврат Истина;
Исключение
Возврат Ложь;
КонецПопытки;
КонецФункции
Сообщить("Проверка валидности корректного JSON: " + ВалидныйJSON(КорректныйJSON));
Сообщить("Проверка валидности некорректного JSON: " + ВалидныйJSON(НекорректныйJSON1));
КонецПроцедуры
Обмен данными с внешним API через JSON
// Формирование и разбор JSON для HTTP-запросов к API
Процедура JSONДляAPIOбмена()
// Формирование тела запроса
ЗапросКAPI = Новый Структура;
ЗапросКAPI.Вставить("метод", "getProducts");
ЗапросКAPI.Вставить("параметры", Новый Структура("категория, лимит", "электроника", 10));
ЗапросКAPI.Вставить("версия", "1.0");
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ЗапросКAPI);
ТелоJSON = ЗаписьJSON.Закрыть();
Сообщить("Тело запроса к API:");
Сообщить(ТелоJSON);
// Эмуляция ответа от API
ОтветJSON = "
{
""статус"": ""успех"",
""данные"": {
""товары"": [
{""ид"": 1, ""название"": ""Ноутбук"", ""цена"": 50000},
{""ид"": 2, ""название"": ""Монитор"", ""цена"": 15000}
],
""всего"": 2
}
}";
// Разбор ответа
Функция РазобратьОтветAPI(JSONОтвет)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(JSONОтвет);
Ответ = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Результат = Новый Структура;
Результат.Вставить("успех", Ответ.статус = "успех");
Если Результат.успех Тогда
Товары = Новый Массив;
Для Каждого Товар Из Ответ.данные.товары Цикл
ТоварСтруктура = Новый Структура;
ТоварСтруктура.Вставить("ид", Товар.ид);
ТоварСтруктура.Вставить("наименование", Товар.название);
ТоварСтруктура.Вставить("цена", Товар.цена);
Товары.Добавить(ТоварСтруктура);
КонецЦикла;
Результат.Вставить("товары", Товары);
Результат.Вставить("всего", Ответ.данные.всего);
КонецЕсли;
Возврат Результат;
КонецФункции
РезультатAPI = РазобратьОтветAPI(ОтветJSON);
Сообщить("Результат обработки ответа API:");
Если РезультатAPI.успех Тогда
Сообщить("Получено товаров: " + РезультатAPI.всего);
Для Каждого Товар Из РезультатAPI.товары Цикл
Сообщить(Строка(Товар.ид) + ". " + Товар.наименование + " - " + Товар.цена);
КонецЦикла;
Иначе
Сообщить("Ошибка при получении данных");
КонецЕсли;
КонецПроцедуры
Примечания
// Важные особенности работы с форматом JSON в 1С:
// 1. Для работы с JSON используются объекты ЗаписьJSON, ЧтениеJSON и функции ЗаписатьJSON, ПрочитатьJSON
// 2. ЗаписатьJSON может принимать структуру, соответствие, массив, список значений и другие коллекции
// 3. ПрочитатьJSON с параметром Истина возвращает структуру, с Ложь - соответствие (сохраняет порядок ключей)
// 4. При чтении JSON автоматически преобразует null в Неопределено, true/false в Истина/Ложь
// 5. Для форматированного вывода используйте ПараметрыЗаписиJSON с отступом
// 6. Кодировка JSON по умолчанию - UTF-8, при сохранении в файл указывайте кодировку явно
// 7. При парсинге большого JSON используйте построчное чтение через ЧтениеJSON
// 8. JSON-массивы превращаются в обычные массивы 1С
// 9. JSON-объекты (словари) превращаются в структуру или соответствие
// 10. Для обмена с внешними API всегда проверяйте статус ответа и обрабатывайте ошибки
// 11. При сериализации таблицы значений предварительно преобразуйте её в массив структур
// 12. Избегайте циклических ссылок в данных - они вызовут ошибку при сериализации








