////////////////////////////////////////////////////////////////////////////////////////////////
// Демонстрация глубокого понимания модуля A1sX
// Комплексные примеры использования XML-сериализации в 1C:Enterprise
////////////////////////////////////////////////////////////////////////////////////////////////
#Область ПримерыБазовыхТипов
Процедура ПримерыПростыхТипов()
// Строки с различными кодировками и спецсимволами
СтрокаСоСпецСимволами = "Тест<>&""'с символами XML";
XMLСтрока = A1sX.ToXML(СтрокаСоСпецСимволами);
ВосстановленнаяСтрока = A1sX.FromXML(XMLСтрока);
Сообщить("Строка: " + ?(СтрокаСоСпецСимволами = ВосстановленнаяСтрока, "✓ OK", "✗ FAIL"));
// Числа различных типов
ЦелоеЧисло = 2147483647; // максимальное 32-битное
ВещественноеЧисло = 3.14159265359;
ОтрицательноеЧисло = -999999999;
Для Каждого Число Из Новый Массив(ЦелоеЧисло, ВещественноеЧисло, ОтрицательноеЧисло) Цикл
XMLЧисло = A1sX.ToXML(Число);
ВосстЧисло = A1sX.FromXML(XMLЧисло);
Сообщить("Число " + Строка(Число) + ": " + ?(Число = ВосстЧисло, "✓ OK", "✗ FAIL"));
КонецЦикла;
// Булевы значения
XMLИстина = A1sX.ToXML(Истина);
XMLЛожь = A1sX.ToXML(Ложь);
Сообщить("Булево Истина: " + ?(A1sX.FromXML(XMLИстина) = Истина, "✓ OK", "✗ FAIL"));
Сообщить("Булево Ложь: " + ?(A1sX.FromXML(XMLЛожь) = Ложь, "✓ OK", "✗ FAIL"));
// Дата и время
ТекущаяДата = ТекущаяДата();
XMLДата = A1sX.ToXML(ТекущаяДата);
ВосстДата = A1sX.FromXML(XMLДата);
Сообщить("Дата: " + ?(ТекущаяДата = ВосстДата, "✓ OK", "✗ FAIL"));
КонецПроцедуры
#КонецОбласти
#Область ПримеряСложныхКоллекций
Процедура ПримерВложенныхСтруктур()
// Создание многоуровневой структуры
ГлавнаяСтруктура = Новый Структура();
ГлавнаяСтруктура.Вставить("Название", "Главная структура");
ГлавнаяСтруктура.Вставить("Версия", 1.0);
ГлавнаяСтруктура.Вставить("Активна", Истина);
// Вложенная структура конфигурации
Конфигурация = Новый Структура();
Конфигурация.Вставить("БазаДанных", "PostgreSQL");
Конфигурация.Вставить("Порт", 5432);
Конфигурация.Вставить("Настройки", Новый Структура("Таймаут,Кэширование", 30, Истина));
ГлавнаяСтруктура.Вставить("Конфигурация", Конфигурация);
// Массив пользователей
МассивПользователей = Новый Массив();
Для НомерПользователя = 1 По 3 Цикл
Пользователь = Новый Структура();
Пользователь.Вставить("ID", НомерПользователя);
Пользователь.Вставить("Имя", "Пользователь" + НомерПользователя);
Пользователь.Вставить("Email", "user" + НомерПользователя + "@example.com");
Пользователь.Вставить("Роли", Новый Массив("User", ?(НомерПользователя = 1, "Admin", "Guest")));
МассивПользователей.Добавить(Пользователь);
КонецЦикла;
ГлавнаяСтруктура.Вставить("Пользователи", МассивПользователей);
// Сериализация и десериализация
XMLСтрока = A1sX.ToXML(ГлавнаяСтруктура);
ВосстановленнаяСтруктура = A1sX.FromXML(XMLСтрока);
// Детальная проверка
ПроверитьСтруктуру(ГлавнаяСтруктура, ВосстановленнаяСтруктура, "ГлавнаяСтруктура");
КонецПроцедуры
Процедура ПроверитьСтруктуру(Исходная, Восстановленная, ИмяСтруктуры)
Если Исходная.Количество() <> Восстановленная.Количество() Тогда
Сообщить("✗ FAIL: " + ИмяСтруктуры + " - разное количество элементов");
Возврат;
КонецЕсли;
Для Каждого КлючЗначение Из Исходная Цикл
Ключ = КлючЗначение.Ключ;
ИсходноеЗначение = КлючЗначение.Значение;
Если Не Восстановленная.Свойство(Ключ) Тогда
Сообщить("✗ FAIL: " + ИмяСтруктуры + " - отсутствует ключ " + Ключ);
Возврат;
КонецЕсли;
ВосстановленноеЗначение = Восстановленная[Ключ];
// Рекурсивная проверка для структур
Если ТипЗнч(ИсходноеЗначение) = Тип("Структура") Тогда
ПроверитьСтруктуру(ИсходноеЗначение, ВосстановленноеЗначение, ИмяСтруктуры + "." + Ключ);
ИначеЕсли ТипЗнч(ИсходноеЗначение) = Тип("Массив") Тогда
ПроверитьМассив(ИсходноеЗначение, ВосстановленноеЗначение, ИмяСтруктуры + "." + Ключ);
ИначеЕсли ИсходноеЗначение <> ВосстановленноеЗначение Тогда
Сообщить("✗ FAIL: " + ИмяСтруктуры + "." + Ключ + " - значения не совпадают");
Возврат;
КонецЕсли;
КонецЦикла;
Сообщить("✓ OK: " + ИмяСтруктуры + " - структура корректно восстановлена");
КонецПроцедуры
Процедура ПроверитьМассив(Исходный, Восстановленный, ИмяМассива)
Если Исходный.Количество() <> Восстановленный.Количество() Тогда
Сообщить("✗ FAIL: " + ИмяМассива + " - разное количество элементов");
Возврат;
КонецЕсли;
Для i = 0 По Исходный.Количество() - 1 Цикл
ИсходныйЭлемент = Исходный[i];
ВосстановленныйЭлемент = Восстановленный[i];
Если ТипЗнч(ИсходныйЭлемент) = Тип("Структура") Тогда
ПроверитьСтруктуру(ИсходныйЭлемент, ВосстановленныйЭлемент, ИмяМассива + "[" + i + "]");
ИначеЕсли ТипЗнч(ИсходныйЭлемент) = Тип("Массив") Тогда
ПроверитьМассив(ИсходныйЭлемент, ВосстановленныйЭлемент, ИмяМассива + "[" + i + "]");
ИначеЕсли ИсходныйЭлемент <> ВосстановленныйЭлемент Тогда
Сообщить("✗ FAIL: " + ИмяМассива + "[" + i + "] - элементы не совпадают");
Возврат;
КонецЕсли;
КонецЦикла;
Сообщить("✓ OK: " + ИмяМассива + " - массив корректно восстановлен");
КонецПроцедуры
#КонецОбласти
#Область ПримерыСоСправочниками
Процедура ПримерСериализацииСправочников()
// Имитация структуры справочника (поскольку настоящие ссылки не сериализуются)
СтруктураСправочника = Новый Структура();
СтруктураСправочника.Вставить("Тип", "Справочник.Номенклатура");
СтруктураСправочника.Вставить("Код", "000000001");
СтруктураСправочника.Вставить("Наименование", "Товар 1");
СтруктураСправочника.Вставить("Артикул", "ART-001");
СтруктураСправочника.Вставить("Цена", 1500.50);
СтруктураСправочника.Вставить("ЕдиницаИзмерения", "шт.");
СтруктураСправочника.Вставить("НДС", 20);
// Реквизиты табличной части
ТабличнаяЧасть = Новый Массив();
Для НомерСтроки = 1 По 3 Цикл
СтрокаТЧ = Новый Структура();
СтрокаТЧ.Вставить("Характеристика", "Цвет " + НомерСтроки);
СтрокаТЧ.Вставить("Количество", НомерСтроки * 10);
СтрокаТЧ.Вставить("Сумма", НомерСтроки * 1500.50);
ТабличнаяЧасть.Добавить(СтрокаТЧ);
КонецЦикла;
СтруктураСправочника.Вставить("ТабличнаяЧасть", ТабличнаяЧасть);
XMLСправочник = A1sX.ToXML(СтруктураСправочника);
ВосстСправочник = A1sX.FromXML(XMLСправочник);
ПроверитьСтруктуру(СтруктураСправочника, ВосстСправочник, "СправочникНоменклатура");
КонецПроцедуры
#КонецОбласти
#Область ПримерыОбработкиОшибок
Процедура ПримерОбработкиНекорректныхДанных()
Сообщить("=== Тестирование обработки ошибок ===");
// Тест 1: Пустая строка
ПустойXML = "";
Результат1 = A1sX.FromXML(ПустойXML);
Сообщить("Пустая строка: " + ?(Результат1 = Неопределено, "✓ OK (Неопределено)", "✗ FAIL"));
// Тест 2: Некорректный XML
НекорректныйXML = "<root><unclosed>test</root>";
Результат2 = A1sX.FromXML(НекорректныйXML);
Сообщить("Некорректный XML: " + ?(Результат2 = Неопределено, "✓ OK (Неопределено)", "✗ FAIL"));
// Тест 3: XML с неподдерживаемыми тегами
НестандартныйXML = "<custom><data>test</data></custom>";
Результат3 = A1sX.FromXML(НестандартныйXML);
Сообщить("Нестандартный XML: " + ?(Результат3 <> Неопределено, "✓ OK (обработано)", "✗ FAIL"));
// Тест 4: Очень большая строка (имитация)
БольшаяСтрока = "";
Для i = 1 По 1000 Цикл
БольшаяСтрока = БольшаяСтрока + "Очень длинная строка для тестирования " + i + " ";
КонецЦикла;
XMLБольшойСтроки = A1sX.ToXML(БольшаяСтрока);
ВосстБольшаяСтрока = A1sX.FromXML(XMLБольшойСтроки);
Сообщить("Большая строка: " + ?(БольшаяСтрока = ВосстБольшаяСтрока, "✓ OK", "✗ FAIL"));
КонецПроцедуры
#КонецОбласти
#Область ПримерыПроизводительности
Процедура ТестПроизводительности()
Сообщить("=== Тест производительности ===");
КоличествоИтераций = 100;
// Подготовка тестовых данных
ТестоваяСтруктура = Новый Структура();
ТестоваяСтруктура.Вставить("Строка", "Тестовая строка для измерения производительности");
ТестоваяСтруктура.Вставить("Число", 123456789);
ТестоваяСтруктура.Вставить("Дата", ТекущаяДата());
ТестоваяСтруктура.Вставить("Булево", Истина);
МассивДанных = Новый Массив();
Для i = 1 По 50 Цикл
МассивДанных.Добавить(ТестоваяСтруктура);
КонецЦикла;
// Тест сериализации
НачалоВремени = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для i = 1 По КоличествоИтераций Цикл
XMLРезультат = A1sX.ToXML(МассивДанных);
КонецЦикла;
ВремяСериализации = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоВремени;
// Тест десериализации
XMLДляТеста = A1sX.ToXML(МассивДанных);
НачалоВремени = ТекущаяУниверсальнаяДатаВМиллисекундах();
Для i = 1 По КоличествоИтераций Цикл
ВосстановленныеДанные = A1sX.FromXML(XMLДляТеста);
КонецЦикла;
ВремяДесериализации = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоВремени;
Сообщить("Время сериализации (" + КоличествоИтераций + " итераций): " + ВремяСериализации + " мс");
Сообщить("Время десериализации (" + КоличествоИтераций + " итераций): " + ВремяДесериализации + " мс");
Сообщить("Размер XML: " + СтрДлина(XMLДляТеста) + " символов");
КонецПроцедуры
#КонецОбласти
#Область ПримерыИнтеграции
Процедура ПримерОбменаДанными()
Сообщить("=== Пример интеграции с внешними системами ===");
// Подготовка пакета данных для отправки
ПакетДанных = Новый Структура();
ПакетДанных.Вставить("ВерсияПротокола", "1.0");
ПакетДанных.Вставить("ВремяСоздания", ТекущаяДата());
ПакетДанных.Вставить("ИдентификаторОтправителя", "1C-Enterprise-System");
// Заголовок сообщения
Заголовок = Новый Структура();
Заголовок.Вставить("ТипСообщения", "Справочники");
Заголовок.Вставить("КоличествоЗаписей", 0);
ПакетДанных.Вставить("Заголовок", Заголовок);
// Данные справочников
СправочникиДанные = Новый Массив();
// Справочник Контрагенты
МассивКонтрагентов = Новый Массив();
Для НомерКонтрагента = 1 По 5 Цикл
Контрагент = Новый Структура();
Контрагент.Вставить("Код", Формат(НомерКонтрагента, "ЧЦ=6; ЧВН="));
Контрагент.Вставить("Наименование", "Контрагент " + НомерКонтрагента);
Контрагент.Вставить("ИНН", "77" + Формат(НомерКонтрагента, "ЧЦ=8; ЧВН="));
Контрагент.Вставить("КПП", "770101001");
Контрагент.Вставить("Адрес", "г. Москва, ул. Тестовая, д. " + НомерКонтрагента);
// Контактная информация
КонтактнаяИнформация = Новый Массив();
КонтактТелефон = Новый Структура("Тип,Значение", "Телефон", "+7(495)123-45-" + Формат(НомерКонтрагента, "ЧЦ=2; ЧВН="));
КонтактEmail = Новый Структура("Тип,Значение", "Email", "contact" + НомерКонтрагента + "@example.com");
КонтактнаяИнформация.Добавить(КонтактТелефон);
КонтактнаяИнформация.Добавить(КонтактEmail);
Контрагент.Вставить("КонтактнаяИнформация", КонтактнаяИнформация);
МассивКонтрагентов.Добавить(Контрагент);
КонецЦикла;
СправочникКонтрагенты = Новый Структура();
СправочникКонтрагенты.Вставить("ИмяСправочника", "Контрагенты");
СправочникКонтрагенты.Вставить("Данные", МассивКонтрагентов);
СправочникиДанные.Добавить(СправочникКонтрагенты);
ПакетДанных.Вставить("СправочникиДанные", СправочникиДанные);
ПакетДанных.Заголовок.КоличествоЗаписей = МассивКонтрагентов.Количество();
// Сериализация пакета
XMLПакет = A1sX.ToXML(ПакетДанных);
Сообщить("Размер XML-пакета: " + СтрДлина(XMLПакет) + " символов");
// Имитация передачи и получения
ПолученныйПакет = A1sX.FromXML(XMLПакет);
// Проверка целостности
Если ПолученныйПакет.Заголовок.КоличествоЗаписей = ПакетДанных.Заголовок.КоличествоЗаписей Тогда
Сообщить("✓ OK: Пакет данных успешно передан и восстановлен");
Сообщить("Получено контрагентов: " + ПолученныйПакет.Заголовок.КоличествоЗаписей);
Иначе
Сообщить("✗ FAIL: Ошибка при передаче пакета данных");
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область ГлавныйТест
Процедура ВыполнитьВсеТесты() Экспорт
Сообщить("################################################################################");
Сообщить("# Комплексное тестирование модуля A1sX");
Сообщить("# Демонстрация глубокого понимания возможностей XML-сериализации");
Сообщить("################################################################################");
Сообщить("");
// Базовые тесты модуля
Сообщить("=== Выполнение встроенных тестов модуля ===");
РезультатВстроенныхТестов = A1sX.SelfTest();
Сообщить("");
// Расширенные тесты
Сообщить("=== Расширенные тесты ===");
ПримерыПростыхТипов();
Сообщить("");
ПримерВложенныхСтруктур();
Сообщить("");
ПримерСериализацииСправочников();
Сообщить("");
ПримерОбработкиНекорректныхДанных();
Сообщить("");
ТестПроизводительности();
Сообщить("");
ПримерОбменаДанными();
Сообщить("");
Сообщить("################################################################################");
Сообщить("# Тестирование завершено");
Сообщить("# Модуль A1sX протестирован в различных сценариях использования");
Сообщить("################################################################################");
КонецПроцедуры
#КонецОбласти
////////////////////////////////////////////////////////////////////////////////////////////////
// Дополнительные примеры для демонстрации экспертного понимания
////////////////////////////////////////////////////////////////////////////////////////////////
#Область ЭкспертныеПримеры
Процедура ПримерОптимизацииДляБольшихДанных()
// Демонстрация понимания ограничений и оптимизации
Сообщить("=== Оптимизация для больших объемов данных ===");
// Вместо одного большого массива - разбиение на пакеты
РазмерПакета = 100;
ОбщееКоличество = 500;
Для НомерПакета = 0 По ОбщееКоличество / РазмерПакета - 1 Цикл
МалыйПакет = Новый Массив();
НачальныйИндекс = НомерПакета * РазмерПакета;
КонечныйИндекс = Мин((НомерПакета + 1) * РазмерПакета - 1, ОбщееКоличество - 1);
Для i = НачальныйИндекс По КонечныйИндекс Цикл
Элемент = Новый Структура("ID,Данные", i, "Запись " + i);
МалыйПакет.Добавить(Элемент);
КонецЦикла;
XMLПакета = A1sX.ToXML(МалыйПакет);
// Здесь можно было бы сохранить в файл или передать по сети
Сообщить("Пакет " + (НомерПакета + 1) + ": обработано записей " + МалыйПакет.Количество() + ", размер XML: " + СтрДлина(XMLПакета));
КонецЦикла;
КонецПроцедуры
Процедура ПримерВерсионированияДанных()
// Демонстрация подхода к версионированию структур данных
Сообщить("=== Версионирование структур данных ===");
// Версия 1.0
ДанныеV1 = Новый Структура();
ДанныеV1.Вставить("Версия", "1.0");
ДанныеV1.Вставить("Имя", "Тест");
ДанныеV1.Вставить("Значение", 100);
XMLV1 = A1sX.ToXML(ДанныеV1);
// Версия 2.0 - добавлены новые поля
ДанныеV2 = Новый Структура();
ДанныеV2.Вставить("Версия", "2.0");
ДанныеV2.Вставить("Имя", "Тест");
ДанныеV2.Вставить("Значение", 100);
ДанныеV2.Вставить("НовоеПоле", "Новое значение"); // новое поле
ДанныеV2.Вставить("Настройки", Новый Структура("Режим", "Авто")); // новая вложенная структура
XMLV2 = A1sX.ToXML(ДанныеV2);
// Тест обратной совместимости
ВосстановленоV1 = A1sX.FromXML(XMLV1);
ВосстановленоV2 = A1sX.FromXML(XMLV2);
Сообщить("V1 восстановлено корректно: " + ?(ВосстановленоV1.Версия = "1.0", "✓ OK", "✗ FAIL"));
Сообщить("V2 восстановлено корректно: " + ?(ВосстановленоV2.Версия = "2.0" И ВосстановленоV2.НовоеПоле = "Новое значение", "✓ OK", "✗ FAIL"));
КонецПроцедуры
#КонецОбласти
Показать