/ Адаптивность / Интеграция Woocommerce с 1С

Интеграция Woocommerce с 1С

HIT

Интеграция Woocommerce с 1С — довольно сложная тема с множеством нюансов. Буду описывать на что стоит обращать внимание, с какими проблемами пришлось столкнуться.

Плагин 1С:Предприятие Data Exchange

1s-integration2

Так как не имею опыта в интеграции 1С и сайта, обратился в фирму специализирующуюся на этом. Процесс интеграции пока продолжается, поэтому данные об организации и оценку работы по взаимодействию с ними опишу по завершении. Единственно упомяну, что процесс интеграции дело не быстрое!

Процесс интеграции на стороне сайта основывается на плагине Данила Семеленова «Обмен данным между WooCommerce и 1С:Предприятием».

Принцип работы модуля следующий: обновленные в 1С позиции по заданному графику выгружаются на сайт. Заказы поступающие на сайт в свою очередь выгружаются в 1С.

Соответствие полей 1С = WC

Наименование. В 1С часто данное поле не аккуратное, т.е. заполняется закупщиками как придется. Для наименования нужно (лучше) заводить специальное поле — Наименование для интернет-магазина.

Описание. Описание из 1С импортируется в сайт. Нужно настроить так, чтоб краткое описание из 1С переносилось в поле woocommece Краткое описание товара. А основное (полное) описание товара заполнялось на стороне сайта и не затиралось при обновлении позиции. В данный момент поле Основное описание затирается.

Куда записывается поле Описание из 1С в полое или краткое описание на сайте — это не важно, т.к. всегда можно поменять их местами в шаблоне вывода

Категории/подкатегории. При импорте в сайт в WC создаются те же категории/подкатегории что и 1С. При этом описание и изображение категории задается на сайте, и не затирается при очередной выгрузке. Наименование категории каждый раз обновляется из 1С.

Структура каталога товаров на сайте будет полностью дублировать структуру папок с 1С. Поэтому стоит этому уделить особое внимание!

1s-integration3
  • Все папки должны быть названы в одном стиле. Название строчными буквами с большой буквы (Категория), множественное/единственное число — в названиях должно быть единым.
  • Стараться избегать лишних вложенностей папок. Чтоб не получились категории с 1-2 товарами. И наоброт очень большие папки нужно разбивать на подкатегории (либо использовать фильтр).
  • Отказаться от служебных названий (Распродажа, Остатки, Непроданное и пр.), т.к. данные наименования могут появится на сайте
  • Не использовать в названии папок 1С каких либо символов: *_-()№,. Если это не обусловлено специальной необходимостью

Свойства. Поля из вкладки 1С свойства импортируются в атрибуты товара WC. Если на сайте создать для товара какие-либо атрибуты — при импорте из 1С они сотрутся. Так же в атрибуты подгружаются некоторые поля из вкладки По-умолчанию.

При экспорте свойств в атрибуты у атрибутов получается неправильный slug (что-то такое 62bc690e-a069-11e6-9fde-001a4be59578). Если переименовать на нормальное, то при следующем экспорте появится еще один атрибут снова со слагом 62bc690e-a069-11e6-9fde-001a4be59578, т.е. значение атрибута дублируется.

Вес. Исходно вес подставляется не в то поле. Должен ставится в вкладку Доставка вес, но он подгружается в виде атрибута. Возможно поможет такая запись

if ($requisite_name=="Вес") {
      update_post_meta($post_id,"_weight",$requisite['Значение'][0]);
}
weight

Изображение. 1С позволяет задавать изображение и оно успешно импортируется на сайт. Но зачастую, это не очень удобно. Лучше изображениями наполнять на стороне сайта. При импорте они не стираются.

Артикул. Данное поля не всегда заполняется в 1С. Как альтернатива, можно в поле артикул подгружать код товара 1С.

Цена. Корректно подгружается из 1С. Цена распродажи, скидки задаются на стороне сайта. они не затираются. При формировании заказа поступают в 1С уже со скорректированными на сайте ценами.

Количество. Поле переносится на сайт корректно. Есть количество товара из 1С приходит равным 0, то у товара меняется статус наличия (stock_status) с instock (в наличии) на outofstock (нет в наличии). Если мы хотим игнорировать статус наличия, продавать товары и при 0 остатке (делать предзаказ), то нужно закомментировать в файле woocommerce-and-1centerprise-data-exchange/exchange/offers.php строки:

//$stock_status = $quantity > 0 ? 'instock' : 'outofstock';
//@wc_update_product_stock_status($post_id, $stock_status);

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

Галерея WC, метки, дополнительные таксономии и поля, при выгрузке из 1С сохраняются!

Удаление товара из 1С

При удалении товара или категории в 1С на сайте товар или категория сохраняются. Их нужно удалять вручную.

Заказы

Заказы поступающие в 1С передают следующую информацию: наименование, количество и цену товара (если цена изменена на сайте в виде скидки поступит измененная цена), комментарий к заказу, № и дата заказа. Полей доставка и данных о покупателе в заказе 1С нет.

При поступлении заказа в 1С все заказчики выгружаются под наименованием «Гость». Чтобы это изменить — редактируем файл /exchange/query.php. Находим соответствующую строку и меняем Гость на что угодно.

Ошибки, проблемы

1. Модуль конфликтует с плагином слайдером, конкретно с функцией сохранения. Ругается на выделенную в коде строку:

if (!wp_verify_nonce($_POST['atb_nonce'], __FILE__)) return false; // Проверка, что сохраняется именно нужная нам страница.
Вылечилось удалением этой строки. Данная строка была ошибочным решением самого плагина.

2. Некоторые товары выгружаются как вариативные. Происходит это из-за того что у позиции 1С есть несколько характеристик, которые по сути являются вариациями товара (варианты упаковки, количество и т.д.).

3. При обновлении товара у него обновляется дата публикации. По-хорошему надо сделать чтоб менялась дата изменения.
Решение: находим в файле exchange/import.php такие строки кода

'post_date' => $post_date,
'post_date_gmt' => get_gmt_from_date($post_date),

и меняем их на

'post_modified' => $post_date,
'post_modified_gmt' => get_gmt_from_date($post_date),

4. При обновлении товар перестает быть акционным. При этом акционная цена у него не затирается, но он каким то образом не проходит проверку is_on_sale. Если просто обновить карточку товара, то он снова становиться акционным. Происходит это скорее всего из-за особенности обновления метаполей wordpress.

Проблему решил следующим образом — удалил из файла /exchange/offers.php эту часть кода:

if (!is_null($price)) {
    $sale_price = @$current_post_meta['_sale_price'];
    $sale_price_from = @$current_post_meta['_sale_price_dates_from'];
    $sale_price_to = @$current_post_meta['_sale_price_dates_to'];
    if (empty($current_post_meta['_sale_price'])) {
      $post_meta['_price'] = $price;
    }
    else {
      if (empty($sale_price_from) && empty($sale_price_to)) {
        $post_meta['_price'] = $current_post_meta['_sale_price'];
      }
      else {
        $now = strtotime('now', current_time('timestamp'));
        if (!empty($sale_price_from) && strtotime($sale_price_from) < $now) {
          $post_meta['_price'] = $current_post_meta['_sale_price'];
        }
        if (!empty($sale_price_to) && strtotime($sale_price_to) < $now) {
          $post_meta['_price'] = $price;
          $post_meta['_sale_price_dates_from'] = '';
          $post_meta['_sale_price_dates_to'] = '';
        }
      }
    }
}

5. Первичная загрузка позиций прошла успешно. А обновление каталога (ручное) выдает ошибку WP Error: empty_term_name: Требуется название этого элемента. Нужно в файле exchange.php (строка 622) добавить к аргументу указание массива:

$wc1c_group->Наименование
поменять на
(string)$wc1c_group->Наименование

6. Ошибка кодировки в файле /exchange/query.php при формировании заказов для передачи в 1С. Нужно изменить направление кодировки:

return iconv("windows-1251", "utf-8", $buffer);

или альтернативная версия

return mb_convert_encoding($buffer, 'windows-1251', 'UTF-8');

Некоторые моменты на стороне 1С

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

Интересная статья про переговоры на счет интеграции сайта и 1С.
Принцип обмена данными сайта с 1С

[site-socialshare]
  • Похожие записи
  • Комментарии
  • Вложения
