mSklad + дополнение обмена данными УТ от Битрикс

приветствую. только начал разбираться как работает система экспорта товаров в 1С: УТ но уже встретил ряд проблем с дефолтным модулем обмена данными с интернет-магазином. судя по отзывам после перехода на CommerceML 2.07 все стало совсем плохо, в моем случае и вовсе ни цен, ни остатков не выводится (в xml файле данные отсутствуют).
собственно вопрос — можно ли приспособить модуль экспорта от Битрикс (имеющий более гибкие настройки) для работы с mSklad? при попытке авторизации на сайте выдает ошибку «неправильное имя кодировки ml». исходники пока не смотрел, возможно у кого-то уже есть опыт в подобном вопросе.
Alexander
30 мая 2015, 21:04
modx.pro
1
3 045
+1

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

Sergey Leleko
31 мая 2015, 14:30
0
УТ случайно не вот это последняя самая?
У меня такая же беда.
    Alexander
    31 мая 2015, 16:12
    0
    УТ 11.1.10.131 от 20 апреля.
      Sergey Leleko
      31 мая 2015, 16:14
      0
      ну да она самая… Походу она кривая. Даже бренды не выгружает. 1С молчит.
    Alexander
    01 июня 2015, 13:36
    0
    вроде как разобрался с основными проблемами. вкратце о решении для УТ 11.1.10.131 (стандартный модуль выгрузки, CommerceML 2.07) + mSklad 1.0.7-pl. решение грубое, но работать надо.

    для экспорта цен и остатков в 1С необходимо создать типовое соглашение с указанием вида цен, на странице создания соглашения отметить пункт «Доступно внешним пользователям». помимо этого, в настройках пользователей и прав (в разделе Администрирование) отметить аналогичный пункт — «Разрешить доступ внешним пользователям».

    для корректной загрузки цен в настройках mSklad нужно включить импортирование всех цен (msklad_import_all_prices), изменить источник связи цены на «Типовое соглашение» (или как оно было названо в 1С), не забыть включить.

    с остатками сложнее. раньше количество товара было между тегами <Количество>, сейчас же оно включено в тег <Склад> как свойство:
    <Склад ИдСклада="a943bace-d3bb-11e4-8264-5c93a2ff55f9" КоличествоНаСкладе="9"/>
    для корректной загрузки необходимо исправить либо модуль выгрузки 1C, либо скрипт импорта на стороне modx. для второго варианта в файле core\components\msklad\model\msklad\mskladcataloghandler.class.php закомментировать
    if(isset($this->properties['Количество'])){
    	$quantity = intval($xml->Количество);
    добавить
    if(isset($this->properties['Склад'])){
    	foreach($xml->Склад as $warehouse){
    		$quantity = intval($warehouse['КоличествоНаСкладе']);
    		}
    к коде ниже заменить все ['Количество'] на ['Склад']

    в mSklad установить связь 'Склад' с 'remains' (цель не принципиальна так полагаю), после этого заработает функция msklad_publish_by_quantity. но, для нескольких складов решение непригодно — будут использоваться остатки последнего в списке склада.

    еще она проблема — имя xml файла было изменено, в этом же файле найти
    case 'offers.xml':
    под ним добавить
    case 'offers0_1.xml':
    если происходит выгрузка нескольких каталогов, таким же образом добавить offers1_1.xml и т.д.
    тоже самое проделать для import.xml на случай если не будет производится выгрузка цен, по крайней мере синхронизация не прервётся.
      Александр Рахимов
      01 июня 2015, 22:31
      0
      Имя файла кстати в последней версии протокола сильной роли не играет, 1с параметрами дополнительно шлет действия которые выполнить надо.

      Просите нового разработчика вносить правки.
      У меня эти проблемы решены уже :)
      Alexander
      29 июля 2015, 14:12
      0
      еще косяк критический, вдруг кому пригодится — если при выгрузке всего одной позиции скрипт уходит в бесконечный цикл:

      в mskladcataloghandler.class.php заменить

      if(count($prodSql)>0){
      			$sql = "INSERT INTO ".$this->modx->getTableName('mSkladProductTemp')." (`name`, `article`, `manufacturer`, `images`, `bar_code`, `description`, `features`, `properties`, `uuid`, `parent_uuid`, `status`) VALUES
      				   ".implode(',',$prodSql).";";
      
      			$stmt = $this->modx->prepare($sql);
      			$stmt->execute();
      		}
      		else{
      на

      $sql_count = count($prodSql);
      		
      		if($sql_count>0){
      			$sql = "INSERT INTO ".$this->modx->getTableName('mSkladProductTemp')." (`name`, `article`, `manufacturer`, `images`, `bar_code`, `description`, `features`, `properties`, `uuid`, `parent_uuid`, `status`) VALUES
      				   ".implode(',',$prodSql).";";
      
      			$stmt = $this->modx->prepare($sql);
      			$stmt->execute();
      		}
      
      		if ($sql_count = 0 || $totalProducts <= 1){
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        6