Импорт торговых предложений из 1С?

Добрый день, имеется небольшая проблема при импорте каталога из 1С. Немного конкретнее, имеется выгрузка из 1С состоящая из 2-х файлов, номенклотура и торговые предложения. Свойства из номенклотуры получаю без проблем, а вот характеристики торгового предложения никак. Для импорта использую mSync.
Вот характеристики в файле импорта:
<Предложение>
	<Ид>a63549cb-7a24-11e5-8ea4-0002a54e8623#a63549cd-7a24-11e5-8ea4-0002a54e8623</Ид>
	<Штрихкод>22000000</Штрихкод>
	<Наименование>Трусы стринг V.I.P.A (Размер - S, Цвет - черный)</Наименование>
	<БазоваяЕдиница Код="796" НаименованиеПолное="Штука" МеждународноеСокращение="PCE">шт</БазоваяЕдиница>
	<ХарактеристикиТовара>
		<ХарактеристикаТовара>
			<Наименование>Размер</Наименование>
			<Значение>S</Значение>
		</ХарактеристикаТовара>
		<ХарактеристикаТовара>
			<Наименование>Цвет</Наименование>
			<Значение>черный</Значение>
		</ХарактеристикаТовара>
	</ХарактеристикиТовара>
Весь импорт разбит на 2 файла: import.xml(основная информация о товаре, свойства товара и структура каталога) и offer.xml(тут все торговые предложения и их характеристики).
В документации mSync и гугле информации не нашел…
Еще немного дополню, стоит модуль msoptionprice2, в документации сказано что если он установлен, то при импорте будут автоматически созданы модификации на основе предложений, но такого не происходит.
web3
13 сентября 2017, 09:02
modx.pro
3
2 388
+1

Комментарии: 23

