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

30.08.12

Интеграция - Сайты и интернет-магазины

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ksnikx21.epf
.epf 32,00Kb
160
160 Скачать (1 SM) Купить за 1 850 руб.
ksnikx.zip
.zip 756,42Kb
88
88 Скачать (1 SM) Купить за 1 850 руб.
ksnikx2.epf
.epf 32,00Kb
23
23 Скачать (1 SM) Купить за 1 850 руб.
import.xml
.xml 101,29Kb
28
28 Скачать (1 SM) Купить за 1 850 руб.
offers.xml
.xml 266,30Kb
28
28 Скачать (1 SM) Купить за 1 850 руб.

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

 

См. также

Сайты и интернет-магазины Платформа 1С v8.3 1С:Розница 2 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 2.3. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку. Поддерживает работу от разных юридических лиц. Работа: в составе РИБ, отдельно от РИБ, тонкий, толстый клиент, web-клиент (через интернет-браузер).

22440 руб.

19.12.2023    5172    38    11    

35

Сайты и интернет-магазины WEB-интеграция Системный администратор Программист Пользователь Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме.

36000 руб.

03.08.2020    17820    19    22    

17

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс 24. Разработка имеет двухстороннюю синхронизацию 1С и Bitrix24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (платформа начиная с 8.3.23). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

7200 руб.

04.05.2021    19915    13    17    

17

СБП. Оплата по QR-коду Сайты и интернет-магазины Программист Платформа 1С v8.3 Конфигурации 1cv8 Автомобили, автосервисы Россия Бухгалтерский учет Управленческий учет Платные (руб)

В настоящее время система СБП очень часто стала использоваться в повседневной жизни. Одна из систем интеграции СБП через СБЕР. Данная конфигурация является инструментом интеграции СБП в Альфа Авто. Данная система не просто формирует статический QR, а динамический, а значит, в системе будет привязка и на покупателя, и на документ.

7200 руб.

25.10.2022    6336    32    4    

10

Сайты и интернет-магазины Программист Бизнес-аналитик Пользователь Платформа 1С v8.3 Конфигурации 1cv8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Управленческий учет Платные (руб)

Программа позволяет одним кликом настроить сбор цен ваших конкурентов или дилеров в интернете. Автоматически собирает данные результата поиска Яндекса (вам не придется вручную добавлять каждый сайт, за которым нужно следить). Обновление цен происходит по заданному вами расписанию автоматически. Можете легко отслеживать позиции вашего сайта в Яндексе по ключевым словам и фразам. Этот инструмент даст вам лучшее понимание того, как ваша SEO-стратегия влияет на видимость вашего сайта в поисковой выдаче, и поможет вам улучшить контент и структуру сайта для повышения его позиций. Функция доступна во всех тарифах.

19950 руб.

23.09.2019    31047    7    12    

30
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DimaP 64 29.06.12 10:17 Сейчас в теме
Товары для мужчин -> Жёлтая принцесса :D
forever-lilya; ksnik; +2 Ответить
2. ksnik 593 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 Ответить
3. ksnik 593 03.07.12 06:20 Сейчас в теме
Забыл сказать - в своей разработке CommerceML2 своими руками из любой конфигурации (для сайта) версия 2. я использовал фрагменты общего модуля из типовой конфигурации "Управление торговлей":
Функция ФорматДатыДляXML
Функция ФорматНаименованияДляXML
Процедура ЗаписатьТекстовыйУзел
ПолучитьСтрокуЗаписиДляXML
Функция ПодставитьПараметрыВСтроку
Процедура ДобавитьОписаниеОшибки
Процедура ЗаписатьАтрибут
forever-lilya; +1 Ответить
4. Модератор раздела 03.07.12 16:57 Сейчас в теме
Тема интересная.
описано только создание данных по схеме CommerceML2
а чтение каким образом выполнять?
5. ksnik 593 03.07.12 21:13 Сейчас в теме
(4) artbear, это выгрузка для сайта и обусловлена она требованиями компаний, специализирующихся на веб-дизайне. Чтение данных CommerceML в произвольной конфигурации подскажите, зачем Вам понадобилось, в чем заключается специфика задачи, почему для этой цели не пригодились более изъезженные способы, как xml, xls, txt, ...?
7. Модератор раздела 04.07.12 10:23 Сейчас в теме
(5) Пример - на сайте поставщика продукции ведется учет отгрузки дистрибьютору продукции, можно выгрузить данные об отгрузках продукции, данные выгружаются как раз в CommerceML
Вопрос: как загрузить данные в 1С по такому формату?
8. ksnik 593 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 Ответить
18. AlexO 135 09.08.12 09:55 Сейчас в теме
(8)
(4) artbear,
а чтение каким образом выполнять?

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

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

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

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