WooCommerce AJAX Products Filter

WooCommerce AJAX Products Filter

Раннее данный фильтр участвовал в общем обзоре, в котором я приводил основные особенности. Рассмотрим подробнее работу с фильтром WooCommerce AJAX Products Filter (также он называется Advanced AJAX Product Filters). Работа Читать далее »

/
Акция 20% на каждый 3 и 30% на каждый 4 товар

Акция 20% на каждый 3 и 30% на каждый 4 товар

Поступила нестандартная задача, реализовать акцию 20% на каждый 3 и 30% на каждый 4 товар. Сложность заключалась в том что скидки 20% и 30% должны были действовать на товары начиная Читать далее »

Процесс заказа WC

Процесс заказа WC

Все что связано с процессом непосредственно заказа. Особенно после того как пользователь нажимает кнопку Оформить заказ. Редирект после оформления заказа После оформления стандартного заказа woocommerce происходит редирект на шаблон успешного Читать далее »

Добавить комментарий

21 комментарий

  1. Николай

    Добрый день! К сожалению, документации и мануалов по установке вышеописанного плагина в сети очень мало. Не могли бы Вы написать пару строк о том, с чего начать, после того как плагин загрузился на WP?

    1. Alexandr

      Дело в том, что я прибегал к помощи специалистов — они настраивали обмен на стороне 1С. В будущем планирую более детально разобраться в данном вопросе..

  2. Рус

    Я чтото не понял.. єто плагин Даниила Семенова описан?? Или что

    1. Alexandr

      Да, здесь описан плагин Данила Семеленова.

  3. Данил

    В иторе какой результат? Удалось реализовать? Сколько товаров проходит через обмен? И можете ли дать контакты тех, кто все настраивал?

    1. Alexandr

      Я обращался в компанию ENTEREGO. Синхронизировали 2 сайта, все работает (обменивается) успешно.

  4. Рося

    Сталкивался ли кто с проблемой переезда сайта на https? Когда в 1С пытаюсь синхронизироваться с сайтом, то выдаёт ошибку «Подключиться к серверу не удалось. Ошибка авторизации». Когда сайт был на http, то всё было хорошо

    1. Alexandr

      В 1С в настройках обмена изменили протокол сайта на https?

  5. Александр

    Здравствуйте! У меня не получается обменяться заказами. С сайта заказы не выгружаются.
    Пожалуйста, помогите разобраться
    Вот что пишет в ошибке:

    PHP Unknown Error: Функция status вызвана неправильно. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, wc1c_template_redirect, wc1c_exchange, wc1c_mode_query, include('/plugins/woocommerce-and-1centerprise-data-exchange/exchange/query.php'), WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong Дополнительную информацию можно найти на странице <a href="https://codex.wordpress.org/Debugging_in_WordPress">&laquo;Отладка в WordPress&raquo;</a>. (Это сообщение было добавлено в версии 3.0.) in /home/vtrendes/domains/vtrendeshop.com/public_html/wp-includes/functions.php on line 4161.#0  wc1c_error(Функция status вызвана <strong>неправильно</strong>. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, wc1c_template_redirect, wc1c_exchange, wc1c_mode_query, include('/plugins/woocommerce-and-1centerprise-data-exchange/exchange/query.php'), WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong Дополнительную информацию можно найти на странице <a href="https://codex.wordpress.org/Debugging_in_WordPress">&laquo;Отладка в WordPress&raquo;</a>. (Это сообщение было добавлено в версии 3.0.) in /home/vtrendes/domains/vtrendeshop.com/public_html/wp-includes/functions.php on line 4161, PHP Unknown Error) called at [/home/vtrendes/domains/vtrendeshop.com/public_html/wp-content/plugins/woocommerce-and-1centerprise-data-exchange/exchange.php:142]#1  wc1c_strict_error_handler(1024, Функция status вызвана <strong>неправильно</strong>. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, wc1c_template_redirect, wc1c_exchange, wc1c_mode_query, include('/plugins/woocommerce-and-1centerprise-data-exchange/exchange/query.php'), WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong Дополнительную информацию можно найти на странице <a href="https://codex.wordpress.org/Debugging_in_WordPress">&laquo;Отладка в WordPress&raquo;</a>. (Это сообщение было добавлено в версии 3.0.), /home/vtrendes/domains/vtrendeshop.com/public_html/wp-includes/functions.php, 4161, Array ([function] => status,[message] => Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, wc1c_template_redirect, wc1c_exchange, wc1c_mode_query, include('/plugins/woocommerce-and-1centerprise-data-exchange/exchange/query.php'), WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong Дополнительную информацию можно найти на странице <a href="https://codex.wordpress.org/Debugging_in_WordPress">&laquo;Отладка в WordPress&raquo;</a>.,[version] => (Это сообщение было добавлено в версии 3.0.)))#2  trigger_error(Функция status вызвана <strong>неправильно</strong>. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, wc1c_template_redirect, wc1c_exchange, wc1c_mode_query, include('/plugins/woocommerce-and-1centerprise-data-exchange/exchange/query.php'), WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong Дополнительную информацию можно найти на странице <a href="https://codex.wordpress.org/Debugging_in_WordPress">&laquo;Отладка в WordPress&raquo;</a>. (Это сообщение было добавлено в версии 3.0.)) called at [/home/vtrendes/domains/vtrendeshop.com/public_html/wp-includes/functions.php:4161]#3  _doing_it_wrong(status, Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, wc1c_template_redirect, wc1c_exchange, wc1c_mode_query, include('/plugins/woocommerce-and-1centerprise-data-exchange/exchange/query.php'), WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong, 3.0) called at [/home/vtrendes/domains/vtrendeshop.com/public_html/wp-content/plugins/woocommerce/includes/wc-deprecated-functions.php:116]#4  wc_doing_it_wrong(status, Order properties should not be accessed directly., 3.0) called at [/home/vtrendes/domains/vtrendeshop.com/public_html/wp-content/plugins/woocommerce/includes/legacy/abstract-wc-legacy-order.php:407]#5  WC_Abstract_Legacy_Order->__get(status) called at [/home/vtrendes/domains/vtrendeshop.com/public_html/wp-content/plugins/woocommerce-and-1centerprise-data-exchange/exchange/query.php:141]#6  include(/home/vtrendes/domains/vtrendeshop.com/public_html/wp-content/plugins/woocommerce-and-1centerprise-data-exchange/exchange/query.php) called at [/home/vtrendes/domains/vtrendeshop.com/public_html/wp-content/plugins/woocommerce-and-1centerprise-data-exchange/exchange.php:474]#7  wc1c_mode_query(sale) called at [/home/vtrendes/domains/vtrendeshop.com/public_html/wp-content/plugins/woocommerce-and-1centerprise-data-exchange/exchange.php:511]#8  wc1c_exchange() called at [/home/vtrendes/domains/vtrendeshop.com/public_html/wp-content/plugins/woocommerce-and-1centerprise-data-exchange/exchange.php:533]#9  wc1c_template_redirect()#10 call_user_func_array(wc1c_template_redirect, Array ([0] => )) called at [/home/vtrendes/domains/vtrendeshop.com/public_html/wp-includes/class-wp-hook.php:286]#11 WP_Hook->apply_filters(, Array ([0] => )) called at [/home/vtrendes/domains/vtrendeshop.com/public_html/wp-includes/class-wp-hook.php:310]#12 WP_Hook->do_action(Array ([0] => )) called at [/home/vtrendes/domains/vtrendeshop.com/public_html/wp-includes/plugin.php:453]#13 do_action(template_redirect) called at [/home/vtrendes/domains/vtrendeshop.com/public_html/wp-includes/template-loader.php:12]#14 require_once(/home/vtrendes/domains/vtrendeshop.com/public_html/wp-includes/template-loader.php) called at [/home/vtrendes/domains/vtrendeshop.com/public_html/wp-blog-header.php:19]#15 require(/home/vtrendes/domains/vtrendeshop.com/public_html/wp-blog-header.php) called at [/home/vtrendes/domains/vtrendeshop.com/public_html/index.php:17]Request URI: http://vtrendeshop.com/?wc1c=exchange?type=sale&mode=queryServer API: litespeedMemory limit: 256MMaximum POST size: 8MPHP version: 5.6.37WordPress version: 4.9.8Plugin version: 0.7r1466555
    1. Alexandr

      Я не подскажу, т.к. подробно этот плагин не знаю. Сам обмен никогда не настраивал.

  6. Viktor

    Александр, подскажите — а картинка только одна у вас выгружается из 1с на каждый товар? Решали ли вы как-то эту проблему? Вы пишете, что картинки из 1с удобнее не использовать, а делать их в админке сайта. Но у вас два сайта — получается нужно для каждого из них делать — не очень удобно должно быть.

    1. Alexandr

      Из 1С выгружал только одно изображение. При этом считаю, что изображения лучше добавлять на сайте.

  7. Прохор

    Здравствуйте. Вы писали: «4. При обновлении товар перестает быть акционным. Проблему решил следующим образом — удалил из файла /exchange/offers.php эту часть кода«.  Я обнаружил, что:
    1. Если код оставить нетронутым, то “_price” в БД принимает значение “_regular_price”, в независимости от наличия “_sale_price” (товар перестает быть акционным после обмена данных, при этом акционная цена у него не затирается, но он каким то образом не проходит проверку is_on_sale)
    2. Если код удалить, то “_price” не принимает значение “_regular_price” (цена перестает обновляться на сайте, либо отображаться на новых товарах, после обмена данных)
    В обоих случаях, если изменить _sale_price, либо _regular_price в карточке товара, то товар снова становиться акционным, либо обновляет цену.
    Использую WP 5.2.2, WC 3.6.5, PHP 7.3.8.
    Помогите понять, почему _sale_price не проходит проверку is_on_sale.

    1. Alexandr

      Я не анализировал, но первое предположение, что при обмене не работает проверка is_on_sale из-за того что на том уровне она не вызывается. Либо может вызываться позже. т.е. в момент обмена это неизвестная функция.

  8. Михаил

    Здравствуйте.
    А проблему с фильтрацией Вы как решили и была ли она?
    По умолчанию все атрибуты проставляются индивидуальные, а по ним фильтрацию не произвести(

    1. Alexandr

      Добрый день! Проблемы не было — атрибуты не были индивидуальными.

  9. Прохор

    Спасибо за подсказку.
    Добавил код в условие, и проверка is_on_sale заработала:
    $current_post_meta = get_post_meta($post_id);
    foreach ($current_post_meta as $meta_key => $meta_value) {
    $current_post_meta[$meta_key] = $meta_value[0];
    }

  10. Дмитрий

    Из 1С выгружал только одно изображение. При этом считаю, что изображения лучше добавлять на сайте.
    Подскажите пожалуйста, как можно сделать, чтобы при импорте стиралось изображение, добавленное на сайте?Уже и так и эдак пробовал, добавлял и в functions темы и в import.php такой код:
    add_filter(‘woocommerce_single_product_image_thumbnail_html’, ‘remove_product_main_image’, 2);
    function remove_product_main_image($html) {
        global $post;
     
        $thumbnail  = ‘#(<div data-thumb=»‘ . get_the_post_thumbnail_url( $post->ID, ‘shop_thumbnail’ ) . ‘» class=»woocommerce-product-gallery__image»>).*?(</div>)#’;
        $html = preg_replace( $thumbnail, », $html );
     
        return $html;
    —  никак что-то..
    Ещё вопрос — как передать атрибуты размера?Точнее — есть в 1С несколько товаров с одним названием и артикулом, но разных размеров, как сделать из них один товар с несколькими позициями размеров и передать на сайт на WP — Woo?Это будет вариативный товар?
     

  11. Сергей

    1с УНФ, изображения выгружаются в галерею. Их надо добавлять в номенклатуру в «файлы» . Вот мой пример https://микрозелень.рус/product/кресс-базилик-микрозелень-в-субстрат/

  12. Виктор

    Здравствуйте.
    При загрузке из 1с фотографии не разнеслись по карточкам товаров. Но загрузились в Медиафайлы.
    Есть решение, как исправить?

    1. Alexandr

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

Интеграция Woocommerce с 1С Интеграция Woocommerce с 1С Интеграция Woocommerce с 1С Интеграция Woocommerce с 1С Интеграция Woocommerce с 1С Интеграция Woocommerce с 1С
Настройка полей заказчика
Рекомендации для васНастройка полей заказчикаOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.