gifts2017

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

Опубликовал Сергей Космачев (ksnik) в раздел Программирование - Практика программирования

Не нашел в Интернет практически никаких исходников с сериализацией CommercML2 (вложенные рекурсивно типы объектов), чтобы выгружать товары на сайт. Вот поигрался с XDTO сам, не рубите сгоряча, надеюсь моя публикация кому-то облегчит жизнь. Если знаете как, подскажите как сделать лучше.. Из любой произвольной самопальной конфигурации 1С: Предприятия НЕ СЛОЖНО сделать выгрузку товаров на сайт, в котором уже есть импорт CommerceML2. Использовать методы XDTO проще, чем низкоуровневое программирование XML, жать только в документации и в интернете нет никаких примеров. В версии 2.1 выгружается коммерческое предложение (прайс-лист).

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 уровня группировки товаров)"));
    
    Запись.ЗаписатьКонецЭлемента(); // Каталог
    Запись.ЗаписатьКонецЭлемента(); // Коммерческая информация
    
    Запись.Закрыть();
КонецПроцедуры

 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
ksnikx21.epf
.epf 32,00Kb
30.08.12
136
.epf 32,00Kb 136 Скачать
ksnikx.zip
.zip 756,42Kb
03.07.12
87
.zip 756,42Kb 87 Скачать
ksnikx2.epf
.epf 32,00Kb
13.08.12
21
.epf 32,00Kb 21 Скачать
import.xml
.xml 101,29Kb
13.08.12
25
.xml 101,29Kb 25 Скачать
offers.xml
.xml 266,30Kb
13.08.12
27
.xml 266,30Kb 27 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Дмитрий Павлик (DimaP) 29.06.12 10:17
Товары для мужчин -> Жёлтая принцесса :D
forever-lilya; ksnik; +2 Ответить 1
2. Сергей Космачев (ksnik) 29.06.12 17:12
В моем XML только кремы, машины и хомяки из демки тестового каталога CMSки.
Пример с циклом для обхода вложенных группировок справочника Номенклатура есть на диске ИТС, но там в отличии от CommerceML ("группы" открываются плюсиком) не предусмотрена рекурсия в пакете XDTO (на пригалаемом рисунке все гладко, в "группах" плюсиков нет).
Демонстрационная конфигурация "Web-сервисы" иллюстрирует использование следующих механизмов:
определение Web-сервиса; определение схемы данных; получение описания Web-сервиса; динамическое создание прокси Web-сервиса; статическое создание прокси Web-сервиса на основе WS-ссылки; вызов операции Web-сервиса;
работу с объектами передачи данных (XDTO). http://v8.1c.ru/metod/Methodical_DemoConf.htm
////////////////////////////////////////////////////////////////////////////////
// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ
// 

// Выдает данные номенклатуры
//
// Возвращаемое значение:
//   XDTOОбъектДанных - данные номенклатуры. Объект содержит список всех корневых элементов
//   (которые, в свою очередь, содержат вложенные элементы)
Функция ПолучитьДанныеНоменклатуры() Экспорт
	Перем Родитель;
	
	НоменклатураТип = ФабрикаXDTO.Тип("http://www.1c.ru/demos/products", "Номенклатура");
	НоменклатураГруппаТип = ФабрикаXDTO.Тип("http://www.1c.ru/demos/products", "НоменклатураГруппа");
	
	КорневаяГруппа = ФабрикаXDTO.Создать(НоменклатураГруппаТип);
	КорневаяГруппа.Наименование = "Корневая";

	xdtoРодитель = КорневаяГруппа;
	
	Выборка = Справочники.Номенклатура.ВыбратьИерархически();
	Пока Выборка.Следующий() Цикл
		
		Если Родитель <> Неопределено И Выборка.Родитель.Код <> Родитель.Код Тогда
			Пока Родитель.ЭтоГруппа И Выборка.Родитель.Код <> Родитель.Код Цикл
				Родитель = Родитель.Родитель;
				xdtoРодитель = xdtoРодитель.Владелец();
			КонецЦикла;	
		КонецЕсли;

		Если Выборка.ЭтоГруппа Тогда
			Группа = ФабрикаXDTO.Создать(НоменклатураГруппаТип);
			Группа.Наименование = Выборка.Наименование;
			
			xdtoРодитель.Группы.Добавить(Группа);
			xdtoРодитель = Группа;
			Родитель = Выборка.Ссылка;
		Иначе
			Номенклатура = ФабрикаXDTO.Создать(НоменклатураТип);
			Номенклатура.Наименование = Выборка.Наименование;
			Номенклатура.ЗакупочнаяЦена = Выборка.ЗакупочнаяЦена;
			
			ЗначениеКартинки = Выборка.Картинка.Получить();
			Если ЗначениеКартинки <> Неопределено Тогда
				Номенклатура.Картинка = ЗначениеКартинки.ПолучитьДвоичныеДанные();
			КонецЕсли;
				
			Номенклатура.ПолноеНаименование = Выборка.ПолноеНаименование;
			Номенклатура.ШтрихКод = Выборка.ШтрихКод;
			
    		xdtoРодитель.Элементы.Добавить(Номенклатура);
		КонецЕсли;	
	КонецЦикла;
	
	Возврат КорневаяГруппа;
