К основному контенту

Импорт товаров из 1С-Битрикс в 1С Предприятие УТ 11 - опыт использования стандартного функционала

В прошлый раз, когда я делала клиенту импорт товаров из 1С-Битрикс в 1С Предприятие УТ мы с 1С-программистом делали какую-то жуткую кастомизацию по его инициативе, и от стандартного импорта там остались только рожки да ножки. Сейчас со мной работает другой 1С-программист, и мы стараемся сначала выжать максимум из стандартного функционала, а уж потом, если этого мало — переходим к кастомизации.

Итак передо мной встала задача импортировать 36 000 с хвостом товаров из 1С-Битрикс в 1С УТ 11.1.6. Битрикс обновлен до самой свежей версии, на 1С УТ установлено битриксоидовское дополнение.

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

1) Уникальность рабочих наименований.
Когда у нас на сайте 36 000 товаров в 300х разделах, их наименования, естественно, не уникальны. В 1С УТ же по-умолчанию включен контроль их уникальности, в следствии чего импорт товаров через помощник импорта товаров с сайта завершается с ошибкой.
Открываем конфигурацию 1С УТ в режиме предприятия, идем в Администрирование — Настройка параметров системы — Номенклатура Снимаем галочку «Контроль уникальности...»



2) Список свойств, которые могут быть импортированы — не описан пока в документации, поэтому пришлось выявить его, почитав код обработки «Помощник импорта товаров». Это:
CML2_ARTICLE — артикул
CML2_BASE_UNIT — базовая единица
Помимо этого в тексте обработки перебираются и записываются в дополнительные сведения о номенклатуре все остальные свойства с префиксом CML2_

Для того, чтобы сайт корректно отдал эти свойства 1С-ке, в настройке свойств инфоблоков свойствам нужно задать соответствующие внешние коды:


3) Меня так же интересовал момент, предусматривает ли обработка апдейт элемента номенклатуры — или только вставку и по какому полю контролируется наличие элемента в справочнике.
Апдейта нет — только вставка.
В качестве уникального идентификатора номенклатуры используется
Номенклатура.Б_Идентификатор = СтрокаТовара.Ид;

В это ИД товара Битрикс вписывает XML_ID товара, если оно задано и обычное ID товара, если XML_ID не задано. У меня  XML_ID были заданы, так я изначально наполняла сайт заказчика через свой модуль импорта из YML файлов, предоставленных поставщиком.
Если у вас на сайте не заданы XML_ID — рекомендую их сгенерировать — к примеру, можно сделать их равными ID. Какой смысл? Это решит в дальнейшем проблему обмена в другую сторону и проблему с обменом заказами.

4) Механизм  — нужно протестировать перед финальной загрузкой, которая даже на очень мощном сервере будет длиться очень долго.

На стороне сайта я тестирую выгрузку так:
- авторизуюсь на сайте
- вбиваю в строку браузера запрос:
http://адрес_сайта/bitrix/admin/1c_exchange.php?type=get_catalog&mode=init
получаю
zip=yes
- вбиваю следующий запрос:
http://адрес_сайта/bitrix/admin/1c_exchange.php?type=get_catalog&mode=query
Сайт отдает кусочек xml-файла. Он не выглядит как xml-файл — это нормально — он не целый и не завершенный. 1С-ка когда прихоит на сайт за каталогом посылает этот запрос до тех пор, пока не заберет весь файл по кусочкам.

Однако, то, как выгружаются товары — мы видим, проверяем, выгружается ли все так, как нужно.

Далее мне необходимо как-то сначала протестировать импорт на стороне 1С Предприятия на маленьком кусочке. Потому что, если все 36 000 товаров загрузятся неправильно, потом можно успеть состариться, пока дождешься их удаления — мы ведь проапдейтить их в следующий проход импорта не сможем. Я хочу протестировать обмен сначала на 100-200х товаров — думаю, этого будет достаточно. Для этого я копирую компонент экспорта каталога catalog.export.1c в свое пространство имен.

В своем кастомном компоненте я нахожу место

