Решение: Загрузка товаров в Commerce из 1C

Главные вкладки

Аватар пользователя Dimm Dimm 10 апреля 2012 в 21:00

Сделал загрузку товаров из 1С 8.2 Управление Торговлей на сайт в каталог commerce на основе стандартного обмена 1С8 с сайтом в формате CommerceML
+ парсинг описаний товаров с других сайтов.

Стояла задача:
1. Импортировать и обновлять из 1с цены и количество товаров.
2. Заполнить описания товаров с сайтов-поставщиков.

Задачи решены.
Импортирует товары, цены, каталог со структурой.
Парсит описания товаров с картинками.
Ноды-описания привязываются к нодам-ценам вручную. (Из 1с потом обновляются автоматически.)

Необходимые модули:
http://drupal.org/project/commerce
http://drupal.org/project/commerce_feeds
http://drupal.org/project/feeds_xpathparser
http://drupal.org/project/feeds_tamper 7.x-1.x-dev.tar.gz (31.95 KB) 2012-Feb-02
Парсер сайтов
http://xandeadx.ru/blog/drupal/554

Патчи:

Патчи для работы в feeds_xpathparser batch процесса
http://drupal.org/node/1447788
или
http://drupal.org/node/1397434

Патч при ошибке выполнения batch процесса
PHP Fatal error: Unsupported operand types in /sites/all/modules/feeds/includes/FeedsConfigurable.inc on line 149, referer: batch?op=start&id=201
http://drupal.org/node/1273622 http://drupal.org/files/issues/feeds_12.patch (http://drupal.org/node/1213472 не пробовал)

Патч для Иерархии таксономии в feeds
http://drupal.org/node/1152940#comment-5712000 http://drupal.org/files/0001-implemented-1152940-feeds-hierarchical-term...

Для применения патча в windows при ошибке line 354 использовать совет http://drupal.org/node/23844#comment-41593
patch {file} {patch} --verbose --binary

Настройки:
Настройки для решения проблемы уменьшения цены в 100 раз
http://drupal.org/node/1159426#comment-5729996

Изменил немного
profiles/commercebox_profile/modules/contirb/commerce/modules/product/commerce_product.module
для удобной выборки товаров по названию а не по SKU т.к. SKU из 1с не информативно + большое поле выборки

Посмотреть: эклектика24.рф

Потестировать:
Качайте архив:
http://narod.ru/disk/45734150001.4dff6339efc6701b181074a7cc0f8451/2012-0...
Логин Admin
Пароль 123456

Файлы для тестирования импорта - в папке files/feeds

Комментарии

Аватар пользователя VasyOK VasyOK 10 апреля 2012 в 21:18

Если работает то класс. Осталось только выучить комерц и 1С. Обязательно затестю. А на сайте цены есть?

Аватар пользователя Sun-fire Sun-fire 10 апреля 2012 в 22:38

Очень интересно. Спасибо автору за решение.

Есть чисто технический вопрос к автору. Тестировали ли Вы эту выгрузку "под нагрузкой"? Какие показатели по скорости обработки данных/расхода памяти при этом удалось зафиксировать?

Аватар пользователя Dimm Dimm 11 апреля 2012 в 8:21

10000 товаров импортирует минуты за три.
Работает на хостинге за 100 руб в месяц на drupalhost.ru 256MB памяти.

Аватар пользователя milkovsky milkovsky 10 апреля 2012 в 23:11

Можно узнать о настройках 1С?
Как настроить "стандартный обмен 1С8 с сайтом в формате CommerceML"?
Ты пользовался "Сервис->Обмен данными с Web-сайтом" ?

Аватар пользователя Dimm Dimm 11 апреля 2012 в 8:26

Да
Стандартный "Сервис->Обмен данными с Web-сайтом"
Там надо настроить фильтр выборки товаров из 1с.
Например только товары с ценой больше 0.
Сам в этом не сразу разобрался - думал это выбор полей для выборки в XML, а это оказался выбор товаров по параметрам для выгрузки в XML.