КонецФункции
...Показать Скрыть
Прикрепленные файлы:
forever-lilya; +1 Ответить 1
3. Сергей Космачев (ksnik) 03.07.12 06:20
Забыл сказать - в своей разработке CommerceML2 своими руками из любой конфигурации (для сайта) версия 2. я использовал фрагменты общего модуля из типовой конфигурации "Управление торговлей":
Функция ФорматДатыДляXML
Функция ФорматНаименованияДляXML
Процедура ЗаписатьТекстовыйУзел
ПолучитьСтрокуЗаписиДляXML
Функция ПодставитьПараметрыВСтроку
Процедура ДобавитьОписаниеОшибки
Процедура ЗаписатьАтрибут
forever-lilya; +1 Ответить
4. Модератор раздела Артур Аюханов (artbear) 03.07.12 16:57
Тема интересная.
описано только создание данных по схеме CommerceML2
а чтение каким образом выполнять?
5. Сергей Космачев (ksnik) 03.07.12 21:13
(4) artbear, это выгрузка для сайта и обусловлена она требованиями компаний, специализирующихся на веб-дизайне. Чтение данных CommerceML в произвольной конфигурации подскажите, зачем Вам понадобилось, в чем заключается специфика задачи, почему для этой цели не пригодились более изъезженные способы, как xml, xls, txt, ...?
6. Сергей Космачев (ksnik) 04.07.12 06:05
(4) artbear, если в произвольной конфигурации (например в обменной для сайта) создать объекты, которые будут называться идентично объектам схемы CommerceML, тогда программирование взаимодействия благодаря функции XDTO "заполнить..." во много раз упростится.
7. Модератор раздела Артур Аюханов (artbear) 04.07.12 10:23
(5) Пример - на сайте поставщика продукции ведется учет отгрузки дистрибьютору продукции, можно выгрузить данные об отгрузках продукции, данные выгружаются как раз в CommerceML
Вопрос: как загрузить данные в 1С по такому формату?
8. Сергей Космачев (ksnik) 04.07.12 13:46
(7) artbear, советую создать конфигурацию для обмена, а в ней у объектов поля идентичные схеме CommerceML. Тогда можно будет автоматически перезаполнить (методом ЗаполнитьЗначенияСвойств(ГруппаНоменклатуры, ТекЭлемент))
Я это делать сейчас не буду, но актуально, если и придется - то сперва так. А из 1С в 1С уже легкими методами. Пока решаю задачу загрузки правильных наименований товара с сайта http://gs46.gs1ru.org/GEPIR31/process?p=gtin&lng=ru>in=4607175850315&mode=party&protolog=on через гребанный soap. Давайте работать вместе.
forever-lilya; +1 Ответить 1
9. EfiopReal (Созинов) 05.07.12 20:23
Спасибо за статью, как раз во время попалась на глаза, поскольку необходимо решать подобную задачу.
В статье только код бы оформить, а так +. Спасибо.
forever-lilya; +1 Ответить 1
10. Сергей Космачев (ksnik) 05.07.12 20:28
(9) EfiopReal, это тема не закрытая, доделывайте, делитесь, а я ошибок пока на ооочень больших выборках данных не выявил, это тоже важное обстоятельство.
forever-lilya; +1 Ответить
11. Дарья Пронина (forever-lilya) 08.08.12 11:54
Здраствуйте. Кто-нибудь уже пользовался обработкой?
12. Дарья Пронина (forever-lilya) 08.08.12 11:59
Автор, можно мануал для пользователя-не программиста по использованию вашей обработки. Вот ошибочка выскочила, ка крешить?
Запускаю обработку, выбираю в поле ссылку либо на элемент, либо на группу номенклатуры.

