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

Так как не имею опыта в интеграции 1С и сайта, обратился в фирму специализирующуюся на этом. Процесс интеграции пока продолжается, поэтому данные об организации и оценку работы по взаимодействию с ними опишу по завершении. Единственно упомяну, что процесс интеграции дело не быстрое!
Процесс интеграции на стороне сайта основывается на плагине Данила Семеленова «Обмен данным между WooCommerce и 1С:Предприятием».
Принцип работы модуля следующий: обновленные в 1С позиции по заданному графику выгружаются на сайт. Заказы поступающие на сайт в свою очередь выгружаются в 1С.
Соответствие полей 1С = WC
Наименование. В 1С часто данное поле не аккуратное, т.е. заполняется закупщиками как придется. Для наименования нужно (лучше) заводить специальное поле — Наименование для интернет-магазина.
Описание. Описание из 1С импортируется в сайт. Нужно настроить так, чтоб краткое описание из 1С переносилось в поле woocommece Краткое описание товара. А основное (полное) описание товара заполнялось на стороне сайта и не затиралось при обновлении позиции. В данный момент поле Основное описание затирается.
Куда записывается поле Описание из 1С в полое или краткое описание на сайте — это не важно, т.к. всегда можно поменять их местами в шаблоне вывода
Категории/подкатегории. При импорте в сайт в WC создаются те же категории/подкатегории что и 1С. При этом описание и изображение категории задается на сайте, и не затирается при очередной выгрузке. Наименование категории каждый раз обновляется из 1С.
Структура каталога товаров на сайте будет полностью дублировать структуру папок с 1С. Поэтому стоит этому уделить особое внимание!

- Все папки должны быть названы в одном стиле. Название строчными буквами с большой буквы (Категория), множественное/единственное число — в названиях должно быть единым.
- Стараться избегать лишних вложенностей папок. Чтоб не получились категории с 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]); }

Изображение. 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С
Добрый день! К сожалению, документации и мануалов по установке вышеописанного плагина в сети очень мало. Не могли бы Вы написать пару строк о том, с чего начать, после того как плагин загрузился на 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/кресс-базилик-микрозелень-в-субстрат/