Аватар пользователя Vit Hi Vit Hi 9 мая 2012 в 3:04

Не знаком с commerce, но может кому то будет интересно.
Есть модуль Node Import и Node Import Update.
Они позволяют без допиливаний заносить термины таксономии и товары с ценами и всеми их составляющими из файлов формата xml. Как вывести из 1С необходимую инфу в формат xml можно спросить у бухгалтера.
С ubercart эти модули прекрасно работают.

Аватар пользователя kyky kyky 9 мая 2012 в 6:15

Такое количество модулей и патчей для одной задачи? Может, проще было ограничиться самописным скриптом?

Аватар пользователя makkon makkon 9 мая 2012 в 21:23

пардон, а как залить ваш архив из бекапа? ставлю д7, ставлю backup and migrate и делаю через него восстановление (файл бекапа в files) и что-то он неособо заливается. дб надо делать по названию особенную чтоли?
вроде до этого много дампов использовал, с таким первый раз столкнулся

апд. разобрался - там префикс у бд стоит, нужно через сторонние дамперы загружать базу и прописывать вручную настройки для бд в settings.php

Аватар пользователя fgvlasov fgvlasov 10 ноября 2015 в 11:48

решение очень правильное, только был лишний импорт для сопоставления Ид каталогов с их названиями, это можно сделать в одном импорте следующим образом:
1. Создаем в Товаре поля текстовые для хранения ID групп и свойств (при показе их не используем, они только для импорта)
1. Создаем в mapping для них Поля.
2. В настройках парсера делаем как на приложенной картинке (файл импорта тоже приложен)

Вся фишка в использовании переменной '$field_group_id'.

<?xml version="1.0" encoding="UTF-8"?>
<КоммерческаяИнформация ВерсияСхемы="2.05" ДатаФормирования="2012-12-13T22:10:08">
        <Классификатор>
                <Ид>dc0f1f6a-c5a7-4c4f-b497-3dc2be26d4e4</Ид>
                <Наименование>Классификатор (Провиант)</Наименование>
                <Группы>
                        <Группа>
                                <Ид>cbcf4966-55bc-11d9-848a-00112f43529a</Ид>
                                <Наименование>Продукты</Наименование>
                                <Группы>
                                        <Группа>
                                                <Ид>e8a71fa4-55bc-11d9-848a-00112f43529a</Ид>
                                                <Наименование>Бакалея</Наименование>
                                        </Группа>
                                        <Группа>
                                                <Ид>cbcf4967-55bc-11d9-848a-00112f43529a</Ид>
                                                <Наименование>Кондитерские изделия</Наименование>
                                        </Группа>
                                        <Группа>
                                                <Ид>e8a71fcb-55bc-11d9-848a-00112f43529a</Ид>
                                                <Наименование>Молочные</Наименование>
                                        </Группа>
                                </Группы>
                        </Группа>
                </Группы>
        </Классификатор>
        <Каталог СодержитТолькоИзменения="false">
                <Ид>dc0f1f6a-c5a7-4c4f-b497-3dc2be26d4e4</Ид>
                <ИдКлассификатора>dc0f1f6a-c5a7-4c4f-b497-3dc2be26d4e4</ИдКлассификатора>
                <Наименование>Провиант</Наименование>
                <Товары>
                        <Товар>
                                <Ид>cbcf4972-55bc-11d9-848a-00112f43529a</Ид>
                                <Наименование>Ассорти (конфеты)</Наименование>
                                <Группы>
                                        <Ид>cbcf4967-55bc-11d9-848a-00112f43529a</Ид>
                                </Группы>
                        </Товар>
                        <Товар>
                                <Ид>cbcf4968-55bc-11d9-848a-00112f43529a</Ид>
                                <Наименование>Молоко 1,5%</Наименование>
                                <Группы>
                                        <Ид>e8a71fcb-55bc-11d9-848a-00112f43529a</Ид>
                                </Группы>
                        </Товар>
                </Товары>
        </Каталог>