{Форма.Форма2.Форма(2222)}: Ошибка при вызове метода контекста (Создать)
КорневаяГруппа = Фабрика.Создать(НоменклатураГруппаТип);
по причине:
Несоответствие типов (параметр номер '1')
13. Сергей Космачев (ksnik) 08.08.12 20:33
(12) forever-lilya, у нас платформа 8.2, но конфа еще от 8.0
У Вас какие версии платформы и конфигурации?
Вы не забыли загрузить в конфигурацию прилагающийся xdto пакет из архива разработки cml?
Можете вырезать мне и прислать свой справочник номенклатуры (то есть для этой обработки требуется в конфе справочник "Номенклатура" и мой xdto пакет "cml"), я посмотрю почему у Вас не работает?
forever-lilya; +1 Ответить
14. Дарья Пронина (forever-lilya) 09.08.12 08:18
1С:Предприятие 8.2 (8.2.15.318)

При загрузке xdto пакета вылетает ошибка
http://s2.hostingkartinok.com/uploads/images/2012/08/7f398120191da6f7a89507e158840865.png
15. Дарья Пронина (forever-lilya) 09.08.12 08:19
помогите, пожалуйста решить проблему
16. Сергей Космачев (ksnik) 09.08.12 09:20
(15) forever-lilya, только что выгрузил пакет еще раз для Вас, попробуйте вот этот http://zalil.ru/33659346
forever-lilya; +1 Ответить
17. Сергей Космачев (ksnik) 09.08.12 09:22
(15) forever-lilya, Да, я забыл, если не загрузится - откройте его текстовым редактором (например akelpad) - в конце файла мусор 1Совский удалите.
forever-lilya; +1 Ответить
18. Алекс Ю (AlexO) 09.08.12 09:55
(8) ksnik,
(4) artbear,
а чтение каким образом выполнять?

мне вот тоже интересно :)
советую создать конфигурацию для обмена, а в ней у объектов поля идентичные схеме CommerceML. Тогда можно будет автоматически перезаполнить (методом ЗаполнитьЗначенияСвойств(ГруппаНоменклатуры, ТекЭлемент))

это как так - еще дополнительную конфу делать? А потом перегружать туда-сюда?
И оформите код в статье - а то читать сложно.
forever-lilya; +1 Ответить 1
19. Сергей Космачев (ksnik) 09.08.12 11:25
(18) AlexO, зщадача выполнять чтение интересная, но пока второстепенная.
Гораздо более важно актуализировать наименования товаров через глобальные базы артикулов и штрихкодов, работа существенно ускорится, если у Вас есть предложения в этом направлении?

> дополнительную конфу делать? А потом перегружать туда-сюда?
Вероятно так и буду делать, если Вы не подскажете другие примеры.
Если эта тема Вам интересна, может погуглите и у знакомых поспрашиваете и сюда напишете?
forever-lilya; +1 Ответить 1
20. Дарья Пронина (forever-lilya) 09.08.12 11:36
21. Алекс Ю (AlexO) 09.08.12 12:50
(19) ksnik,
актуализировать наименования товаров через глобальные базы артикулов и штрихкодов

кто ж вас знает, что у вас там за глобальные базы... выгружайте в txt из них, и сравнивайте :)
подскажете другие примеры

напишите парсер выгрузки в CML, а потом загрузки в 1С.
В этом и проблема, что нужны инструменты под определенный формат, и создавать их только вручную можно.
forever-lilya; +1 Ответить
22. Сергей Космачев (ksnik) 09.08.12 13:26
> кто ж вас знает, что у вас там за глобальные базы...
Как раз загвоздка в том, что база gepir хоть и очень качествеенная, но в ней очень мало товаров.
Иногда яндекс.маркет дает лучшие результаты.
О том и вопрос, где брать наименования товаров (желательно от поставщиков), чтоб не было слишком трудоемко??