elseif($_GET["mode"] == "query")
{

И дописываю:

if ($_SESSION["BX_CML2_EXPORT"]["current"]>100) $_SESSION["BX_CML2_EXPORT"]["step"]=4;

Делаю свой скрипт обмена 1c_exchange2.php, в котором подключаю свой компонент вместо стандартного.

elseif($type=="get_catalog")
{
$APPLICATION->IncludeComponent("bedrosova:catalog.export.1c", "", Array(
"IBLOCK_ID" => COption::GetOptionString("catalog", "1CE_IBLOCK_ID", ""),
"INTERVAL" => COption::GetOptionString("catalog", "1CE_INTERVAL", "-"),
"ELEMENTS_PER_STEP" => COption::GetOptionString("catalog", "1CE_ELEMENTS_PER_STEP", 100),
"GROUP_PERMISSIONS" => explode(",", COption::GetOptionString("catalog", "1CE_GROUP_PERMISSIONS", "1")),
"USE_ZIP" => COption::GetOptionString("catalog", "1CE_USE_ZIP", "Y"),
)
);
}

Мой скрипт  1c_exchange2.php будет отдавать 1С-ке только 100+N товаров. N – количество товаров, выгружаемых за 1 шаг. Вписываю в помощнике импорта адрес своего скрипта и запускаю импорт.

После того, как товары загружены — начинается загрузка картинок. На этом этапе может вывалиться ошибка «Реквизит для группы не найден» - она может возникнуть, если есть группа с таким же уникальным айдишником, как товар (на стороне сайта придется дополнительно перепроверять сквозную уникальность XML_ID групп и товаров).

Радуемся - товары успешно загрузились в 1С Предприятие УТ. У них есть наименование, артикул, привзяка к группе, картинка, а так же дополнительные свойства - в дополнительных сведениях. Когда потом с сайта придут заказы - 1С однозначно идентифицирует товары заказа по XML_ID, а складовщик посмотрит на картинку - и не ошибется при отгрузке.


Помощник импорта товаров в 1с с сайта на Битрикс — в целом пригоден для одноразовой загрузки номенклатуры  без дополнительной кастомизации. Единственное, плохо, что обработка выполняется очень медленно. Я расстрою тех, кто собирался развернуть 1С УТ на своем ноутбуке.

Но для москвичей это не проблема. Ведь в вашем городе живет и работает мой надежный  партнер Вячеслав Мишаков (тел. 8 499 70 77 118) - руководитель компании КМ Системс. Специалисты КМ Системс соберут для вас сервер под 1С Предприятие УТ, идеально подходящий для последующей синхронизации с 1С Битрикс. Ребята сами привезут к вам сервер, настроят его, установят 1С Предприятие, подключат его к локальной сети, разграничат доступ для ваших сотрудников, будут оказывать регулярную техподдержку сервера. Для тех, кто еще не созрел для покупки собственного сервера, КМ Системс предлагает разместить 1С Предприятие в их датацентре. Захожу на их сервера, чтобы интегрировать 1С Предприятие клиентов с 1С-Битрикс и радуюсь - не работа, а удовольствие.

Комментарии

Крымчанин написал(а)…
Цены он при этом не выгружает с сайта?
Unknown написал(а)…
подскажите на какой платформе создавать интернет-магазин, что б потом на было проблем с синхронизацией с 1С, спасибо
Юлия написал(а)…
Конечно, на Битрикс
Unknown написал(а)…
Честно ничего не понял, точнее понял но может не увидел главное, как из 1С Битрикс эспортировать товары в 1С Предприятие куда зайти что нажать и тд
Как Экспортировать товары на сайт из 1С понятно, но как обратно если я допустим хочу заполнить номенклатура полностью 1С товарами и группами из 1С Битрикс?

Популярные сообщения из этого блога

Git обновить текущую ветку из master

Если разработка велась в ветке, и за время этой разработки ветка master сильно изменилась, лучше не вливать ветку сразу в мастер, а сначала влить мастер в ветку – чтобы предварительно протестировать. Для этого нужно переключиться на ту ветку, в которую мы будем вливать мастер, а затем выполнить команду git pull origin master Cкорее всего, после этого возникнут конфликты – гит скажет об этом. Чтобы просмотреть все файлы, в которых произошли конфликты, нужно выполнить команду git status После разрешения конфликтов, нужно сделать коммит, а потом снова выполнить git pull origin master Таким же образом можно периодически вливать в ветку новые изменения из мастера, если нужно, чтобы ветка не сильно «отошла» от основной версии проекта.

О лишних запросах

Совершенство достигается не тогда, когда уже нечего прибавить, но когда уже ничего нельзя отнять Антуан де Сент-Экзюпери Оптимизация процесса интеграции 1С Предприятия и 1С Битрикс – это неисчерпаемая тема.  Чего только не увидишь порой в обработчиках событий добавления и обновления элемента инфоблока. Больше всего меня убивает, когда я вижу, что разработчики тянут из базы то, что у них и так уже есть. Пример из жизни (нет, серьезно – это реальный пример): AddEventHandler("iblock", "OnAfterIBlockElementAdd", "BXMUpdateElement_FIELDS"); function BXMUpdateElement_FIELDS(&$arFields) {          $ibe = new CIBlockElement();          $dbr = $ibe->GetList(array(), array('ID'=>$arFields['ID']) );     while($oe = $dbr->GetNextElement())     {         $arP = $oe->GetProperty('CML2_TRAITS');           } …         } А то, что нужно – уже передано в обработчик в $arFields['PROPERTY_VALUES'][92] Зачем