Приветствую Вас, Гость · RSS Суббота, 12.07.2025, 18:54








Главная » 2013 » Июль » 15 » CommerceML2 своими руками из любой конфигурации (для с�
11:49
 

CommerceML2 своими руками из любой конфигурации (для с�

Вот изменения обработки результата запроса:


#Если Клиент Тогда
Состояние("Формирование классификатора для выгрузки...");
#КонецЕсли

Фабрика = ФабрикаXDTO;

Сериализатор = Новый СериализаторXDTO(Фабрика);
Запись = Новый ЗаписьXML;
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
Запись.ОткрытьФайл("D:\Temp\XDTOSample81.xml", ПараметрыЗаписиXML);
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("КоммерческаяИнформация");
Запись.ЗаписатьАтрибут("ВерсияСхемы" , "2.04");
Запись.ЗаписатьАтрибут("ДатаФормирования", ФорматДатыДляXML(ТекущаяДата(), Истина, Истина));
Запись.ЗаписатьНачалоЭлемента("Классификатор");
ИдКлассификатора = "3b9d2388-fdee-11e0-a341-0022153a8c09";
ЗаписатьТекстовыйУзел(Запись, "Ид", ФорматНаименованияДляXML(ИдКлассификатора)); //УниканьныйИдентификатор
ЗаписатьТекстовыйУзел(Запись, "Наименование", ФорматНаименованияДляXML("Из торговой системы"));
Запись.ЗаписатьНачалоЭлемента("Владелец");
ЗаписатьТекстовыйУзел(Запись, "Ид", ФорматНаименованияДляXML("3b9d2388-fdee-11e0-a341-0022153a8c09")); //УниканьныйИдентификатор
ЗаписатьТекстовыйУзел(Запись, "Наименование", ФорматНаименованияДляXML("Из торговой системы"));
ЗаписатьТекстовыйУзел(Запись, "ОфициальноеНаименование", ФорматНаименованияДляXML("Из торговой системы"));
ЗаписатьТекстовыйУзел(Запись, "ИНН", ФорматНаименованияДляXML("Из торговой системы"));
Запись.ЗаписатьКонецЭлемента();//Владелец
Запись.ЗаписатьНачалоЭлемента("Группы");
// Начинаем обрабатывать корневую группу, но помним, что в CommerceML положено
// при записи корневой группы иерархического справочника делать рекурсию
НоменклатураГруппаТип = Фабрика.Тип("cml", "Группа");

КорневаяГруппа = Фабрика.Создать(НоменклатураГруппаТип);
КорневаяГруппа.Наименование = "Из торговой системы";
КорневаяГруппа.Ид = ИдКлассификатора;
// Еще одна группа "Прочие товары" (ненужное)

Поле5 = Неопределено;
Поле4 = Неопределено;
Поле3 = Неопределено;
Поле2 = Неопределено;
Родитель = Неопределено;

Группы = Фабрика.Создать(КорневаяГруппа.Свойства()[4].Тип); // Список вложенных элементов одного уровня
Группа = Неопределено; // Текущий вкладываемый элемент

Маркер = КорневаяГруппа;
Для Каждого ТекСтр Из РезТаб Цикл
ОбработкаПрерыванияПользователя();

Если ЗначениеЗаполнено(ТекСтр.Поле5) И ТекСтр.Поле5 <> Поле5 Тогда
// начать новую ветку все 5 звеньев
Если НЕ Поле5 = Неопределено Тогда
// Вписаваем список групп нижнего уровня (т.е. ссылка) внутрь группы родителя
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группы.Группа);
Иначе
Маркер.Группы = Группы;
КонецЕсли;
// Запоминаем позицию в списке для добавления в его конец (на нижнем уровне не нужно)
//Уровень1 = Маркер;
// Закрывать все теги забывать все группы при перескоке к следующей цепочке
// Тег закрывается, когда создается новый экземпляр групп
// Сменились все группы - закрываем теги в обратном порядке, сначала закрываем ссылку
// Закрываем (то есть забываем нижнюю позицию списка)
// Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Группы = Фабрика.Создать(КорневаяГруппа.Свойства()[4].Тип); // Список вложенных элементов одного уровня
Иначе
КонецЕсли;

Маркер = КорневаяГруппа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Поле5.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Поле5.УникальныйИдентификатор());
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень6 = Маркер;

//Переходим на следующий уровень
Маркер = Группа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Поле4.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Поле4.УникальныйИдентификатор());
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень5 = Маркер;

Маркер = Группа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Поле3.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Поле3.УникальныйИдентификатор());
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень4 = Маркер;

Маркер = Группа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Поле2.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Поле2.УникальныйИдентификатор());
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень3 = Маркер;

Маркер = Группа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Родитель.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Родитель.УникальныйИдентификатор());
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень2 = Маркер;

Маркер = Группа; // Сейчас самая последняя папочка в дереве
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Поле5 = ТекСтр.Поле5;
Поле4 = ТекСтр.Поле4;
Поле3 = ТекСтр.Поле3;
Поле2 = ТекСтр.Поле2;
Родитель = ТекСтр.Родитель;

ИначеЕсли ЗначениеЗаполнено(ТекСтр.Поле4) И ТекСтр.Поле4 <> Поле4 Тогда
// Сменились все группы кроме верхней
// Закрыть и забыть все кроме верхней
// начать новые 4 звена
Если НЕ Поле4 = Неопределено Тогда
// Вписаваем список групп нижнего уровня (т.е. ссылка) внутрь группы родителя.
// Добавлять нужно будет другими методами.
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Добавить(Группы.Группа);
Иначе
Маркер.Группы = Группы;
КонецЕсли;