А Вы что еще видели или делали в этом направлении?
forever-lilya; +1 Ответить 1
23. Дарья Пронина (forever-lilya) 10.08.12 16:43
Здраствуйте! Помогите, пожалуйста. В вашей обработке я выбираю одну группу номенклатуры, а в итоге в файл XDTOSample24.xml записываются все группы и подгруппы, даже те, которых не выбирала. Не могу разобраться...
Прикрепленные файлы:
24. Дарья Пронина (forever-lilya) 13.08.12 09:42
Кто-нибудь пользовался обработкой? У кого работает правильно? У кого правильно выгружаются группы в иерархие?
25. Яков Коган (Yashazz) 13.08.12 12:55
Люди добрые, а знает кто-нибудь, где взять правильный формат xml-файлов обмена для Битрикс? Надоело в угадайку играть. То иерархию не читает, то ещё что. Есть ли описание или xsd-схема для классического обмена с Битрикс?
Плизз!

пы.сы. очень неохота гонять выгрузку из УТ и смотреть, как да что она сделала...
forever-lilya; +1 Ответить 1
26. Дарья Пронина (forever-lilya) 13.08.12 15:22
Не правильно выстраивается иерархия номенклатуры, проблемка, как решить?
27. Сергей Космачев (ksnik) 13.08.12 20:41
(23) forever-lilya, извините пожалуйста что только заметил Вашу запись с рисунком и что не вникаю глубоко, не могли бы Вы сказать, что именно неправильно выстраивается? Как должно быть то? У меня примерно такая же картинка (только товары другие), моя cms-ка глатает на-ура, только вот у меня сейчас совсем другая структура выгрузки, которая не совпадает с иерархией справочника Номенклатура - по бухгалтерским группам, но проблем к каталогом (витриной) нет. Когда я затачивал под другой справочник запрос получился с соединением и код обработки тоже поправлял. Вот новый запрос по группам:

ВЫБРАТЬ
NULL КАК Поле8,
NULL КАК Поле7,
NULL КАК Поле6,
NULL КАК Поле5,
NULL КАК Поле4,
NULL КАК Поле3,
NULL КАК Поле2,
ВложенныйЗапрос.Ссылка КАК Родитель,
НоменклатурныеГруппы.Ссылка КАК Ссылка
ИЗ
(ВЫБРАТЬ
ВЫБОР
КОГДА НоменклатурныеГруппы.Родитель = &ПустойРодитель
ТОГДА НоменклатурныеГруппы.Наименование
ИНАЧЕ ВЫБОР
КОГДА НоменклатурныеГруппы.Родитель.Родитель = &ПустойРодитель
ТОГДА НоменклатурныеГруппы.Родитель.Наименование
КОНЕЦ
КОНЕЦ КАК ВверхнееНаименование,
НоменклатурныеГруппы.Ссылка КАК Ссылка,
ВЫБОР
КОГДА НоменклатурныеГруппы.Родитель = &ПустойРодитель
ТОГДА &ПустойРодитель
ИНАЧЕ НоменклатурныеГруппы.Родитель
КОНЕЦ КАК Поле1,
ВЫБОР
КОГДА НоменклатурныеГруппы.Родитель = &ПустойРодитель
ТОГДА &ПустойРодитель
ИНАЧЕ ВЫБОР
КОГДА НоменклатурныеГруппы.Родитель.Родитель = &ПустойРодитель
ТОГДА &ПустойРодитель
ИНАЧЕ НоменклатурныеГруппы.Родитель.Родитель.Ссылка
КОНЕЦ
КОНЕЦ КАК Поле2
ИЗ
Справочник.НоменклатурныеГруппы КАК НоменклатурныеГруппы
ГДЕ
НоменклатурныеГруппы.ЭтоГруппа = ИСТИНА
И НЕ НоменклатурныеГруппы.Код = " "
И НЕ НоменклатурныеГруппы.Код = "1 "
И НЕ НоменклатурныеГруппы.Наименование ПОДОБНО "%енужн%"
И НоменклатурныеГруппы.Родитель = &ПустойРодитель

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
ВЫБОР
КОГДА Номенклатура.Родитель = &ПустойРодитель
ТОГДА Номенклатура.Наименование
ИНАЧЕ ВЫБОР
КОГДА Номенклатура.Родитель.Родитель = &ПустойРодитель
ТОГДА Номенклатура.Родитель.Наименование
КОНЕЦ
КОНЕЦ,
Номенклатура.Ссылка,
ВЫБОР
КОГДА Номенклатура.Родитель = &ПустойРодитель
ТОГДА &ПустойРодитель
ИНАЧЕ Номенклатура.Родитель
КОНЕЦ,
NULL
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ИСТИНА
И НЕ Номенклатура.Код = " "
И НЕ Номенклатура.Код = "1 "
И НЕ Номенклатура.Наименование ПОДОБНО "%енужн%"
И ВЫБОР
КОГДА Номенклатура.Родитель.Родитель = &ПустойРодитель
И НЕ(Номенклатура.Родитель.Код = "1 "
ИЛИ Номенклатура.Родитель.Код = " ")
ТОГДА ИСТИНА
КОНЕЦ
И НЕ Номенклатура.Родитель.Наименование ПОДОБНО "%енужн%") КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.НоменклатурныеГруппы КАК НоменклатурныеГруппы
ПО ВложенныйЗапрос.Ссылка = НоменклатурныеГруппы.Родитель
ГДЕ
НЕ ВложенныйЗапрос.ВверхнееНаименование ПОДОБНО "%енужн%"
И НЕ НоменклатурныеГруппы.Ссылка = &ПустойРодитель
forever-lilya; +1 Ответить
28. Сергей Космачев (ksnik) 13.08.12 20:45
Вот изменения обработки результата запроса:


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

