Интеграция с несколькими информационными базами "1С: Предприятие"

Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


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

Задача интеграции магазинов на Битрикс с несколькими информационными базами 1С Предприятие - возникает достаточно часто. Например, когда необходимо настроить работу 2х и больше интернет-магазинов на одном ядре Битрикс или в случае, когда каталог магазина должен наполняться товарами от разных поставщиков. На данную тему написано не мало статей, и я не буду подробно останавливаться на общей технологии настройки обмена в данном случае. Напомню, как делают:

Как вариант: создают несколько копий файлов
http://<сайт>/bitrix/admin/1c_import.php и
http://<сайт>/bitrix/admin/1c_exchange.php
, а затем в настройках со стороны 1с прописывают для каждой базы свой путь.

А дальше и возникают некоторые проблемы, перед которыми пасуют многие  разработчики.
Дело в том, что если просто сделать несколько копий скриптов обмена, каждая база сможет отдавать свои товары на сайт, но нельзя будет запустить обмен данными из нескольких баз одновременно. Часто эту проблему можно решить, настроив расписание запуска обмена на стороне 1С. Но вот однажды я столкнулась с ситуаций, когда клиенту было необходимо загружать товары из 9ти информационных баз, каталог товаров в каждой базе был обширным, и клиенту хотелось, чтобы данные об остатках товаров на складах передавались на сайт как можно чаще. В этой ситуации было не обойтись без одновременного импорта товаров из нескольких информационных баз.

И тогда я подумала: "Не может быть, чтобы для Битикс было невозможно это сделать. Разработчики должны были предусмотреть возможность для этого". Я скопировала компонент
catalog.import.1c в свою область видимости и занялась его кастомизацией.

Первое, что бросилось мне в глаза в исходном коде компонента – это вот это строка №374


$rs = $DB->Query("sel ect count(*) C fr om b_xml_tree where PARENT_ID = ".intval($NS["XML_ELEMENTS_PARENT"]));

Здесь явно прописано имя временной таблицы, куда в процессе импорта загружается xml файл, пришедший от 1с. Естественно, если несколько баз одновременно начнут писать свои данные в одну и ту же таблицу – импорт не пройдет корректно. Поэтому я добавила к своему кастомизированному компоненту новый параметр IB_ID – уникальный идентификатор, чтобы иметь возможность разнести процесс импорта из разных баз по разным временным таблицам, и переписала эту строку следующим образом:


$rs = $DB->Query("select count(*) C fr om b_xml_tree”. $arParams["IB_ID"].” wh ere PARENT_ID = ".intval($NS["XML_ELEMENTS_PARENT"]));

Но это еще не все: имя таблицы b_xml_tree прописано в качестве параметра по-умолчанию в конструкторах вот этих двух классов: CIBlockCMLImport и CIBlockXMLFile

Но при создании объектов этих классов в компоненте можно передать им другое имя таблицы.
В стандартном компоненте написано так: (не в одном месте)


$obCatalog = new CIBlockCMLImport;
$obCatalog->InitEx($NS, array(
"files_dir" => $WORK_DIR_NAME,
"use_crc" => $arParams["USE_CRC"],
"preview" => $preview,
"detail" => $detail,
"use_offers" => $arParams["USE_OFFERS"],
"use_iblock_type_id" => $arParams["USE_IBLOCK_TYPE_ID"],
"translit_on_add" => $arParams["TRANSLIT_ON_ADD"],
"translit_on_update" => $arParams["TRANSLIT_ON_UPDATE"],
"translit_params" => $arTranslitParams,
"skip_root_section" => $arParams["SKIP_ROOT_SECTION"],
;));
Я переписала вот так:


$obCatalog = new CIBlockCMLImport;
$obCatalog->InitEx($NS, array(
"files_dir" => $WORK_DIR_NAME,
"use_crc" => $arParams["USE_CRC"],
"preview" => $preview,
"detail" => $detail,
"use_offers" => $arParams["USE_OFFERS"],
"use_iblock_type_id" => $arParams["USE_IBLOCK_TYPE_ID"],
"translit_on_add" => $arParams["TRANSLIT_ON_ADD"],
"translit_on_update" => $arParams["TRANSLIT_ON_UPDATE"],
"translit_params" => $arTranslitParams,
"skip_root_section" => $arParams["SKIP_ROOT_SECTION"],
"table_name" => "b_xml_tree".$arParams["IB_ID"],
;));
В одном месте в компоненте был использован конструктор по-умолчанию:


$obCatalog = new CIBlockCMLImport;
$obCatalog->Init($NS);
Я не сразу заметила его, и потом долго искала, почему ничего не получается. Заметив, заменила на конструктор с параметрами, как было показано выше.

Методы класса CIBlockXMLFile в стандартном компоненте импорта товаров из 1С в Битрикс были вызваны как статичные методы:


CIBlockXMLFile::DropTemporaryTables();
...
CIBlockXMLFile::CreateTemporaryTables();
...
Но я создала в начале компонента объект этого класса, передав ему имя таблицы "b_xml_tree".$arParams["IB_ID"],



$obXMLF = new CIBlockXMLFile("b_xml_tree".$arParams["IB_ID"]);

И все места, где методы этого класса были вызваны, как статичные методы, поправила так, чтобы вызывать эти методы именно для моего объекта.


$obXMLF ->DropTemporaryTables();
...
$obXMLF ->CreateTemporaryTables();
...
Так же я поправила вот этот кусочек  


$obXMLFile = new CIBlockXMLFile;
if($obXMLFile->ReadXMLToDat abase($fp, $NS, $arParams["INTERVAL"]))
заменив его таким:


if($obXMLF ->ReadXMLToDat abase($fp, $NS, $arParams["INTERVAL"]))
и вот эту строку компонента


$DIR_NAME = "/".COption::GetOptionString("main", "upload_dir", "upload";)."/1c_catalog";
Я тоже параметризировала, чтобы файлы, пришедший от разных баз раскладывались по разным папкам.


$DIR_NAME = "/".COption::GetOptionString("main", "upload_dir", "upload";)."/1c_catalog".$arParams["IB_ID"];
После этого я подключила свой кастомизированный компонент в скрипте импорта вместо стандартного. 1С программист из IT отдела клиента придумал, как сделать мой метод красивее: вместо того чтобы создавать несколько файлов импорта, я создала один, а параметр IB_ID 1C Программист передал в GET – запросе, кастомизировав 1С обработку на своей стороне.

Но если нет возможности передать этот параметр из 1С, можно просто создать несколько файлов импорта, в каждом из них указать при подключении компонента импорта любой придуманный IB_ID – главное, чтобы для каждого файла, он был уникальным, и указать в каждой информационной базе путь к своему скрипту импорта. После этого импорт каталога из 1С Предприятия в Битрикс может идти одновременно из нескольких информационных баз.

Данное решение было внедрено мной в ЗАО «ИСТОК» http://www.istoksochi.ru/
Для этого же интернет-магазина, мною был кастомизирован и компонент экспорта заказов из Битрикса в 1С для того, чтобы каждая база могла забирать с сайта свои заказы. Возможно, я напишу об этом подробнее в одном из будущих постов.

Оригинал статьи в моем блоге на blogspot: http://bedrosova.blogspot.ru/

 

 

Источник: http://dev.1c-bitrix.ru/community/webdev/user/30123/blog/6859/

Назад в раздел

Подписаться на новые материалы раздела:














CAPTCHA