напишите парсер выгрузки в CML, а потом загрузки в 1С.
В этом и проблема, что нужны инструменты под определенный формат, и создавать их только вручную можно.
forever-lilya; +1 Ответить
6. ksnik 593 04.07.12 06:05 Сейчас в теме
(4) artbear, если в произвольной конфигурации (например в обменной для сайта) создать объекты, которые будут называться идентично объектам схемы CommerceML, тогда программирование взаимодействия благодаря функции XDTO "заполнить..." во много раз упростится.
9. Созинов 05.07.12 20:23 Сейчас в теме
Спасибо за статью, как раз во время попалась на глаза, поскольку необходимо решать подобную задачу.
В статье только код бы оформить, а так +. Спасибо.
forever-lilya; +1 Ответить
10. ksnik 593 05.07.12 20:28 Сейчас в теме
(9) EfiopReal, это тема не закрытая, доделывайте, делитесь, а я ошибок пока на ооочень больших выборках данных не выявил, это тоже важное обстоятельство.
forever-lilya; +1 Ответить
11. forever-lilya 5 08.08.12 11:54 Сейчас в теме
Здраствуйте. Кто-нибудь уже пользовался обработкой?
12. forever-lilya 5 08.08.12 11:59 Сейчас в теме
Автор, можно мануал для пользователя-не программиста по использованию вашей обработки. Вот ошибочка выскочила, ка крешить?
Запускаю обработку, выбираю в поле ссылку либо на элемент, либо на группу номенклатуры.

{Форма.Форма2.Форма(2222)}: Ошибка при вызове метода контекста (Создать)
КорневаяГруппа = Фабрика.Создать(НоменклатураГруппаТип);
по причине:
Несоответствие типов (параметр номер '1')
13. ksnik 593 08.08.12 20:33 Сейчас в теме
(12) forever-lilya, у нас платформа 8.2, но конфа еще от 8.0
У Вас какие версии платформы и конфигурации?
Вы не забыли загрузить в конфигурацию прилагающийся xdto пакет из архива разработки cml?
Можете вырезать мне и прислать свой справочник номенклатуры (то есть для этой обработки требуется в конфе справочник "Номенклатура" и мой xdto пакет "cml"), я посмотрю почему у Вас не работает?
forever-lilya; +1 Ответить
14. forever-lilya 5 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 5 09.08.12 08:19 Сейчас в теме
помогите, пожалуйста решить проблему
16. ksnik 593 09.08.12 09:20 Сейчас в теме
(15) forever-lilya, только что выгрузил пакет еще раз для Вас, попробуйте вот этот http://zalil.ru/33659346
forever-lilya; +1 Ответить
17. ksnik 593 09.08.12 09:22 Сейчас в теме
(15) forever-lilya, Да, я забыл, если не загрузится - откройте его текстовым редактором (например akelpad) - в конце файла мусор 1Совский удалите.
forever-lilya; +1 Ответить
20. forever-lilya 5 09.08.12 11:36 Сейчас в теме
22. ksnik 593 09.08.12 13:26 Сейчас в теме
> кто ж вас знает, что у вас там за глобальные базы...
Как раз загвоздка в том, что база gepir хоть и очень качествеенная, но в ней очень мало товаров.
Иногда яндекс.маркет дает лучшие результаты.
О том и вопрос, где брать наименования товаров (желательно от поставщиков), чтоб не было слишком трудоемко??

А Вы что еще видели или делали в этом направлении?
forever-lilya; +1 Ответить
35. AlexO 135 14.08.12 12:50 Сейчас в теме
(22)
А Вы что еще видели или делали в этом направлении?

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

как я помню - там все жадные (деньги же платили!), да и формат выгрузки периодически меняется...
Но по Битрикс я тоже не встречал никакой доументации по обмену, тем более - на уровне форматов.
36. ksnik 593 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 Ответить
37. AlexO 135 14.08.12 16:43 Сейчас в теме
(36)
кажется если открыть файл выгрузки из 1С в Битрикс в формате cml2