Фабрика = Фабрика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(Запись, КорневаяГруппа);
Запись.ЗаписатьКонецЭлемента(); // Группы
Запись.ЗаписатьКонецЭлемента(); // Классификатор
Запись.ЗаписатьНачалоЭлемента("Каталог");
forever-lilya; +1 Ответить
29. Сергей Космачев (ksnik) 13.08.12 20:49
Ну и прилагаю к обработке еще один файл - новую версию. Сейчас Юрий Пермитин дал мне свой парсер яндекс.маркета и работа кипит, скоро будет готовый варант упорядочивания наименований номенклатуры и вариант загрузки картинок! Присоединяйтесь пожалуйста к обмену опытом! Самое нужное сейчас на данном этапе работы - доступ в gepir, если есть идеи или сведения пожалуйста поделитесь!!! Ребята из gepir-а не отвечают на е-мейл.
forever-lilya; +1 Ответить
30. Сергей Космачев (ksnik) 13.08.12 20:51
(25) Yashazz, Битрикса полно в интернете, он кстати немного не стандартный, впрочем как и в umi-cms тоже с точностью соответствия cml2 не загонялись, но я к сожалению далек об Битрикса, хотя могу скинуть красивые примеры cml2 из комплекта поставки umi (они приведены во вложении в эту обработку).
forever-lilya; +1 Ответить 1
31. Сергей Космачев (ksnik) 13.08.12 22:19
(23) forever-lilya, отвечаю на
>в итоге в файл XDTOSample24.xml записываются все группы и подгруппы, даже те, которых не выбирала. Не могу разобраться...


cml2 пакет, который формируется такими обработками, состоит из 2х частей - (1) классификатор (типы данных) и (2) каталог товаров (экземпляры типа). Классификатор (состоящий из групп номенклатуры) это заготовки шаблонов данных для разных товарных категорий интернет-магазина или сайта-витрины. Он невидимый визуально, это как классы объектов в объектной модели. Полностью грузится чтобы проверить работу механизма обмена данными. Если мешают на сайте лишние типы данных и хотите обрезать классификатор, это тоже возможно, скачайте консоль запросов, скопируйте в нее самый первый текст запроса (не забудьте заполнить параметры запроса) и добавьте такое условие, какое хотите. Например как во втором запросе, если хотите не список значений а одну группу, можно настроить условие не "в списке" а просто "в иерархии". Пробуйте, это пригодится! Или шлите мне справочник. А здесь, на форуме, развивать эту тему не нужно - такие детальные подробности мало кого заинтересуют.
forever-lilya; +1 Ответить
32. Яков Коган (Yashazz) 13.08.12 23:18
(30) К сожалению, нифига в интернетах по Битриксу нет. Есть куча руководств для типовых 1С, а вот нормального описания формата, т.е. порядка, состава и смысла тегов в xml-файле (не говоря уж о полноценной схеме) - нету. Не знаю, где и искать... Спасибо на добром слове.
ShantinTD; forever-lilya; +2 Ответить 1
33. Сергей Космачев (ksnik) 13.08.12 23:25
(32) Yashazz, А в группе http://infostart.ru/community/groups/622/ разве нету? тогда создайте тему поиска, будем искать вместе! Не могу полностью согласиться с Вашим не достаточно задорным настроением, считаю что формат красивый и прозрачный, я бы зарегистрирровался на тематических форумах по битриксу и попросил у их пользователей файлы примеров.
forever-lilya; +1 Ответить 1
34. Дарья Пронина (forever-lilya) 14.08.12 09:07
35. Алекс Ю (AlexO) 14.08.12 12:50
(22) ksnik,
А Вы что еще видели или делали в этом направлении?

