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

Идея дня

Базовая сериализация (объект → XML)


// Документ → структура → XML
Функция ДокВXML(Док) Экспорт
    Поля = СтрРазделить("Ссылка,Дата,Номер,Контрагент,Комментарий", ",");
    Шапка = A1sO.ToStruct(Док, Поля); // День 15

    // Нормализуем значения под экспорт
    Экс = Новый Структура;
    Экс.Вставить("id",        A1sS.AsString(Шапка.Ссылка));
    Экс.Вставить("date",      A1sO.DateOrEmpty(Шапка.Дата));
    Экс.Вставить("number",    A1sS.AsString(Шапка.Номер));
    Экс.Вставить("partner",   A1sS.AsString(Док.Контрагент.Наименование));
    Экс.Вставить("comment",   A1sS.AsString(Шапка.Комментарий));
    Экс.Вставить("total",     A1sO.RoundNum(A1sO.NumOrZero(Док.СуммаДокумента), 2)); // День 13

    Возврат A1sX.ToXML(Экс); // → строка XML
КонецФункции
      

Базовый разбор (XML → структура)


Функция ПрочитатьПрофильXML(XMLСтрока) Экспорт
    Данные = A1sX.FromXML(XMLСтрока); // ожидаем структуру
    Если A1sO.Empty(Данные) Тогда Возврат Неопределено; КонецЕсли;

    Проф = Новый Структура;
    Проф.Вставить("Имя",        A1sS.AsString(Данные.Получить("name")));
    Проф.Вставить("Email",      A1sS.AsString(Данные.Получить("email")));
    Проф.Вставить("Телефон",    A1sS.AsString(Данные.Получить("phone")));
    Проф.Вставить("Подписан",   ?(A1sO.Empty(Данные.Получить("subscribed")), Ложь, Данные.Получить("subscribed")));
    Проф.Вставить("ДатаСозд",   A1sO.DateOrEmpty(Данные.Получить("createdAt")));

    Возврат Проф;
КонецФункции
      

Массив элементов: ТЧ → XML и обратно


// Сериализация табличной части "Товары" в XML-массив
Функция ТоварыВXML(Док) Экспорт
    МассивЭл = Новый Массив;
    Для каждого Стр Из Док.Товары Цикл
        Э = Новый Структура;
        Э.Вставить("sku",   A1sS.AsString(Стр.Номенклатура.Код));
        Э.Вставить("name",  A1sS.AsString(Стр.Номенклатура.Наименование));
        Э.Вставить("qty",   A1sO.RoundNum(A1sO.NumOrZero(Стр.Количество), 3));
        Э.Вставить("price", A1sO.RoundNum(A1sO.NumOrZero(Стр.Цена), 2));
        МассивЭл.Добавить(Э);
    КонецЦикла;

    Пакет = Новый Структура;
    Пакет.Вставить("items", МассивЭл);

    Возврат A1sX.ToXML(Пакет);
КонецФункции

// Разбор XML-массива в ТаблицаЗначений
Функция ТоварыИзXML(XMLСтрока) Экспорт
    D = A1sX.FromXML(XMLСтрока); // структура: items = массив
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("SKU");
    ТЗ.Колонки.Добавить("Name");
    ТЗ.Колонки.Добавить("Qty",  Новый ОписаниеТипов("Число"));
    ТЗ.Колонки.Добавить("Price", Новый ОписаниеТипов("Число"));

    Для каждого Э Из D.items Цикл
        Р = ТЗ.Добавить();
        Р.SKU   = A1sS.AsString(Э.Получить("sku"));
        Р.Name  = A1sS.AsString(Э.Получить("name"));
        Р.Qty   = A1sO.RoundNum(A1sO.NumOrZero(Э.Получить("qty")), 3);
        Р.Price = A1sO.RoundNum(A1sO.NumOrZero(Э.Получить("price")), 2);
    КонецЦикла;

    Возврат ТЗ;
КонецФункции
      

A1sQ → XML: выгрузка справочника в список


Функция XMLСписокНоменклатуры(Лимит = 10) Экспорт
    Таб = A1sQ.Unload("
    |ВЫБРАТЬ ПЕРВЫЕ &Лимит
    |    Ном.Ссылка       КАК ID,
    |    Ном.Код          КАК Code,
    |    Ном.Наименование КАК Name
    |ИЗ Справочник.Номенклатура КАК Ном
    |УПОРЯДОЧИТЬ ПО Name
    ", Лимит);

    // Преобразуем в массив для XML
    Элементы = Новый Массив;
    Для каждого Стр Из Таб Цикл
        Э = Новый Структура;
        Э.Вставить("id",   A1sS.AsString(Стр.ID));
        Э.Вставить("code", A1sS.AsString(Стр.Code));
        Э.Вставить("name", A1sS.AsString(Стр.Name));
        Элементы.Добавить(Э);
    КонецЦикла;

    Корень = Новый Структура;
    Корень.Вставить("items", Элементы);

    Возврат A1sX.ToXML(Корень);
КонецФункции
      

Мини-конвейер: очистка → подготовка → XML


Функция ОписаниеТовараВXML(Имя, Код, Цена, Описание) Экспорт
    // 1) Очистим имя/описание от лишних пробелов/HTML (День 20)
    Имя = NormalizeSpaces(Имя);
    Описание = CleanDescription(Описание);

    // 2) Нормализуем числа (День 13)
    Цена = A1sO.RoundNum(A1sO.NumOrZero(Цена), 2);

    // 3) Сериализуем
    Стрк = Новый Структура;
    Стрк.Вставить("name",  A1sS.AsString(Имя));
    Стрк.Вставить("sku",   A1sS.AsString(Код));
    Стрк.Вставить("price", Цена);
    Стрк.Вставить("desc",  A1sS.AsString(Описание));

    Возврат A1sX.ToXML(Стрк);
КонецФункции
      

Валидация на входе


Функция ПроверитьXMLЗаявки(XMLСтрока) Экспорт
    Д = A1sX.FromXML(XMLСтрока);
    Если A1sO.Empty(Д) Тогда Возврат "Пустой/ошибочный XML"; КонецЕсли;

    // Ожидаем D.order с полями number, date, items (массив)
    Ордер = Д.Получить("order");
    Если A1sO.Empty(Ордер) Тогда Возврат "Нет order"; КонецЕсли;

    Если A1sO.Empty(Ордер.number) Тогда Возврат "Нет номера"; КонецЕсли;
    Если A1sO.Empty(Ордер.date)   Тогда Возврат "Нет даты";   КонецЕсли;

    Если A1sO.Empty(Ордер.items)  Тогда Возврат "Пустые позиции"; КонецЕсли;

    // Доп.проверки
    Для каждого П Из Ордер.items Цикл
        Если A1sO.Empty(П.sku) Тогда Возврат "Позиция без SKU"; КонецЕсли;
        Если A1sO.NumOrZero(П.qty) <= 0 Тогда Возврат "Количество ≤ 0"; КонецЕсли;
    КонецЦикла;

    Возврат Неопределено; // всё ок
КонецФункции
      

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

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

  1. Сериализуйте шапку документа и массив позиций в XML двумя функциями.
  2. Разберите XML с позициями в ТаблицаЗначений с нормализацией чисел.
  3. Добавьте валидацию входящего XML заказа (обязательные поля/диапазоны).
  4. Соберите небольшой конвейер очистки текстов (День 20) → подготовка → XML.

Что дальше

День 24: A1sArrays — Создание и объединение — удобные приёмы и шорткаты для массивов.

Примечание

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