т.е. по оброненной булавке вы, как А.Кристи, делаете, вывод, что это булавка соседки-швеи, и именно она - убийца? :D
Может, это типичный файл, а может - зависит от условий выгрузки. Спорить не буду, не знаю :)
Но вот, например, если вы будете судить о форматах выгрузки в другие Банки - по выгрузке из 1С в какой-нибудь СберБанк (как самую распространенно-встречающуюся), то ждет вас разочарование и уныние.
Хотя там вообще - сплошной текст без намека на XML :)
forever-lilya; +1 Ответить
38. Yashazz 4793 14.08.12 22:37 Сейчас в теме
(35) (37) Именно такая фигня. Никто ничего не знает или делает вид. А изучать файл - можно, конечно, но совершенно верно замечено, файл может здорово зависеть от условий выгрузки, тут целое исследование затевать надо.
forever-lilya; +1 Ответить
40. zhenyat 8 10.09.12 16:06 Сейчас в теме
(38) Yashazz, 1с:Предприятие 8 - Стандарты и форматы - достаточно подробное описание, я основываясь на этих статьях и на примерах файлов из них, с нуля написала свою обработку для обмена заказной конфигурации на 1с v7.7 с магазином на битриксе
41. ksnik 593 10.09.12 18:03 Сейчас в теме
23. forever-lilya 5 10.08.12 16:43 Сейчас в теме
Здраствуйте! Помогите, пожалуйста. В вашей обработке я выбираю одну группу номенклатуры, а в итоге в файл XDTOSample24.xml записываются все группы и подгруппы, даже те, которых не выбирала. Не могу разобраться...
Прикрепленные файлы:
27. ksnik 593 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 Ответить
31. ksnik 593 13.08.12 22:19 Сейчас в теме
(23) forever-lilya, отвечаю на
>в итоге в файл XDTOSample24.xml записываются все группы и подгруппы, даже те, которых не выбирала. Не могу разобраться...


cml2 пакет, который формируется такими обработками, состоит из 2х частей - (1) классификатор (типы данных) и (2) каталог товаров (экземпляры типа). Классификатор (состоящий из групп номенклатуры) это заготовки шаблонов данных для разных товарных категорий интернет-магазина или сайта-витрины. Он невидимый визуально, это как классы объектов в объектной модели. Полностью грузится чтобы проверить работу механизма обмена данными. Если мешают на сайте лишние типы данных и хотите обрезать классификатор, это тоже возможно, скачайте консоль запросов, скопируйте в нее самый первый текст запроса (не забудьте заполнить параметры запроса) и добавьте такое условие, какое хотите. Например как во втором запросе, если хотите не список значений а одну группу, можно настроить условие не "в списке" а просто "в иерархии". Пробуйте, это пригодится! Или шлите мне справочник. А здесь, на форуме, развивать эту тему не нужно - такие детальные подробности мало кого заинтересуют.
forever-lilya; +1 Ответить
24. forever-lilya 5 13.08.12 09:42 Сейчас в теме
Кто-нибудь пользовался обработкой? У кого работает правильно? У кого правильно выгружаются группы в иерархие?
25. Yashazz 4793 13.08.12 12:55 Сейчас в теме
Люди добрые, а знает кто-нибудь, где взять правильный формат xml-файлов обмена для Битрикс? Надоело в угадайку играть. То иерархию не читает, то ещё что. Есть ли описание или xsd-схема для классического обмена с Битрикс?
Плизз!