я немного с другой стороны в этом вопросе - со стороны обменом между конфигурациями в том числе и по форматам XML.
Т.е. у меня нет схем XML (CML и прочих) именно от какой-то конкретной реализации.
(33) ksnik,
я бы зарегистрирровался на тематических форумах по битриксу и попросил у их пользователей файлы примеров

как я помню - там все жадные (деньги же платили!), да и формат выгрузки периодически меняется...
Но по Битрикс я тоже не встречал никакой доументации по обмену, тем более - на уровне форматов.
36. Сергей Космачев (ksnik) 14.08.12 16:15
(35) AlexO, кажется если открыть файл выгрузки из 1С в Битрикс в формате cml2 через текстовый редактор (например acelpad) все сразу становится понятно, или нет? Yt gjvy.? Не помню, пробовал ли я тогда гуглить по названиям узлов, но вот сейчас понравилась статейка про DOM http://www.structuralist.narod.ru/it/internet/dom.htm
Навигационные атрибуты объекта Node
Атрибут Описание
firstChild Возвращает первый узел-потомок
lastChild Возвращает последний узел-потомок
previousSibling Возвращает предыдущий соседний узел, имеющий с текущим одного родителя
nextSibling Возвращает следующий соседний узел, имеющий с текущим одного родителя
parentNode Возвращает родительский узел
ownerDocument Возвращает корневой узел документа, содержащий текущей узел
nodeName Возвращает имя узла
nodeValue Возвращает значение узла в текстовом формате
nodeType Возвращает тип узла в виде числа
forever-lilya; +1 Ответить 1
37. Алекс Ю (AlexO) 14.08.12 16:43
(36) ksnik,
кажется если открыть файл выгрузки из 1С в Битрикс в формате cml2