</КоммерческаяИнформация>
Аватар пользователя Dimm Dimm 15 декабря 2012 в 14:34

Круто!
А я не догадался использовать дополнительную переменную.
Спасибо за помощь!
Пожешь потом что получилось.

Аватар пользователя vbard vbard 10 ноября 2015 в 11:49

Привет!
А кто-нибудь решил проблему импорта множества вариаций товара в 1 дисплей товара (это в терминах commerce kickstart)? Иными словами, проблему импорта множества продуктов в 1 ноду товара?

Использую
УТ 11.1.2.9 на платформе 8.3.3.641
Дополнение 1С Битрикс для УТ отсюда http://www.1c-bitrix.ru/download/1c/ecommerce/ut_addon_11.1.2.9.zip
Commerce Kickstart 7.x-2.9
Feeds 7.x-2.0-alpha8
Commerce Feeds 7.x-1.3
Feeds Tamper 7.x-1.0-beta4

В 1С дисплеи товара суть элементы номенклатуры, а вариации товара суть характеристики элементов номенклатуры. И в общем всё красиво выглядит, вариации импортируются из offers.xml, дисплеи я думал как раз загружать из import.xml. Но я никак не могу догнать, как, не используя explode в Feeds Tamper, загрузить дисплеи и сопоставить их с вариациями?

В архиве мои import.xml и offers.xml

Аватар пользователя Sirega Sirega 5 сентября 2013 в 9:37

"sumerian" wrote:

Привет!
А кто-нибудь решил проблему импорта множества вариаций товара в 1 дисплей товара (это в терминах commerce kickstart)? Иными словами, проблему импорта множества продуктов в 1 ноду товара?


Посмотри, может оно http://sirega.ru/video/drupal-commerce-import-tovarov-s-pomoshchyu-modul...

Аватар пользователя vbard vbard 5 сентября 2013 в 13:30

отличное видео, спасибо, особенно за то, что на русском языке. Но у меня файлы загрузки немного не так устроены.

Аватар пользователя vbard vbard 6 сентября 2013 в 20:03

всё-таки удалось осилилить стандартными вышеуказанными стредствами. Правда пришлось чуть пропатчить модуль Feeds, там одна строчка мешала, причём видно, что не одному мне https://drupal.org/node/1539224

То, что я не мог понять, уже давно решено и обсуждалось здесь https://drupal.org/node/1188994

Пришлось импортировать в 3 прохода, т.е. создать 3 разных импортёра:
- первый парсит offers.xml и формирует продукты.
- второй парсит offers.xml и формирует ноды, связанные с только что созданными продуктами. Тут фокус в использовании Feeds Tamper для извлечения из <Ид> части, идентифицирующей элемент номенклатуры, т.е. ноду. Т.е. в <Ид> вида 47b8123d-0e28-11e3-95d1-0800278dbf07#47b8123f-0e28-11e3-95d1-0800278dbf07 это суть левая часть до решётки, т.е. 7b8123d-0e28-11e3-95d1-0800278dbf07. Я использовал для этого плагин Find replace REGEX для Feeds Tamper с аргументом /#\S*/ замещать на пустоту. Оное значение маппим на GUID и делаем его уникальным.
- третий парсит import.xml и добавляет остальные поля в ноду. Тут же берём <Ид> и маппим его на GUID и делаем его уникальным. Данный фокус имеет смысл только после вышеуказанного патча, а именно https://drupal.org/node/1539224#comment-7394766. Патч нужен для того, чтобы позволить разным импортёрам использовать один GUID, без него у каждого импотрёра свой набор GUID-ов.

