Интеграция Woocommerce с 1С — довольно сложная тема с множеством нюансов. Буду описывать на что стоит обращать внимание, с какими проблемами пришлось столкнуться.
Плагин 1С:Предприятие Data Exchange
Так как не имею опыта в интеграции 1С и сайта, обратился в фирму специализирующуюся на этом. Процесс интеграции пока продолжается, поэтому данные об организации и оценку работы по взаимодействию с ними опишу по завершении. Единственно упомяну, что процесс интеграции дело не быстрое!
Процесс интеграции на стороне сайта основывается на плагине Данила Семеленова «Обмен данным между WooCommerce и 1С:Предприятием».
Принцип работы модуля следующий: обновленные в 1С позиции по заданному графику выгружаются на сайт. Заказы поступающие на сайт в свою очередь выгружаются в 1С.
Соответствие полей 1С = WC
Наименование. В 1С часто данное поле не аккуратное, т.е. заполняется закупщиками как придется. Для наименования нужно (лучше) заводить специальное поле — Наименование для интернет-магазина.
Описание. Описание из 1С импортируется в сайт. Нужно настроить так, чтоб краткое описание из 1С переносилось в поле woocommece Краткое описание товара. А основное (полное) описание товара заполнялось на стороне сайта и не затиралось при обновлении позиции. В данный момент поле Основное описание затирается.
Категории/подкатегории. При импорте в сайт в WC создаются те же категории/подкатегории что и 1С. При этом описание и изображение категории задается на сайте, и не затирается при очередной выгрузке. Наименование категории каждый раз обновляется из 1С.
- Все папки должны быть названы в одном стиле. Название строчными буквами с большой буквы (Категория), множественное/единственное число — в названиях должно быть единым.
- Стараться избегать лишних вложенностей папок. Чтоб не получились категории с 1-2 товарами. И наоброт очень большие папки нужно разбивать на подкатегории (либо использовать фильтр).
- Отказаться от служебных названий (Распродажа, Остатки, Непроданное и пр.), т.к. данные наименования могут появится на сайте
- Не использовать в названии папок 1С каких либо символов: *_-()№,. Если это не обусловлено специальной необходимостью
Свойства. Поля из вкладки 1С свойства импортируются в атрибуты товара WC. Если на сайте создать для товара какие-либо атрибуты — при импорте из 1С они сотрутся. Так же в атрибуты подгружаются некоторые поля из вкладки По-умолчанию.
Вес. Исходно вес подставляется не в то поле. Должен ставится в вкладку Доставка вес, но он подгружается в виде атрибута. Возможно поможет такая запись
if ($requisite_name=="Вес") {
update_post_meta($post_id,"_weight",$requisite['Значение'][0]);
}
Изображение. 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);
Если товаров много и многие уже по факту оказались не в наличии при очередной выгрузке, то массово проставляем им статус в наличии и желательно разрешение на предзаказ.
Удаление товара из 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С
Добрый день! К сожалению, документации и мануалов по установке вышеописанного плагина в сети очень мало. Не могли бы Вы написать пару строк о том, с чего начать, после того как плагин загрузился на WP?
Дело в том, что я прибегал к помощи специалистов — они настраивали обмен на стороне 1С. В будущем планирую более детально разобраться в данном вопросе..
Я чтото не понял.. єто плагин Даниила Семенова описан?? Или что
Да, здесь описан плагин Данила Семеленова.
В иторе какой результат? Удалось реализовать? Сколько товаров проходит через обмен? И можете ли дать контакты тех, кто все настраивал?
Я обращался в компанию ENTEREGO. Синхронизировали 2 сайта, все работает (обменивается) успешно.
Сталкивался ли кто с проблемой переезда сайта на https? Когда в 1С пытаюсь синхронизироваться с сайтом, то выдаёт ошибку «Подключиться к серверу не удалось. Ошибка авторизации». Когда сайт был на http, то всё было хорошо
В 1С в настройках обмена изменили протокол сайта на https?
Здравствуйте! У меня не получается обменяться заказами. С сайта заказы не выгружаются.
Пожалуйста, помогите разобраться
Вот что пишет в ошибке:
Я не подскажу, т.к. подробно этот плагин не знаю. Сам обмен никогда не настраивал.
Александр, подскажите — а картинка только одна у вас выгружается из 1с на каждый товар? Решали ли вы как-то эту проблему? Вы пишете, что картинки из 1с удобнее не использовать, а делать их в админке сайта. Но у вас два сайта — получается нужно для каждого из них делать — не очень удобно должно быть.
Из 1С выгружал только одно изображение. При этом считаю, что изображения лучше добавлять на сайте.
Здравствуйте. Вы писали: «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.
Я не анализировал, но первое предположение, что при обмене не работает проверка is_on_sale из-за того что на том уровне она не вызывается. Либо может вызываться позже. т.е. в момент обмена это неизвестная функция.
Здравствуйте.
А проблему с фильтрацией Вы как решили и была ли она?
По умолчанию все атрибуты проставляются индивидуальные, а по ним фильтрацию не произвести(
Добрый день! Проблемы не было — атрибуты не были индивидуальными.
Спасибо за подсказку.
Добавил код в условие, и проверка 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];
}
Из 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?Это будет вариативный товар?
1с УНФ, изображения выгружаются в галерею. Их надо добавлять в номенклатуру в «файлы» . Вот мой пример https://микрозелень.рус/product/кресс-базилик-микрозелень-в-субстрат/
Здравствуйте.
При загрузке из 1с фотографии не разнеслись по карточкам товаров. Но загрузились в Медиафайлы.
Есть решение, как исправить?
Не сталкивался с данным вопросом. Изображения из 1С никогда не передавались, загружались и назначались уже на стороне сайта.