Идея дня
- Сериализуем структуры/массивы в XML —
A1sX.ToXML(..). - Разбираем XML-строки обратно в Структуры/Массивы —
A1sX.FromXML(..). - Готовим данные заранее: строки/числа/даты приводим через
A1sS/A1sO(Дни 12–13, 18–20), ключи — через приёмы Дня 17.
Базовая сериализация (объект → 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"; КонецЕсли;
КонецЦикла;
Возврат Неопределено; // всё ок
КонецФункции
Анти-паттерны
- Сериализовать «как есть» без нормализации типов — приводите строки/числа/даты заранее.
- Доверять входящему XML без проверок — валидируйте обязательные элементы/значения.
- Смешивать переименование ключей, очистку и бизнес-логику — стройте конвейер шагами (см. День 17 + 20).
Практика (15–30 минут)
- Сериализуйте шапку документа и массив позиций в XML двумя функциями.
- Разберите XML с позициями в ТаблицаЗначений с нормализацией чисел.
- Добавьте валидацию входящего XML заказа (обязательные поля/диапазоны).
- Соберите небольшой конвейер очистки текстов (День 20) → подготовка → XML.
Что дальше
День 24: A1sArrays — Создание и объединение — удобные приёмы и шорткаты для массивов.
Примечание
Код и тексты на этой странице сгенерированы ИИ. Возможны неточности и ошибки. Перед использованием проверяйте и адаптируйте примеры под вашу версию платформы 1С и сборку библиотеки A1sCode.