Надеюсь, доступно описал. Сам потратил на это больше недели, ужеб наверное быстрее разобрался с написанием плагина под Feeds.
А в экспорт из 1С лезть всёравно наверное придётся, если встанет вопрос об индивидуальных картинках товара на характеристику, или, например, просто если есть _основная_ картинка и _дополнительные_ картинки, они выгружаются скопом. Как представляю этот идиотский механизм хранения картинок в 1С аж тошнит.

Аватар пользователя vbard vbard 2 декабря 2013 в 0:28

пару строк о commerce_feeds 1.3
1. Если использовать модель Commerce Kickstart, когда изображения хранятся в вариации, а не в дисплее товара (т.е. в product, а не в node), что в общем-то идеологически правильно, ибо у каждой вариации может быть своя картинка, например, футболки разного цвета, так вот, 1С УТ это дело ни хранить, ни выгружать толком не умеет. Ни из коробки, ни с дополнениями Битрикса. В очередной раз низкий поклон компаниям (1С, Битрикс), кормящие армию программистов, вечно допиливающих сии поделия. Так вот, в 1С УТ картинка вяжется к элементу номенклатуры, т.е., по-нашему, к ноде. И выгружается в import.xml, файл, откуда мы берём информацию о нодах (дисплеях). И как эти картинки оттуда в вариации загрузить, пусть даже одни и те же во все вариации, я не понял. Кое-кто может додуматься до создания у характеристики номенклатуры реквизита типа файл, и грузить картинку туда. Однако засады будет три минимум: крайне идиотский пользовательский интерфейс для работы с этими картинками, хранить можно 1 картинку на реквизит, и самое главное, всё равно не получится добиться желаемого - при выгрузке сама картинка в папку с картинками не попадёт, а в файле выгрузки появиться в виде имени картинки, заданном при задании значения этого реквизита, по умолчанию - имя картинки без расширения. Т.е. действо практически бесполезное. Потому пилю выгрузку, умнее ничего не придумал. Пока заставил выгружаться картинки номенклатуры в файл offers.xml, одни и те же в каждую характеристику.
2. commerce_feeds грузит эти картинки только по абсолютному URL, потратил на это знание пару часов.

Аватар пользователя vbard vbard 5 декабря 2013 в 5:55