// Здесь информация о закрывающемся уровне уже потеряна
//Уровень1 = Маркер;
// Закрывать все теги забывать все группы при перескоке к следующей цепочке
// Тег закрывается, когда создается новый экземпляр групп
// Сменились все группы - закрываем теги в обратном порядке, сначала закрываем ссылку
// Закрываем (то есть забываем нижнюю позицию списка)
//Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Группы = Фабрика.Создать(КорневаяГруппа.Свойства()[4].Тип); // Список вложенных элементов одного уровня

КонецЕсли;

Маркер = КорневаяГруппа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Поле4.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Поле4.УникальныйИдентификатор());
//Создать или добавить
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень5 = Маркер;

Маркер = Группа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Поле3.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Поле3.УникальныйИдентификатор());
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень4 = Маркер;

Маркер = Группа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Поле2.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Поле2.УникальныйИдентификатор());
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень3 = Маркер;

Маркер = Группа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Родитель.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Родитель.УникальныйИдентификатор());
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень2 = Маркер;

Маркер = Группа; // Сейчас самая последняя папочка в дереве
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Поле4 = ТекСтр.Поле4;
Поле3 = ТекСтр.Поле3;
Поле2 = ТекСтр.Поле2;
Родитель = ТекСтр.Родитель;

ИначеЕсли ЗначениеЗаполнено(ТекСтр.Поле3) И ТекСтр.Поле3 <> Поле3 Тогда

Если НЕ Поле3 = Неопределено Тогда
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Добавить(Группы.Группа);
Иначе
Маркер.Группы = Группы;
КонецЕсли;
Группы = Фабрика.Создать(КорневаяГруппа.Свойства()[4].Тип); // Список вложенных элементов одного уровня
КонецЕсли;

Маркер = КорневаяГруппа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Поле3.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Поле3.УникальныйИдентификатор());
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень4 = Маркер;

Маркер = Группа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Поле2.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Поле2.УникальныйИдентификатор());
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень3 = Маркер;

Маркер = Группа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Родитель.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Родитель.УникальныйИдентификатор());
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень2 = Маркер;

Маркер = Группа; // Сейчас самая последняя папочка в дереве
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Поле3 = ТекСтр.Поле3;
Поле2 = ТекСтр.Поле2;
Родитель = ТекСтр.Родитель;
ИначеЕсли ЗначениеЗаполнено(ТекСтр.Поле2) И ТекСтр.Поле2 <> Поле2 Тогда
Если НЕ Поле3 = Неопределено Тогда
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Добавить(Группы.Группа);
Иначе
Маркер.Группы = Группы;
КонецЕсли;
Группы = Фабрика.Создать(КорневаяГруппа.Свойства()[4].Тип); // Список вложенных элементов одного уровня
КонецЕсли;

Маркер = КорневаяГруппа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Поле2.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Поле2.УникальныйИдентификатор());
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень3 = Маркер;

Маркер = Группа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Родитель.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Родитель.УникальныйИдентификатор());
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень2 = Маркер;

Маркер = Группа; // Сейчас самая последняя папочка в дереве
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Поле2 = ТекСтр.Поле2;
Родитель = ТекСтр.Родитель;
ИначеЕсли ЗначениеЗаполнено(ТекСтр.Родитель) И ТекСтр.Родитель <> Родитель Тогда
//Если НЕ Поле3 = Неопределено Тогда
// Если НЕ Маркер.Группы = Неопределено Тогда
// Маркер.Группы.Добавить(Группы.Группа);
//Иначе
Если Родитель <> Неопределено Тогда
Маркер.Группы = Группы;
КонецЕсли;
//КонецЕсли;
//Группы = Фабрика.Создать(КорневаяГруппа.Свойства()[4].Тип); // Список вложенных элементов одного уровня
//КонецЕсли;

Маркер = КорневаяГруппа;
Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Родитель.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Родитель.УникальныйИдентификатор());
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Если НЕ Маркер.Группы = Неопределено Тогда
Маркер.Группы.Группа.Добавить(Группа);
Иначе
Группы.Группа.Добавить(Группа);
Маркер.Группы = Группы;
КонецЕсли;
Уровень2 = Маркер;

Маркер = Группа; // Сейчас самая последняя папочка в дереве
Группы = Фабрика.Создать(Группа.Свойства()[4].Тип);
Родитель = ТекСтр.Родитель;
КонецЕсли;
// Дописать в текущую строчку последнее звено

Группа = Фабрика.Создать(НоменклатураГруппаТип);
Группа.Наименование = ТекСтр.Ссылка.Наименование;
Группа.Ид = СокрЛП(ТекСтр.Ссылка.УникальныйИдентификатор());
Группы.Группа.Добавить(Группа);
//Группы будут записаны после добавления всех нижнего уровня
//Маркер.Группы = Группы;
//Это нужно делать в начале смены текущей строки

КонецЦикла;

Маркер.Группы = Группы;
Сериализатор.Фабрика.ЗаписатьXML(Запись, КорневаяГруппа);
Запись.ЗаписатьКонецЭлемента(); // Группы
Запись.ЗаписатьКонецЭлемента(); // Классификатор
Запись.ЗаписатьНачалоЭлемента("Каталог");

+ 1 [ forever-lilya; ]
Просмотров: 412 | Добавил: washou | Рейтинг: 0.0/0
Всего комментариев: 0
Конструктор сайтовuCoz
Copyright MyCorp © 2025