т.е. по оброненной булавке вы, как А.Кристи, делаете, вывод, что это булавка соседки-швеи, и именно она - убийца? :D
Может, это типичный файл, а может - зависит от условий выгрузки. Спорить не буду, не знаю :)
Но вот, например, если вы будете судить о форматах выгрузки в другие Банки - по выгрузке из 1С в какой-нибудь СберБанк (как самую распространенно-встречающуюся), то ждет вас разочарование и уныние.
Хотя там вообще - сплошной текст без намека на XML :)
forever-lilya; +1 Ответить 1
38. Яков Коган (Yashazz) 14.08.12 22:37
(35) (37) Именно такая фигня. Никто ничего не знает или делает вид. А изучать файл - можно, конечно, но совершенно верно замечено, файл может здорово зависеть от условий выгрузки, тут целое исследование затевать надо.
forever-lilya; +1 Ответить 2
39. Сергей Космачев (ksnik) 06.09.12 02:09
В версии 2 потеряна некоторая доля универсальности. Это связано с тем, что запрос по номенклатуре, соединенный с номенклатурными группами бухгалтерии (который появился в версии 2) может оказаться не совместимым с произвольной конфигурацией. То есть если у Вас с помощью моей обработки не получается формирование классификатора (версии 2), тогда можно скачать версию 1 (она не удалена а прикреплена во вложенных файлах) и посмотреть текст запроса по номенклатуре в ней. Размет текста запроса очень большой, сюда вставить увы нереально.
40. Женя Ткаченко (zhenyat) 10.09.12 16:06
(38) Yashazz, 1с:Предприятие 8 - Стандарты и форматы - достаточно подробное описание, я основываясь на этих статьях и на примерах файлов из них, с нуля написала свою обработку для обмена заказной конфигурации на 1с v7.7 с магазином на битриксе
41. Сергей Космачев (ksnik) 10.09.12 18:03
42. Андрей Довбенко (savvato) 17.09.12 11:56
выгружает ли обработка каталог и предложения с учетом характеристик номенклатуры? Посмотрел код не увидел.Просьба не пинать...
43. Сергей Космачев (ksnik) 17.09.12 13:43
(42) savvato, выгружается только штрихкод товара (в коммерческом предложении). Характеристика должна быть создана в пакете XDTO (найдите в нем "Товар") Характеристики как правило выгружаются в каталоге, примерно после этих строчек (по аналогии с данным фрагментом, ПолноеНаименование - характеристика):
Номенклатура = Фабрика.Создать(НоменклатураТип);
//ЗаполнитьЗначенияСвойств(Номенклатура, ТекСтр.Ссылка);
Номенклатура.Ид = СокрЛП(ТекСтр.Ссылка.УникальныйИдентификатор());
Если СтрДлина(СокрЛП(ТекСтр.НаименованиеПолное)) < 10 Тогда
Номенклатура.ПолноеНаименование = ТекСтр.СовсемПолное;
Иначе
Номенклатура.ПолноеНаименование = ТекСтр.НаименованиеПолное;
КонецЕсли;
Прикрепленные файлы:
44. Андрей Довбенко (savvato) 17.09.12 14:18
а в ofers.xml в таком случае попадут остатки? С учетом характеристик номенклатуры? У меня в каталоге к примеру есть товар:рубашка. И ведеться учет по характеристикам :размер и цвет. Естественно разные остатки в зависимости от характеристик. Заранее спасибо за ответ, от меня Вам огромный жирный +. Тема очень актуальна для меня. Не очень сильно дружу с программированием в 1С, поэтому прошу ткнуть носом, как говориться...
45. Сергей Космачев (ksnik) 17.09.12 14:35
(44) savvato, в import.xml - основная информация (то есть то, что занимает большой объем и относительно редко меняется) через классификатор групп номенклатуры (в umi.cms это типы данных) и каталог (непосредственно товары с прицепленными идентификаторами групп и свойствами), в offers.xml - то, что грузить нужно чаще, например цены и остатки. В Вашем случае характеристики размер и цвет я бы добавил в реквизиты классификатора (в umi.cms эти поля автоматически добавятся на сайт), а значения заполнения этих реквизитов присвоить можно в каталоге по аналогии с "полным наименованием", как я уже привел пример в прошлом фрагменте. Я пока сам пока еще не занимался учетом в разрезе характеристик, думаю что это зависит от интернет магазина. Мне кажется, в простейшем случае чтобы остатки учитывались точно, нужно делать копии отдельного товара на каждое значение зхарактеристики, а свойства - только для информации (для показа на сайте и не более).
Извините что не достаточно универсальный ответ, в основном пишу о том, как работало у меня.
46. Андрей Довбенко (savvato) 18.09.12 14:47
{Форма.Форма2.Форма(2222)}: Ошибка при вызове метода контекста (Создать)
КорневаяГруппа = Фабрика.Создать(НоменклатураГруппаТип);
по причине:
Несоответствие типов (параметр номер '1')


вылетела такая же ошибка как и тут, только
Форма.Форма2.Форма(324)}


1С:Предприятие 8.2 (8.2.15.318) Конфигурация "Розница"
cml пакет добавил в конфу
47. Сергей Космачев (ksnik) 18.09.12 20:38
(46) savvato, чего-то ничего в голову не приходит, вот скриншот. Помогло?
Прикрепленные файлы:
48. Андрей Довбенко (savvato) 18.09.12 23:07
{Форма.Форма2.Форма(2727)}: Ошибка при вызове метода контекста (Выполнить)
	РезТаб = Запрос.Выполнить().Выгрузить();
по причине:
{(16, 17)}: Поле не найдено "Номенклатура.ГруппаДляБухгалтерии"
Номенклатура.<<?>>ГруппаДляБухгалтерии КАК ГруппаДляБухгалтерии
...Показать Скрыть