по-простому (временно) разрешить в 1С 8.3 УТ 11.1.2.9 + дополнения Битрикса выгружать нулевые цены:
Конфигуратор -> Конфигурация -> Общие -> Планы обмена -> ОбменУправлениеТорговлейСайт -> Макеты -> РИ_СхемаВыгрузкиТоваров
Откроется большая и страшная хуита конструктор схемы компоновки данных (пример работы с ним http://v8.1c.ru/overview/dcs_sample_report.htm). Нам же нужна кнопка "Конструктор запроса...", в конструкторе находим справа самую нижнюю закладку с говорящим названием "Запрос пакета 12", переходим на неё, выбираем верхнюю закладку "Условия", там одна строчка Цены.цена > 0, удаляем эту строчку крестиком, сохраняем конфигурацию. Всё. Естественно, конфигурацию лучше заранее забекапить.
Правда, если больше ничего не делать, в offers.xml исчезают строки ЦенаЗаЕдиницу, а commerce_feeds отчего-то не хочет создавать товары с незаполненной ценой, хотя с нулевой - пожалуйста. Таким образом, либо ковыряем 1С дальще, либо у нас ещё есть строчка вида <Представление>0 RUB за шт, которая, кажется, всегда возвращает цифру цены. Следовательно, можно настроить соответствующие правила в feeds_tamper.

Аватар пользователя fgvlasov fgvlasov 29 мая 2014 в 10:31

Pashikk wrote:
А вот этим http://cmlservice.com/modules/importkit никто не пользовался?

пользовался, но там доработка 1С на 100 Мбайт, но в неё не было нужного мне импорта Характеристик товара и создатель до сих пор не сделал. И заказчик отказался вставлять обработку в 1С на 100 Мбайт Smile Так что я зря потратил 5000 рублей. Может быть под ваши нужды подойдет. Кстати этого импорта Характеристик (ЗначенияСвойств)до сих пор не нашёл ни у одного интернет-магазина, на shopscript обещали сделать , но пока не сделали.

Аватар пользователя Pashikk Pashikk 3 июня 2014 в 8:39

fgvlasov wrote:
Pashikk wrote:
А вот этим http://cmlservice.com/modules/importkit никто не пользовался?

пользовался, но там доработка 1С на 100 Мбайт, но в неё не было нужного мне импорта Характеристик товара и создатель до сих пор не сделал. И заказчик отказался вставлять обработку в 1С на 100 Мбайт Smile Так что я зря потратил 5000 рублей. Может быть под ваши нужды подойдет. Кстати этого импорта Характеристик (ЗначенияСвойств)до сих пор не нашёл ни у одного интернет-магазина, на shopscript обещали сделать , но пока не сделали.

Спасибо. А как решили выгрузку, если не секрет? .. Не очень то охота опять к битриксу возвращаться((

Аватар пользователя zazen zazen 10 ноября 2015 в 11:50

Добрый день.
На рабочий сайт подключил commerce и commerceml, на тестовый поставил сборку rucommerce чтобы разобраться. Подключил оба сайта к разным аккаунтам на "мой склад". В обоих случаях каждый раз после синхронизации отображений товаров(импортер Product Nodes ) добавляются все поля во вкладке "Mapping". через некоторое время на вкладку "Mapping" уже просто невозможно зайти не хватает памяти (php fatal error). В чем может быть причина? дело в commerceml, xpathparser или "моем складе"?

Аватар пользователя zazen zazen 30 октября 2015 в 11:01

Enemy wrote:
дело в php memory. хотя битва экстрасенсов закончилась

php memory - это следствие. я наверно не очень внятно написал. при каждом импорте товаров добапяются поля(дубли) в настройки соответствий (mapping). Через некоторое время их становится так много что на эту страницу не получается зайти. Все это можно воспроизвести поставив rucommerce. Я тоже не экстрасенс, не могу понять в чем причина. Пока сделал жуткий костыль - поставил на хостинг drush и сбрасываю по крону фичу с этим импортером раз в час

Аватар пользователя Enemy Enemy 4 ноября 2015 в 14:10

zazen wrote:
Enemy wrote:
дело в php memory. хотя битва экстрасенсов закончилась

php memory - это следствие. я наверно не очень внятно написал. при каждом импорте товаров добапяются поля(дубли) в настройки соответствий (mapping). Через некоторое время их становится так много что на эту страницу не получается зайти. Все это можно воспроизвести поставив rucommerce. Я тоже не экстрасенс, не могу понять в чем причина. Пока сделал жуткий костыль - поставил на хостинг drush и сбрасываю по крону фичу с этим импортером раз в час

не знаю как у вас. или может мы говорим про разные вещи.
у меня VPS и стандартная сборка drupal 7 + commerce + feeds и доп модули к нему, обновление 22к нод происходит без проблем.

Аватар пользователя Drupal Coder Drupal Coder 22 августа 2019 в 13:05

Пожалуйста!

Опубликовали релиз последней версии: https://www.drupal.org/project/commerceml

Если проблема с дубликатами в Feed Product Nodes все еще есть в этом релизе, то отключите опцию Create product node properties в настройках модуля.

В модуле реализован полноценный обмен заказами Drupal Commerce. Заказы выгружаются, обратно загружается информация об оплате и доставке. Если доставка или оплата была, то меняется статус заказа на указанный в настройках модуля.

Аватар пользователя Drupal Coder Drupal Coder 22 августа 2019 в 13:27

В последней версии модуля опции Feed Product Nodes нет, код создания полей и синхронизации таксономии сильно переписан для поддержки обменов разных типов товаров с разным набором полей.

Если будут проблемы с этим, то заведите пожалуйста issue на Drupal.org, посмотрим что можно сделать.