/ Адаптивность / Интеграция 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С

Поделиться в соц. сетях:

  • Похожие записи
  • Комментарии
  • Вложения
Обзор плагинов по созданию скидок

Обзор плагинов по созданию скидок

Рассмотрим различные плагины по созданию функционала скидок. Рассматриваться будут плагины которые предоставляют возможность комплексного формирования скидок на состав корзины. Практически все плагины в обзоре могут в бесплатной версии предоставить простой Читать далее »

Подарочные сертификаты

Подарочные сертификаты

Рассмотрим такой инструмент маркетинга как подарочные сертификаты, в ракурсе продажи его электронной версии. PW WooCommerce Gift (10 000) Алгоритм следующий: создает новый тип товара PW Gift Card. В котором можно Читать далее »

Вариативный товар

Вариативный товар

Вариативный товар — один из типов товаров плагина интернет-магазина Woocommerce. Суть вариативного товара в том, что мы создаем несколько вариантов исполнения одного товара (размер, цвет, емкость и т.д.), и в Читать далее »

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

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

  1. Аватар
    Николай

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

    1. Alexandr
      Alexandr

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

  2. Аватар
    Рус

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

    1. Alexandr
      Alexandr

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

  3. Аватар
    Данил

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

    1. Alexandr
      Alexandr

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

  4. Аватар
    Рося

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

    1. Alexandr
      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
      Alexandr

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

  6. Аватар
    Viktor

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

    1. Alexandr
      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
      Alexandr

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

  8. Аватар
    Михаил

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

    1. Alexandr
      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
      Alexandr

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

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