Володя
13 сентября 2017, 13:12
0
Еще немного дополню, стоит модуль msoptionprice2, в документации сказано что если он установлен, то при импорте будут автоматически созданы модификации на основе предложений, но такого не происходит.
В документации сказано про msoptionprice 1-ой версии. Данная информация давно неактуальна, а компонент msoptionprice уже 2-ой версии.

    web3
    13 сентября 2017, 13:17
    1
    0
    Да, прошу прощения, это наверное даже было взято из документации mSclad, который канул в лету… У этого компонента просто сказано что он импортирует торговые предложения, но как и куда ни слова…
      Виталий Киреев
      13 сентября 2017, 16:14
      0
      Обратитесь в техподдержку компонента с вашим вопросом.
        web3
        14 сентября 2017, 05:03
        1
        0
        Проблема в том, что использую тестовый хостинг, дабы понять возможно ли выполнить требуемые задачи данным компонентом. В описании сказано что,
        Возможности:
        — Импорт товаров со свойствами и картинками, торговых предложений из 1С и других сервисов.
        Но при этом никакой подробной инструкции и чего либо еще вразумительного. А какой смысл покупать компонент, если он мне может не подойти?
          Виталий Киреев
          14 сентября 2017, 05:07
          0
          Торговое предложение это цена и остатки. Вот их компонент и обновляет в товарах minishop. msoptionprice2 из коробки не поддерживается, но можно создать плагин, который при обработке торгового предложения создаст объекты msoptionprice2.
            web3
            14 сентября 2017, 05:27
            1
            0
            Окей, есть проблема даже в этом. Есть фаил offers.xml, в котором как раз таки и лежат торговые предложения, а у каждого торгового предложения есть некие характеристики(цвет, размер) которые по идее тоже должны куда-то попадать. Без проблем можно было бы написать простенький обработчик если бы при событии обработки офера в данные не вываливало весь полученный хмл. Пробовал выводить данные проходящие при событии в переменной через лог, так мне фаил раздувало на 200 метров. Файлы импорта весят не более 1,5кб.
            P.S. Использовал это событие — mSyncOnProductOffers, выводил $xml. Вместо этого он вывел кучу системной инфы, начиная от ленговых переменных, заканчивая информацией о компонентах и их данные…
            Ну да ладно, как хоть получить характеристики из офера? Разные цены из офера у меня подтянулись, а как быть с характеристиками не знаю.
              web3
              14 сентября 2017, 06:09
              1
              0
              Залез внутрь компонента, смотрю функцию сохранения товара во временную таблицу вижу что есть работа с характеристиками, уже хорошо. Но характеристики в базу так и не попадают…
              /**
                   * @param SimpleXMLElement $xml
                   * @return array Временные данные товара
                   */
                  protected function importProduct($xml)
                  {
                      $prod = array();
              
                      $prod['name'] = $this->stringXml($xml->Наименование);
                      $prod['description'] = $this->stringXml($xml->Описание);
              
                      //standart properties
                      $prod['article'] = $this->stringXml($xml->Артикул);
                      $prod['manufacturer'] = $this->stringXml($xml->Изготовитель);
                      $prod['bar_code'] = $this->stringXml($xml->Штрихкод);
              
                      //additional properties
                      $prod['properties'] = array();
                      if (isset($xml->ЗначенияСвойств)) {
                          foreach ($xml->ЗначенияСвойств->ЗначенияСвойства as $xml_property) {
                              $this->addComplexProperty($xml_property, $prod['properties']);
                          }
                      }
              
                      if (isset($xml->СписокСвойствОписания)) {
                          foreach ($xml->СписокСвойствОписания->СвойствоОписания as $xml_property) {
                              $this->AddProperty($xml_property, $prod['properties']);
                          }
                      }
              
                      if (isset($xml->ЗначенияРеквизитов)) {
                          foreach ($xml->ЗначенияРеквизитов->ЗначениеРеквизита as $xml_property) {
                              $this->AddProperty($xml_property, $prod['properties'], array('ВидНоменклатуры', 'ТипНоменклатуры'));
                          }
                      }
              
                      if (isset($xml->ХарактеристикиТовара)) {
                          foreach ($xml->ХарактеристикиТовара->ХарактеристикаТовара as $xml_property) {
                              $this->AddProperty($xml_property, $prod['properties']);
                          }
                      }
              
              
                      $prod['properties'] = $this->jsonXml($prod['properties']);
                      $prod['images'] = $this->jsonXml($xml->Картинка);
                      $prod['features'] = $this->jsonXml($xml->ХарактеристикиТовара);
              
                      $prod['uuid'] = $this->stringXml($xml->Ид);
                      $prod['parent_uuid'] = $this->stringXml($xml->Группы->Ид);
                      $prod['status'] = $this->stringXml($xml->Статус);
                      if (empty($prod['status']) && isset($xml->attributes()->Статус)) {
                          $prod['status'] = $this->stringXml($xml->attributes()->Статус);
                      }
              
                      return $prod;
                  }
                Виталий Киреев
                14 сентября 2017, 12:34
                0
                Это вообще другое место.
                $xml это SimpleXMLElement, соответственно получить из него список характеристик в плагине можно так:
                $xml->ХарактеристикиТовара
                Вы, наверное, еще и $resource выводили в лог.

                docs.modx.pro/components/msync/settings
                msync_price_by_feature_tv — по умолчанию цены по характеристикам пишутся в указанную в этой настройке TV
                  web3
                  14 сентября 2017, 12:43
                  1
                  0
                  Понял, кроме одного момента. Т.е. из коробки характеристики никак не получить?
                    Виталий Киреев
                    14 сентября 2017, 12:53
                    0
                    Список характеристик берется из файла import.xml и запоминается в $_SESSION. А характеристики предложения можно получить, как я написал. При этом цены по этим характеристикам пишутся в TV (вместе с именем характеристики).
                      web3
                      14 сентября 2017, 12:55
                      1
                      0
                      Вот теперь идеально. Спасибо большое.
                        web3
                        14 сентября 2017, 13:40
                        1
                        0
                        Еще спрошу, если можно, как можно получить при срабатывании события mSyncOnProductOffers id товара, к которому это предложение относится?
                          Виталий Киреев
                          14 сентября 2017, 13:44
                          0
                          $resource->id
                          web3
                          14 сентября 2017, 13:46
                          1
                          0
                          Вот теперь чувствую себя контент менеджером… Спасибо!
                          web3
                          15 сентября 2017, 06:17
                          1
                          0
                          А не подскажите, вот почти со всем разобрался, единственное, не могу обновить цвета и размеры у товаров, на сколько я понял, они хранятся не так как все остальные(вес, цена)?
                          На данный момент имею вот это.
                          <?php
                          if ($modx->event->name == 'mSyncOnProductOffers') {
                          $object=$xml->ХарактеристикиТовара;
                          $array = array();

                          foreach( $object as $element) {
                          foreach($element as $item){
                          $name=addslashes((string)$item->Наименование);
                          $value=addslashes((string)$item->Значение);
                          $array[$name] = $value;
                          }
                          }
                          $id=addslashes((int)$resource->id);
                          $array[id]=intval($id);
                          $modx->log(4,var_dump($array));

                          $data = $modx->getObject('msProduct', $array[id]);
                          if(isset($array[Обхват])){
                          $size=$array[Размер]."/".$array[Обхват];
                          $data->set('size',$size);
                          }
                          else{
                          $size=$array[Размер];
                          $data->set('size',$size);
                          }
                          if(isset($array[Цвет])){
                          $data->set('color',$array[Цвет]);
                          }
                          $data->set('weight', 500);
                          $data->save();
                          $vendor = $data->get('Vendor');

                          }
                          return;
                          Как сохранять и получать свойства типа цветов, размеров и подобных?
                          web3
                          15 сентября 2017, 10:36
                          1
                          0
                          Уже не актуально. Сделал сам.
                          man
                          man
                          15 сентября 2017, 16:20
                          0
                          А как-же правила хорошего тона?
                          Решение желательно выкладывать)
                          Конкретно мне не нужно, но может кому и пригодится!
                          web3
                          18 сентября 2017, 04:59
                          0
                          Все верно, пока есть не совсем аккуратная, но все же рабочая версия плагина.
                          Из необходимого, чтобы в системе не было переменных на русском при обработке их переводим, дабы создаем из необходимых данных массив с которым в последствии работаем. В конкретном случае обрабатываем торговые предложения, у которых есть несколько типов цен и пара характеристик, торговые предложения складываем как модификации из компонента msOptionPrise2.
                          <?php
                          if ($modx->event->name == 'mSyncOnProductOffers') {
                              $object=$xml->ХарактеристикиТовара;
                               $array = array();
                               $trans = array(
                              "а"=>"a",  "б"=>"b",  "в"=>"v",  "г"=>"g",
                              "д"=>"d",  "е"=>"e",  "ё"=>"yo", "ж"=>"j",
                              "з"=>"z",  "и"=>"i",  "й"=>"i",  "к"=>"k",
                              "л"=>"l",  "м"=>"m",  "н"=>"n",  "о"=>"o",
                              "п"=>"p",  "р"=>"r",  "с"=>"s",  "т"=>"t",
                              "у"=>"y",  "ф"=>"f",  "х"=>"h",  "ц"=>"c",
                              "ч"=>"ch", "ш"=>"sh", "щ"=>"sh", "ы"=>"i",
                              "э"=>"e",  "ю"=>"u",  "я"=>"ya",
                          
                              "А"=>"A",  "Б"=>"B",  "В"=>"V",  "Г"=>"G",
                              "Д"=>"D",  "Е"=>"E",  "Ё"=>"Yo", "Ж"=>"J",
                              "З"=>"Z",  "И"=>"I",  "Й"=>"I",  "К"=>"K",
                              "Л"=>"L",  "М"=>"M",  "Н"=>"N",  "О"=>"O",
                              "П"=>"P",  "Р"=>"R",  "С"=>"S",  "Т"=>"T",
                              "У"=>"Y",  "Ф"=>"F",  "Х"=>"H",  "Ц"=>"C",
                              "Ч"=>"Ch", "Ш"=>"Sh", "Щ"=>"Sh", "Ы"=>"I",
                              "Э"=>"E",  "Ю"=>"U",  "Я"=>"Ya",
                          
                              "ь"=>"",   "Ь"=>"",   "ъ"=>"",   "Ъ"=>""
                          );
                          
                              foreach( $object as $element) {
                                  foreach($element as $item){
                                      $name=strtr(addslashes((string)$item->Наименование), $trans);
                                      $value=addslashes((string)$item->Значение);
                                      $array[$name] = $value;
                                  }
                              }
                              $prices=$xml->Цены;
                              foreach( $prices as $prices_element) {
                                  foreach($prices_element as $price_item){
                                      $price_type=addslashes((string)$price_item->ИдТипаЦены);
                                      $price_value=addslashes((string)$price_item->ЦенаЗаЕдиницу);
                                      $array[prices][$price_type] = $price_value;
                                  }
                              }
                              
                              
                              $id=addslashes((int)$resource->id);
                              $array[id]=intval($id);
                              $modx->log(4,var_dump($array));
                              
                               if(isset($array['Obhvat'])){
                                      $size=$array['Razmer']."/".$array['Obhvat'];
                                  }
                                  else{
                                      $size=$array['Razmer'];
                                  }
                              if(isset($array['Cvet'])){
                                      $color=$array['Cvet'];
                                  }
                              /*Тут сохраняется необходимая цена,т.к. присутствуют 3 типа цен(розница,акция и закупочная), используем только розницу и акцию, далее в зависимости от наличия цены по акции, если она есть, то отправляем ее в текущую цену, а розницу в старую цену.*/
                              if(isset($array[prices]["f282d7ca-2726-11e3-a84f-0002a54e8623"])){
                                  $price = $array[prices]["f282d7ca-2726-11e3-a84f-0002a54e8623"];
                                  $old_price =  $array[prices]["f282d7c9-2726-11e3-a84f-0002a54e8623"];
                              }
                              else{
                                  $price =  $array[prices]["f282d7c9-2726-11e3-a84f-0002a54e8623"];
                              }
                              $rid =  $array[id];
                              $mid=intval(addslashes((string)$xml->Штрихкод));
                           
                              $count=intval(addslashes((string)$xml->Количество));
                              $article = $mid;
                              /* опции модификации, тут вручную собираем нужные характеристики товара(опции) */
                              $options = array(
                                  'color' =>  $color,
                                  'size' => $size
                              );
                              $msoptionsprice = $modx->getService('msoptionsprice');
                              $msoptionsprice->initialize('web');
                              /* создаем опции продукта */
                              $options = $msoptionsprice->setProductOptions($rid, $options);
                             
                              
                              /* создаем модификацию */
                              if((isset($old_price))&&($old_price!=NULL)){
                                  $modification = array(
                                        'price' => $price,
                                        'old_price' => $old_price,
                                        'article' => $article,
                                        'weight' => '',
                                        'count' => $count,
                                        'options' => array(
                                          'color' =>  $color,
                                          'size' => $size
                                          )
                                  );
                              }
                              else{
                                   $modification = array(
                                    'price' => $price,
                                    'article' => $article,
                                    'weight' => '',
                                    'count' => $count,
                                    'options' => array(
                                      'color' =>  $color,
                                      'size' => $size
                                      )
                                  );   
                              }
                              
                               /* создаем опции модификации */
                              $modification = $modx->call('msopModification', 'saveProductModification', array(&$modx, $rid, $modification));
                              
                          }
                          return;
                          web3
                          18 сентября 2017, 05:11
                          1
                          0
                          Плагин вешаем на событие «mSyncOnProductOffers».
                          Володя
                          18 сентября 2017, 09:19
                          1
                          0
                          если у вас актуальная версия компонента msOptionsPrice то вот это лишнее
                          /* опции модификации, тут вручную собираем нужные характеристики товара(опции) */
                              $options = array(
                                  'color' =>  $color,
                                  'size' => $size
                              );
                              $msoptionsprice = $modx->getService('msoptionsprice');
                              $msoptionsprice->initialize('web');
                              /* создаем опции продукта */
                              $options = $msoptionsprice->setProductOptions($rid, $options);
                          опции будут созданы автоматически при создании модификации
                          web3
                          19 сентября 2017, 06:59
                          1
                          0
                          Только что попробовал, к сожалению без этого куска совсем не запустилось, не заполнились необходимые свойства и модификации было не из чего создавать…
                          web3
                          19 сентября 2017, 07:45
                          1
                          0
                          Я правильно понял, что для создания модификации достаточно сформировать входной массив
                          $modification = array(
                                        'price' => $price,
                                        'old_price' => $old_price,
                                        'article' => $article,
                                        'weight' => '',
                                        'count' => $count,
                                        'options' => array(
                                          'color' =>  $color,
                                          'size' => $size
                                          )
                                  );
                          А затем вызвать событие
                          $modification = $modx->call('msopModification', 'saveProductModification', array(&$modx, $rid, $modification));
                          Окей, все сделал, но почему-то модификации не создались.
                          Вот что попадает во входные переменные
                          [mSyncOnProductOffers]int(162)/*это $rid*/
                          array(5) {/*а это $modification*/
                            ["price"]=>
                            string(6) "675.00"
                            ["article"]=>
                            int(2200000076250)
                            ["weight"]=>
                            string(0) ""
                            ["count"]=>
                            int(2)
                            ["options"]=>
                            array(2) {
                              ["color"]=>
                              string(12) "черный"
                              ["size"]=>
                              string(1) "M"
                            }
                          }
      Дмитрий
      29 августа 2018, 15:44
      0
      Попробовал сделать по представленному скрипту и все ок работает, спасибо, но проблема в том, что при выгрузке заказов в 1С, загружаются все параметры кроме дополнительных (размер, цена). Может кто-нибудь сможет, что-нибудь подсказать…
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        23