пы.сы. очень неохота гонять выгрузку из УТ и смотреть, как да что она сделала...
forever-lilya; +1 Ответить
30. ksnik 593 13.08.12 20:51 Сейчас в теме
(25) Yashazz, Битрикса полно в интернете, он кстати немного не стандартный, впрочем как и в umi-cms тоже с точностью соответствия cml2 не загонялись, но я к сожалению далек об Битрикса, хотя могу скинуть красивые примеры cml2 из комплекта поставки umi (они приведены во вложении в эту обработку).
forever-lilya; +1 Ответить
32. Yashazz 4793 13.08.12 23:18 Сейчас в теме
(30) К сожалению, нифига в интернетах по Битриксу нет. Есть куча руководств для типовых 1С, а вот нормального описания формата, т.е. порядка, состава и смысла тегов в xml-файле (не говоря уж о полноценной схеме) - нету. Не знаю, где и искать... Спасибо на добром слове.
ShantinTD; forever-lilya; +2 Ответить
33. ksnik 593 13.08.12 23:25 Сейчас в теме
(32) Yashazz, А в группе http://infostart.ru/community/groups/622/ разве нету? тогда создайте тему поиска, будем искать вместе! Не могу полностью согласиться с Вашим не достаточно задорным настроением, считаю что формат красивый и прозрачный, я бы зарегистрирровался на тематических форумах по битриксу и попросил у их пользователей файлы примеров.
forever-lilya; +1 Ответить
26. forever-lilya 5 13.08.12 15:22 Сейчас в теме
Не правильно выстраивается иерархия номенклатуры, проблемка, как решить?
28. ksnik 593 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 593 13.08.12 20:49 Сейчас в теме
Ну и прилагаю к обработке еще один файл - новую версию. Сейчас Юрий Пермитин дал мне свой парсер яндекс.маркета и работа кипит, скоро будет готовый варант упорядочивания наименований номенклатуры и вариант загрузки картинок! Присоединяйтесь пожалуйста к обмену опытом! Самое нужное сейчас на данном этапе работы - доступ в gepir, если есть идеи или сведения пожалуйста поделитесь!!! Ребята из gepir-а не отвечают на е-мейл.
forever-lilya; +1 Ответить
34. forever-lilya 5 14.08.12 09:07 Сейчас в теме
Спасибо огромное!!!!!!!!!!!
39. ksnik 593 06.09.12 02:09 Сейчас в теме
В версии 2 потеряна некоторая доля универсальности. Это связано с тем, что запрос по номенклатуре, соединенный с номенклатурными группами бухгалтерии (который появился в версии 2) может оказаться не совместимым с произвольной конфигурацией. То есть если у Вас с помощью моей обработки не получается формирование классификатора (версии 2), тогда можно скачать версию 1 (она не удалена а прикреплена во вложенных файлах) и посмотреть текст запроса по номенклатуре в ней. Размет текста запроса очень большой, сюда вставить увы нереально.
42. savvato 17.09.12 11:56 Сейчас в теме
выгружает ли обработка каталог и предложения с учетом характеристик номенклатуры? Посмотрел код не увидел.Просьба не пинать...
43. ksnik 593 17.09.12 13:43 Сейчас в теме
(42) savvato, выгружается только штрихкод товара (в коммерческом предложении). Характеристика должна быть создана в пакете XDTO (найдите в нем "Товар") Характеристики как правило выгружаются в каталоге, примерно после этих строчек (по аналогии с данным фрагментом, ПолноеНаименование - характеристика):
Номенклатура = Фабрика.Создать(НоменклатураТип);
//ЗаполнитьЗначенияСвойств(Номенклатура, ТекСтр.Ссылка);
Номенклатура.Ид = СокрЛП(ТекСтр.Ссылка.УникальныйИдентификатор());
Если СтрДлина(СокрЛП(ТекСтр.НаименованиеПолное)) < 10 Тогда
Номенклатура.ПолноеНаименование = ТекСтр.СовсемПолное;
Иначе
Номенклатура.ПолноеНаименование = ТекСтр.НаименованиеПолное;
КонецЕсли;
Прикрепленные файлы:
44. savvato 17.09.12 14:18 Сейчас в теме
а в ofers.xml в таком случае попадут остатки? С учетом характеристик номенклатуры? У меня в каталоге к примеру есть товар:рубашка. И ведеться учет по характеристикам :размер и цвет. Естественно разные остатки в зависимости от характеристик. Заранее спасибо за ответ, от меня Вам огромный жирный +. Тема очень актуальна для меня. Не очень сильно дружу с программированием в 1С, поэтому прошу ткнуть носом, как говориться...
45. ksnik 593 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 593 18.09.12 20:38 Сейчас в теме
(46) savvato, чего-то ничего в голову не приходит, вот скриншот. Помогло?
Прикрепленные файлы:
48. savvato 18.09.12 23:07 Сейчас в теме
{Форма.Форма2.Форма(2727)}: Ошибка при вызове метода контекста (Выполнить)
	РезТаб = Запрос.Выполнить().Выгрузить();
по причине:
{(16, 17)}: Поле не найдено "Номенклатура.ГруппаДляБухгалтерии"
Номенклатура.<<?>>ГруппаДляБухгалтерии КАК ГруппаДляБухгалтерии

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

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

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

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

3. Обработка под именем "Космачев" в рознице что-то формирует, по крайней мере ошибка не вылетает. Могли бы и ответить (55) savvato,
57. Yashazz 4793 27.11.12 14:14 Сейчас в теме
Коллеги, подытожу: не связывайтесь с битриксоидами-самопальщиками. В моём случае всё кончилось большими удивлёнными глазами, когда я сообщил, что вообще-то ни в одном стандарте ОЭИ, в т.ч. CML, нет таких тегов, как BolshayaKartinka, и что телепатически угадать наличие подобных тегов в своей выгрузке я не сумел не потому, что полный ламер. И ещё позабавил постоянный рефрен "Ну типовая 1С ведь всё выгружает!". Ужосъ.
59. holostyak 13 01.10.13 15:29 Сейчас в теме
Судя по комментам - одна головная боль с этой обработкой...
Оставьте свое сообщение