A1sCode библиотека 1С

Идея дня

Базовая сериализация (объект → 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(Данные); // без лишних пробелов/переводов строки
      

Если «красивый» режим не поддерживается, сохраняйте компактно и при просмотре форматируйте внешними средствами.

Анти-паттерны

Практика (15–30 минут)

  1. Сериализуйте шапку документа через ДокКЭкспорту и отправьте в тестовый сервис.
  2. Разберите массив товаров из JSON в ТаблицаЗначений с нормализацией чисел.
  3. Реализуйте обработчик ОбработатьWebhook для одного события и залогируйте результат.
  4. Добавьте валидацию «обязательные поля» и «допустимые значения» перед записью данных.

Что дальше

День 23: A1sX — Работа с XML — сериализация/разбор XML и практики конвертации в структуры.

Примечание

Код и тексты на этой странице сгенерированы ИИ. Возможны неточности и ошибки. Перед использованием проверяйте и адаптируйте примеры под вашу версию платформы 1С и сборку библиотеки A1sCode.