Идея дня
- Сериализуем структуры/массивы в JSON единым способом —
A1sJ.ToJSON(..). - Разбираем JSON-строки обратно —
A1sJ.FromJSON(..)— получаем Структура/Массив. - Готовим данные заранее: строки/числа/даты приводим через
A1sS/A1sO, ключи переименовываем под контракт.
Базовая сериализация (объект → JSON)
// Собираем структуру для отправки
Функция ДокВJSON(Док) Экспорт
Поля = СтрРазделить("Ссылка,Дата,Номер,Контрагент,Комментарий", ",");
Шапка = A1sO.ToStruct(Док, Поля); // День 15
// Нормализация значений перед JSON
ШапкаНорм = Новый Структура;
ШапкаНорм.Вставить("id", A1sS.AsString(Шапка.Ссылка));
ШапкаНорм.Вставить("date", A1sO.DateOrEmpty(Шапка.Дата));
ШапкаНорм.Вставить("number", A1sS.AsString(Шапка.Номер));
ШапкаНорм.Вставить("partner", A1sS.AsString(Док.Контрагент.Наименование));
ШапкаНорм.Вставить("comment", A1sS.AsString(Шапка.Комментарий));
// Итоги
Сумма = A1sO.RoundNum(A1sO.NumOrZero(Док.СуммаДокумента), 2); // День 13
ШапкаНорм.Вставить("total", Сумма);
Возврат A1sJ.ToJSON(ШапкаНорм); // → строка JSON
КонецФункции
Базовый разбор (JSON → структура/массив)
Функция ПрочитатьПрофиль(СтрокаJSON) Экспорт
Данные = A1sJ.FromJSON(СтрокаJSON); // Структура
// Валидация ключей
Если A1sO.Empty(Данные) Тогда Возврат Неопределено; КонецЕсли;
Проф = Новый Структура;
Проф.Вставить("Имя", A1sS.AsString(Данные.Получить("name")));
Проф.Вставить("Email", A1sS.AsString(Данные.Получить("email")));
Проф.Вставить("Телефон", A1sS.AsString(Данные.Получить("phone")));
Проф.Вставить("Подписан", ?(A1sO.Empty(Данные.Получить("subscribed")), Ложь, Данные.Получить("subscribed")));
Проф.Вставить("ДатаСозд", A1sO.DateOrEmpty(Данные.Получить("createdAt")));
Возврат Проф;
КонецФункции
Массив объектов JSON
Функция ПрочитатьТовары(СтрокаJSON) Экспорт
М = A1sJ.FromJSON(СтрокаJSON); // ожидаем массив объектов
Если A1sO.Empty(М) Тогда Возврат Новый ТаблицаЗначений; КонецЕсли;
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Код");
ТЗ.Колонки.Добавить("Наименование");
ТЗ.Колонки.Добавить("Кол", Новый ОписаниеТипов("Число"));
ТЗ.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
Для каждого Э Из М Цикл
Стр = ТЗ.Добавить();
Стр.Код = A1sS.AsString(Э.Получить("sku"));
Стр.Наименование = A1sS.AsString(Э.Получить("name"));
Стр.Кол = A1sO.RoundNum(A1sO.NumOrZero(Э.Получить("qty")), 3);
Стр.Цена = A1sO.RoundNum(A1sO.NumOrZero(Э.Получить("price")), 2);
КонецЦикла;
Возврат ТЗ;
КонецФункции
Конвейер подготовки: ToStruct → Remap → Compact → ToJSON
// Берём «шапку» документа и готовим к API
Функция ДокКЭкспорту(Док) Экспорт
Поля = СтрРазделить("Ссылка,Дата,Номер,Контрагент,Комментарий", ",");
Шапка = A1sO.ToStruct(Док, Поля);
// Расширим полем partnerName
Шапка.Вставить("partnerName", A1sS.AsString(Док.Контрагент.Наименование));
// Уплотнить и переименовать ключи
Чисто = StructCompact(Шапка); // из Дня 17
Карта = Новый Соответствие;
Карта.Вставить("Ссылка", "id");
Карта.Вставить("Дата", "date");
Карта.Вставить("Номер", "number");
Карта.Вставить("Комментарий", "comment");
Карта.Вставить("partnerName", "partner");
Готово = StructRemapKeys(Чисто, Карта); // День 17
// Типы — к безопасным значениям
Готово.Вставить("date", A1sO.DateOrEmpty(Готово.Получить("date")));
Готово.Вставить("comment", A1sS.AsString(Готово.Получить("comment")));
Возврат A1sJ.ToJSON(Готово);
КонецФункции
С A1sQ: выгрузка и сериализация списка
Функция JSONСписокНоменклатуры(Лимит = 10) Экспорт
Таб = A1sQ.Unload("
|ВЫБРАТЬ ПЕРВЫЕ &Лимит
| Ном.Ссылка КАК ID,
| Ном.Код КАК Code,
| Ном.Наименование КАК Name
|ИЗ Справочник.Номенклатура КАК Ном
|УПОРЯДОЧИТЬ ПО Name
", Лимит);
// Преобразуем ТЗ в массив структур
Массив = Новый Массив;
Для каждого Стр Из Таб Цикл
Э = Новый Структура;
Э.Вставить("id", A1sS.AsString(Стр.ID));
Э.Вставить("code", A1sS.AsString(Стр.Code));
Э.Вставить("name", A1sS.AsString(Стр.Name));
Массив.Добавить(Э);
КонецЦикла;
Возврат A1sJ.ToJSON(Массив);
КонецФункции
Напоминаю: A1sQ.Unload(Текст, Параметр1..Параметр8) —
позиционные параметры без структур (см. День 3).
Чтение webhook-а и безопасное применение
Процедура ОбработатьWebhook(ТелоJSON) Экспорт
Д = A1sJ.FromJSON(ТелоJSON); // ожидаем структуру
Если A1sO.Empty(Д) Тогда
A1sLog.Warn("Day22", "Пустой или ошибочный JSON");
Возврат;
КонецЕсли;
// Валидация обязательных полей
Если НЕ Д.Свойство("event") Или НЕ Д.Свойство("payload") Тогда
A1sLog.Warn("Day22", "Нет event/payload");
Возврат;
КонецЕсли;
Событие = A1sS.AsString(Д.event);
Пэйлоад = Д.payload;
Если Событие = "item.updated" Тогда
Код = A1sS.AsString(Пэйлоад.Получить("sku"));
Имя = A1sS.AsString(Пэйлоад.Получить("name"));
Цена = A1sO.RoundNum(A1sO.NumOrZero(Пэйлоад.Получить("price")), 2);
Если A1sO.Empty(Код) Тогда
A1sLog.Warn("Day22", "Нет SKU — пропуск");
Возврат;
КонецЕсли;
Эл = Справочники.Номенклатура.НайтиПоКоду(Код);
Э = ?(A1sO.Empty(Эл), Справочники.Номенклатура.СоздатьЭлемент(), Эл.ПолучитьОбъект());
A1sO.FromStruct(Э, Новый Структура("Наименование,Комментарий", Имя, "Импорт из webhook")); // День 16/14
Э.Записать();
// Дополнительно: сохранить цену в регистр/ТЧ по вашей логике
A1sLog.Info("Day22", "Обработано item.updated", Новый Структура("SKU,Price", Код, Цена));
Иначе
A1sLog.Debug("Day22", "Неподдерживаемое событие", Новый Структура("event", Событие));
КонецЕсли;
КонецПроцедуры
Форматирование: компактно/красиво
Иногда нужно «красивое» форматирование для логов/файла. Если в сборке есть опции форматирования — используйте их.
// Вариант: красиво (pretty) для логов
СтрокаЛога = A1sJ.ToJSON(Данные, Истина); // 2-й параметр — «красиво» (если поддерживается)
// Компактно (по умолчанию)
СтрокаAPI = A1sJ.ToJSON(Данные); // без лишних пробелов/переводов строки
Если «красивый» режим не поддерживается, сохраняйте компактно и при просмотре форматируйте внешними средствами.
Анти-паттерны
- Сериализовать «как есть» без нормализации типов — приводите строки/числа/даты заранее.
- Доверять входящему JSON без валидации — проверяйте обязательные ключи, типы и диапазоны.
- Смешивать переименование ключей и бизнес-логику — используйте отдельный шаг Remap (День 17).
Практика (15–30 минут)
- Сериализуйте шапку документа через
ДокКЭкспортуи отправьте в тестовый сервис. - Разберите массив товаров из JSON в ТаблицаЗначений с нормализацией чисел.
- Реализуйте обработчик
ОбработатьWebhookдля одного события и залогируйте результат. - Добавьте валидацию «обязательные поля» и «допустимые значения» перед записью данных.
Что дальше
День 23: A1sX — Работа с XML — сериализация/разбор XML и практики конвертации в структуры.
Примечание
Код и тексты на этой странице сгенерированы ИИ. Возможны неточности и ошибки. Перед использованием проверяйте и адаптируйте примеры под вашу версию платформы 1С и сборку библиотеки A1sCode.