помогло, сенкс, но вылезла след. ошибка, привел выше. Просьба не пинать, оч. заинтересоан в Вашей обработке.
49. Сергей Космачев (ksnik) 19.09.12 10:58
(48) savvato, об этом уже написано выше, если у Вас нет справочника номенклатурных групп, тогда Вам не удастся использовать их для вывода на сайт. Пользуйтесь запросом из первой версии обработки и внимательнее читайте комментарии к публикации.
50. Андрей Довбенко (savvato) 24.09.12 16:03
Справочник номенклатурных групп есть .
Привел переменные в соответствие со своей конфой:
ГруппаДляБухгалтерии -> НоменклатурнаяГруппа
ОстаткиТоваровКомпании -> ТоварыНаСкладах
Теперь вывалилась ошибка в запросе

{Форма.Форма2(2726)}: Ошибка при вызове метода контекста (Выполнить): {(4, 48)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
 неограниченной длины и поля несовместимых типов.
КОГДА Номенклатура.Ссылка.НаименованиеПолное <<?>>= NULL
	РезТаб = Запрос.Выполнить().Выгрузить();
по причине:
{(4, 48)}: Неверные параметры в операции сравнения. Нельзя сравнивать поля
 неограниченной длины и поля несовместимых типов.
КОГДА Номенклатура.Ссылка.НаименованиеПолное <<?>>= NULL
...Показать Скрыть

Куда ковырнуть?
51. Сергей Космачев (ksnik) 24.09.12 16:21
(50) savvato, а консоль запросов не пробовали запускать?
52. Андрей Довбенко (savvato) 24.09.12 16:27
Запускаю конструктор запросов
получаю вылет, или конструктор это не консоль?
53. Сергей Космачев (ksnik) 24.09.12 16:35
(51) savvato, текст запроса не соответствует Вашему дереву конфигурации. Попробуйте подогнать не текст запроса а создайте копию базы и попробуйте подогнать дерево конфигурации, может разберетесь. А еще лучше потренироваться на кошках, на чем-нить меньшего размера, чем мое двухкилометровое чудо. Строковой реквизит полное наименование хоть есть?
54. Сергей Космачев (ksnik) 24.09.12 16:41
А еще можно погуглить, скопируйте текст ошибки в поиск и увидите что можно попробовать сделать.
55. Андрей Довбенко (savvato) 24.09.12 16:43
Строковый реквизит НименованиеПолное есть. С конфой играться нет возможности, так как в ней уже ведеться учет. Может еще какие нибудь мысли есть?
56. Сергей Космачев (ksnik) 24.09.12 19:04
(55) savvato, попробуйте сравнивать допустимые типы, попробуйте функцию ЕстьNull или уберите null, разберитесь почему там написано такое условие. Или возьмите запрос из первой версии обработки и не парьтесь. Адаптация к конфигурации второй версии требует минимум профессиональных знаний, а Ваши вопросы показывают, что у Вас их нет и желания разобраться тоже нет. Сообщение об ошибке натыкать не потрудились? Консоль запросов открыть и фрагмент запроса в ней запустить не потрудились? Я не могу сейчас заниматься с розницей. Писать в эту тему такие вопросы пожалуйста больше не нужно, задавайте их лучше в форумах по программированию, ато я буду ставить за них минусы.
57. Яков Коган (Yashazz) 27.11.12 14:14
Коллеги, подытожу: не связывайтесь с битриксоидами-самопальщиками. В моём случае всё кончилось большими удивлёнными глазами, когда я сообщил, что вообще-то ни в одном стандарте ОЭИ, в т.ч. CML, нет таких тегов, как BolshayaKartinka, и что телепатически угадать наличие подобных тегов в своей выгрузке я не сумел не потому, что полный ламер. И ещё позабавил постоянный рефрен "Ну типовая 1С ведь всё выгружает!". Ужосъ.
58. margo2007 (margo2007) 06.12.12 16:15
1. Файл cml не загружается, т.к. в конце файла записаны какие-то "левые" символы. Поэтому у 14 forever-lilya выходила ошибка.

2.При редактировании в блокноте теряется кодировка UTF-8, надо убирать эти символы в другом редакторе, в Word получается. (Это для тех, кто захочет исправить. А то Вы будете злиться и нормально не объясните.)

3. Обработка под именем "Космачев" в рознице что-то формирует, по крайней мере ошибка не вылетает. Могли бы и ответить (55) savvato,
59. Виктор Виктор (holostyak) 01.10.13 15:29
Судя по комментам - одна головная боль с этой обработкой...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа