30.08.2012 Добавлен импорт коммерческого предложения (прайс листа с ценами, главный файл ksnikx21.epf). Байка из склепа (о жутком баге): как-то ночтью случайно допустил досадную опечатку в одном из тегов, а именно "Предложение" написал с латинской буквой "е". Двое суток сходил с ума, почему же мои цены напрочь игнорирует модуль обмена данными umi cms, и при этом утверждает, что все импортировалось успешно. Теперь все в порядке. Если есть непонятные глюки с загрузкой xml (например не загружается коммерческое предложение offers commerceml2), подвергните синтаксическому анализу свои теги. п.с. После выгрузки не забывайте чистьть конец файла, удалять весь мусор, который остается после закрытия тега "Коммерческая информация".
13.08.2012 Новая версия с расширенными возможностями добавлена отдельным файлом ksnikx2.epf , в этой обработке кроме справочника Номенклатура в формировании наименования товара используется справочник бухгалтерских групп (категорий) номенклатуры. Сейчас работа идет над загрузкой с яндекс.маркета. Кто хочет помогайте недовольным юзерам осваивать обработку, но и про автора не забывайте ;-) В файле import.xml - пример номенклатуры, в файле offers.xml - пример заказов из комплекта umi.cms
29.06.2012 Кроме этого демонстрационного примера в версию 2 архива добавлена процедура, которая по справочнику Номенклатура создает классификатор и каталог (полный или с отбором на основании заполнения табличной части обработки).
В системе управления вебсайтом UNI.CMS (да и в Битриксе) есть отступление от схемы cml, заставляют очень подробно заполнять владельца классификатора. Результат импорта в UNI.CMS:
====================================
тип "Объект каталога" (root-catalog-object-type) был обновлен
тип "Раздел каталога" (root-catalog-category-type) был обновлен
тип "1C: - ИРИДА" (676a1a6d-d635-4d0c-84c6-363658f94a33) был обновлен
тип "1C: Шокорель" (63389a41-64cf-4a88-bc43-193917af7b61) был обновлен
страница "Каталог товаров 7 дней" (6933ae38-7e4a-4e7b-8fa2-d7a732101ee1) была обновлена
страница "- ИРИДА" (676a1a6d-d635-4d0c-84c6-363658f94a33) была обновлена
страница "Шокорель" (63389a41-64cf-4a88-bc43-193917af7b61) была обновлена
страница "- ИРИДА/Шокорель/Регенерирующий бальзам для ухода за кожей в/глаз" (871fcad4-cbdc-4b5d-b8b7-c5508d013a50) была обновлена
====================================
Только обратите внимание - файл cml.xsd нужно загрузить в ветку "Пакеты XDTO" дерева конфигурации. Чтобы все товары записались на сайт мне пришлось после сохранения файла в моей обработке руками очищать из него атрибуты тегов "Группа" и "Товар" (они одинаковые, удаляются заменой на пустую строку) вот это:
xmlns="cml" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
====================================
Вот как создается CommerceML2:
====================================
// Методы работы с XDTO практически не документированы.
// Эта обработка формирует маленький CommerceML2 (прилагается файл XDTOSample9.xml)
// при помощи удобных методов XDTO в отличии от прошлой ЗаписатьТэгиВXMLДокумент(),
// и вспомогательной ПолучитьСтрокуЗаписиДляXML которые рекурсивно обходят жуткое дерево.
// Задачу формирования CommerceML2 удобнее решать встроенными средствами XDTO.
// Работа с вложенными группами немного напоминает паскалевский Турбо Вижен (Turbo Vision).
Процедура КнопкаВыполнитьНажатие(Кнопка)
//Берем за основу произвольную схему XML без ограничений, накладываемых на названия пакетов,
//присущих пакету cml из дерева конфигурации, чтоб 1Ска не ругалась на несоответствие типов
//при использовании конструкторов типов фабрики. Отплевался от конфигурашного комерцемеля.
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл("D:\Temp\cml.xsd");
ПостроительДом = Новый ПостроительDOM;
ДокументДом = ПостроительДом.Прочитать(Чтение);
ПостроительСхемы = Новый ПостроительСхемXML;
СхемаХМЛ = ПостроительСхемы.СоздатьСхемуXML(ДокументДом);
НаборСхемХМЛ = Новый НаборСхемXML;
НаборСхемХМЛ.Добавить(СхемаХМЛ);
Фабрика = Новый ФабрикаXDTO(НаборСхемХМЛ); //создали
//Без сериализации XDMO не получится сделать рекурсию при добавлении
//в классификатор вложенных групп и ссылку на группы в товарах каталога
//но сериализация без проблем сочетается с элементарной записью XML
Сериализатор = Новый СериализаторXDTO(Фабрика);
Запись = Новый ЗаписьXML;
ПараметрыЗаписиXML = Новый ПараметрыЗаписиXML("UTF-8", "1.0", Ложь);
Запись.ОткрытьФайл("D:\Temp\XDTOSample25.xml", ПараметрыЗаписиXML);
Запись.ЗаписатьОбъявлениеXML();
Запись.ЗаписатьНачалоЭлемента("КоммерческаяИнформация");
Запись.ЗаписатьАтрибут("ВерсияСхемы" , "2.04");
Запись.ЗаписатьАтрибут("ДатаФормирования", ФорматДатыДляXML(ТекущаяДата(), Истина, Истина));
Запись.ЗаписатьНачалоЭлемента("Классификатор");
ИдКлассификатора = Новый УникальныйИдентификатор;
ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "Ид", ФорматНаименованияДляXML(ИдКлассификатора)); //УниканьныйИдентификатор
ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "Наименование", ФорматНаименованияДляXML("Классификатор товаров 7 дней"));
// Оказалась обязательной расшифровка для поля Владелец в классификаторе и в каталоге
//ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "Владелец", ФорматНаименованияДляXML("*******"));
Запись.ЗаписатьНачалоЭлемента("Владелец");
ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "Ид", ФорматНаименованияДляXML("3b9d2388-fdee-11e0-a341-0022153a8c09")); //УниканьныйИдентификатор
ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "Наименование", ФорматНаименованияДляXML("**********"));
ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "ОфициальноеНаименование", ФорматНаименованияДляXML("******************************************")); //УниканьныйИдентификатор
ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "ИНН", ФорматНаименованияДляXML("36********11"));
Запись.ЗаписатьКонецЭлемента();//Владелец
//ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "Описание", ФорматНаименованияДляXML("Классификатор товаров в формате CommerceML2 для сайта *************"));
Запись.ЗаписатьНачалоЭлемента("Группы");
// Начинаем обрабатывать корневую группу, но помним, что в CommerceML положено
// при записи корневой группы иерархического справочника делать рекурсию
ТекЭлемент = Справочники.Номенклатура.НайтиПоКоду("ЦБ042097");
ГруппаНоменклатурыТип = Фабрика.Тип("cml", "Группа");
ГруппаНоменклатуры = Фабрика.Создать(ГруппаНоменклатурыТип);
ЗаполнитьЗначенияСвойств(ГруппаНоменклатуры, ТекЭлемент);
ГруппаНоменклатуры.Ид = СокрЛП(ТекЭлемент.УникальныйИдентификатор());
ГруппаНоменклатуры.Наименование = ТекЭлемент.Наименование;
//Из-за того, что писал описания, каталог на сайт не загружался, закомментировал их.
//ГруппаНоменклатуры.Описание = ТекЭлемент.ПолноеНаименование();
//Вот так при желании вставляется СписокXDTO внутрь ОбъектXDTO, но в CommerceML
//запись свойства по-другому написана, а так мы поступим с группами в товарах каталога
//Создаем ОбъектXDTO, внутри которого пустой список типа СписокXDTO
//Свойства = Фабрика.Создать(ГруппаНоменклатуры.Свойства()[3].Тип);
//Внутри контейнера вставляем одно пустое свойство
//Свойство = Фабрика.Создать(Свойства.Свойство.ВладеющееСвойство.Тип, Неопределено);
//Свойства.Свойство.Добавить(Свойство);
//ГруппаНоменклатуры.Свойства = Свойства;
//И немного каши из топора, работать с таким объектом можно, а интегрировать его не удается
//По номеру извлекаем (списочный СписокXDTO "Элементы.Свойство") тип, соответствующий фрагменту ОбъектXDTO "{cml}Группа".Свойства
//Свойства = Фабрика.Создать(фабрика.Пакеты[1][48]); // Правильнее искать тип данных по имени а не по номеру, потому что при добавлении
//Элементы = Фабрика.Создать("{cml}СписокСвойств"); // новых типов данных в пакет XDTO индексы сбиваются и в коде приходится менять
//цыфОрки (именно данный номер типа данных), но так не получается потому что {Обработка.Демо.Форма.Форма1(229)}: Ошибка при вызове
//метода контекста (Создать) Элементы = Фабрика.Создать("{cml}СписокСвойств"); по причине: Несоответствие типов (параметр номер '2')
//Сообщить("СписокXDTO "+СокрЛП(Свойства.Свойство.Количество())+" шт. "); // в данном случае = 1 шт.
//{Обработка.Демо.Форма.Форма1(245)}: Ошибка при установке значения атрибута контекста (Свойства)
// ГруппаНоменклатуры.Свойства = Свойства;
//по причине:
//Несоответствие типов XDTO:
//Тип '{cml}СписокСвойств' не соответствует типу ''
//Тип свойства не соответствует типу значения
// '' само собой в номенклатуре, а '{cml}СписокСвойств' справа
//А вот это именно тот результат, который совпадает с выгрузкой Битрикса
ГруппаНоменклатуры.Сбросить("Свойства");
//Если у вложенной группы есть родитель, тогда делаем начало вложенной группы
ТекЭлемент = Справочники.Номенклатура.НайтиПоКоду("ЦБ053031");
Если ЗначениеЗаполнено(ТекЭлемент.Родитель) Тогда
//Создаем ОбъектXDTO, внутри которого пустой список типа СписокXDTO
Группы = Фабрика.Создать(ГруппаНоменклатуры.Свойства()[4].Тип);
//Подготавливаем вложенную группу для вставки в список
ГруппаНоменклатурыТип2 = Фабрика.Тип("cml", "Группа");
ГруппаНоменклатуры2 = Фабрика.Создать(ГруппаНоменклатурыТип2);
ЗаполнитьЗначенияСвойств(ГруппаНоменклатуры2, ТекЭлемент);
ГруппаНоменклатуры2.Ид = СокрЛП(ТекЭлемент.УникальныйИдентификатор());
ГруппаНоменклатуры2.Наименование = ТекЭлемент.Наименование;
//ГруппаНоменклатуры2.Описание = ТекЭлемент.ПолноеНаименование();
//Подготавливаем контейнер для укладки вложенной группы в список
//Группа = Фабрика.Создать(Группы.Группа.ВладеющееСвойство.Тип, ГруппаНоменклатуры2);
//Внутри контейнера вставляем нужную группу
Группы.Группа.Добавить(ГруппаНоменклатуры2);
ГруппаНоменклатуры.Группы = Группы;
Иначе
Запись.ЗаписатьНачалоЭлемента("Группы");
Запись.ЗаписатьКонецЭлемента(); // Группы
КонецЕсли;
Сериализатор.Фабрика.ЗаписатьXML(Запись, ГруппаНоменклатуры);
//Элементы = Фабрика.Создать(фабрика.Пакеты[1][47]);
//Группа = Фабрика.Создать(Группы.Группа.ВладеющееСвойство.Тип, СокрЛП(ТекЭлемент.Родитель.УникальныйИдентификатор()));
//Группы.Группа.Добавить(Группа);
//ГруппаНоменклатуры2.Группы = Группы; //Несоответствие свойства и элемента данных XDTO
//ГруппаНоменклатуры2.Описание = ТекЭлемент.ПолноеНаименование();
//Сериализатор.Фабрика.ЗаписатьXML(Запись, ГруппаНоменклатуры2);
Запись.ЗаписатьКонецЭлемента(); // Группы
Запись.ЗаписатьКонецЭлемента(); // Классификатор
Запись.ЗаписатьНачалоЭлемента("Каталог");
ЗаписатьАтрибут(Запись, ОписаниеОшибокXML, "СодержитТолькоИзменения", "false");
ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "Ид", ФорматНаименованияДляXML(Новый УникальныйИдентификатор)); //УниканьныйИдентификатор
ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "ИдКлассификатора", ФорматНаименованияДляXML(ИдКлассификатора)); //УниканьныйИдентификатор
ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "Наименование", ФорматНаименованияДляXML("Каталог товаров 7 дней"));
//ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "Владелец", ФорматНаименованияДляXML("7 дней"));
Запись.ЗаписатьНачалоЭлемента("Владелец");
ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "Ид", ФорматНаименованияДляXML("3b9d2388-fdee-11e0-a341-0022153a8c09")); //УниканьныйИдентификатор
ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "Наименование", ФорматНаименованияДляXML("И**********."));
ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "ОфициальноеНаименование", ФорматНаименованияДляXML("3*****************************************************4")); //УниканьныйИдентификатор
ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "ИНН", ФорматНаименованияДляXML("3*************1"));
Запись.ЗаписатьКонецЭлемента();//Владелец
Запись.ЗаписатьНачалоЭлемента("Товары");
// Записываю товар
ТекЭлемент = Справочники.Номенклатура.НайтиПоКоду("ЦБ053035");
//В группу и в товар 1Ска пихает вот такие атрибуты:
//xmlns="cml" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
структурныйТип = Фабрика.Тип("cml", "Товар");
НоменклатураXDTO = Фабрика.Создать(структурныйТип);
ЗаполнитьЗначенияСвойств(НоменклатураXDTO, ТекЭлемент);
НоменклатураXDTO.Ид = СокрЛП(ТекЭлемент.УникальныйИдентификатор());
НоменклатураXDTO.ПолноеНаименование = ТекЭлемент.ПолноеНаименование();
Группы = Фабрика.Создать(НоменклатураXDTO.Свойства()[8].Тип);
//Элементы = Фабрика.Создать(фабрика.Пакеты[1][47]);
Ид = Фабрика.Создать(Группы.Ид.ВладеющееСвойство.Тип, СокрЛП(ТекЭлемент.Родитель.УникальныйИдентификатор()));
Группы.Ид.Добавить(Ид);
НоменклатураXDTO.Группы = Группы; //Несоответствие свойства и элемента данных XDTO лечится строкой Группы = Фабрика.Создать(НоменклатураXDTO.Свойства()[8].Тип)
Сериализатор.Фабрика.ЗаписатьXML(Запись, НоменклатураXDTO);
// Записываю товар
ТекЭлемент = Справочники.Номенклатура.НайтиПоКоду("ЦБ053033");
//xmlns="cml" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
структурныйТип = Фабрика.Тип("cml", "Товар");
НоменклатураXDTO = Фабрика.Создать(структурныйТип);
ЗаполнитьЗначенияСвойств(НоменклатураXDTO, ТекЭлемент);
НоменклатураXDTO.Ид = СокрЛП(ТекЭлемент.УникальныйИдентификатор());
НоменклатураXDTO.ПолноеНаименование = ТекЭлемент.ПолноеНаименование();
Группы = Фабрика.Создать(НоменклатураXDTO.Свойства()[8].Тип);
//Элементы = Фабрика.Создать(фабрика.Пакеты[1][47]);
Ид = Фабрика.Создать(Группы.Ид.ВладеющееСвойство.Тип, СокрЛП(ТекЭлемент.Родитель.УникальныйИдентификатор()));
Группы.Ид.Добавить(Ид);
НоменклатураXDTO.Группы = Группы; //Несоответствие свойства и элемента данных XDTO лечится строкой Группы = Фабрика.Создать(НоменклатураXDTO.Свойства()[8].Тип)
Сериализатор.Фабрика.ЗаписатьXML(Запись, НоменклатураXDTO);
Запись.ЗаписатьКонецЭлемента(); // Товары
//ЗаписатьТекстовыйУзел(Запись, ОписаниеОшибокXML, "Описание", ФорматНаименованияДляXML("Товар каталога (2 уровня группировки товаров)"));
Запись.ЗаписатьКонецЭлемента(); // Каталог
Запись.ЗаписатьКонецЭлемента(); // Коммерческая информация
Запись.Закрыть();
КонецПроцедуры