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

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

HIT
Deprecated: Function create_function() is deprecated in /home/t/tiberi6w/opttour.ru/public_html/wp-content/plugins/wp-spamshield/wp-spamshield.php on line 2033

Интеграция 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. Модуль конфликтует с плагином слайдером, конкретно с функцией сохранения. Ругается на выделенную в коде строку:

add_action('save_post', 'atb_box_update');
function atb_box_update($post_id){
	if (!wp_verify_nonce($_POST['atb_nonce'], __FILE__)) return false; // Проверка, что сохраняется именно нужная нам страница.
	if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return false; // Проверка, что это не автосохранение
	if (!current_user_can('edit_post', $post_id)) return false; // Проверка, что пользователь может изменять этот пост
	if(!isset($_POST['extra']) ) return false;	// Проверка, что нам пришли все поля
	foreach($_POST['extra'] as $key=>$value){ // Циклом добавляем поля. Можно и в ручную это делать... Но так проще добавить новое поле
		if(empty($value) AND $value != 0){ // Если значение пустое и не равно 0
			delete_post_meta($post_id, $key); // Удаляем это поле из мета-данных
			continue; // Продолжаем
		}
		update_post_meta($post_id, $key, $value); // Обновляем или добавляем мета-данные
	}
	return $post_id;
}

Вылечилось удалением этой строки

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'] = '';
        }
      }
    }
}

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

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

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

Тэги:

Поделится информацией с друзьями

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

Отделить категории от товаров

В архивах woocommerce выводит категории и товары в один список (если включить настройку выводить категории и товары). Но нам, например, необходимо категории оформить по другому. Для этого нужно отделить категории Читать далее »

Шорткод вывода товаров по метке

Шорткод вывода товаров по метке

Иногда требуется быстро вывести товары с определенной меткой. Данный шорткод еще не испытывал. Без шорткода товары по метке (product_tag) выводятся так: В данном примере также приведена верстка для функционала карусели Читать далее »

/
Интересные фишки для Woocommerce

Интересные фишки для Woocommerce

Продолжаем серию интересных доработок для Woocmmerce. Выведем дату последней покупки товара У товара такого мета поля нет, нужно сопоставлять наименования (перебирая заказы). Для этого создаем запрос на перебор БД: В Читать далее »

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

17 комментариев

  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];
    }

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