Многие сталкивались с задачей экспорта каталога из Битрикс в 1С.

Но не всем удалось найти подходящий вариант. Встроенные средства Битрикс не дают свободу действий в этом плане. Рассмотрим какие варианты предлагает Битрикс:

1) по адресу Магазин — Настройки — Экспорт Каталога

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

2) Магазин — экспорт данных — посмотрели, увидели, что уже есть где разгуляться.

Можно настроить экспорт в YML и CSV. И даже в крон разместить по расписанию. И даже сделать выгрузку по запросу из 1С, правда с использованием кастылей. Данный функционал уже достоен рассмотрения, но в силу граблей и того, что хотелось «чистый» XML тоже отметается.

И тут встал вопрос — что делать? Брать YML? Или CSV? А может есть другие варианты?

Решено было разобрать по полочкам стандартный обмен между 1С и Битрикс.

Запрос идет на файл /bitrix/admin/1c_exchange.php — это ссылка на файл /bitrix/modules/sale/admin/1c_exchange.php — именно этот файл производит операции импорта и экспорта в Битриксе.

Были откопаны следующие типы запросов и их настройки: sale, crm, catalog, reference, get_catalog, listen.

Предназначение было понятно из названия. В этом списке нас интересует get_catalog — именно он создает файл экспорта, вот как выглядит интересующий нас кусок кода:

elseif($type=="get_catalog") 
{ 
   $APPLICATION->IncludeComponent("bitrix: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"), 
       ) 
   ); 
} 


Мы можем наблюдать, что настройки экспорта берутся из уже рассмотренного нами выше варианта 1, которые хранятся в БД.

Дальше будем работать именно с этими данными. Стандартный функционал решили оставить и создали дубликат, переименовав тип запроса в get_catalog1 с указанием идентификатора инфоблока:

elseif($type=="get_catalog1") 
{ 
   $APPLICATION->IncludeComponent("bitrix:catalog.export.1c", "", Array( 
       "IBLOCK_ID" => "6", 
       "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"), 
       ) 
   ); 
} 

Протестировали, всё работает. Но не хотелось создавать подобные дубликаты для каждого инфоблока. Нам же нужна была гибкость и масштабируемость решения.

Выход был найден достаточно простой: передавать номер идентификатора из 1С в строке запроса. И перехватывать значение переменной через GET.

В итоге получилось следующее:

elseif($type=="get_catalog1") 
{ 
   $APPLICATION->IncludeComponent("bitrix:catalog.export.1c", "", Array( 
       "IBLOCK_ID" => $_GET['blockid'], 
       "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"), 
       ) 
   ); 
} 

В строке запроса из 1С содержится следующий отрезок ...&iblockid=6&..., соответственно $_GET['blockid'] приравнивается 6 инфоблоку. Для импорта другого инфоблока достаточно в запросе прописать ID необходимого инфоблока.

P.S.: Данное решение может не соответствовать «Истинному пути» Битрикс, а может и соответствовать — я не знаю.

Но знаю точно — именно такой вариант удовлетворяет всем потребностям данного проекта и решает все проблемы связанные с интеграцией 1С и Битрикс.

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

Комментарии (2)


  1. Nemesys
    15.12.2015 18:06

    Очень ценная информация! Продолжайте писать еще!


  1. andreyjktl
    15.12.2015 20:32

    В силу того, что написанный выше модуль более подходит для проекта, решено было на нем и остановиться. Но есть еще один вариант, который так и не получилось испытать и он должен работать со стандартным модулем обмена в 1С.
    Вместо вписывания копии get_catalog, надо дублировать сам 1c_exchange.php(можно оба файла: bitrix/admin/1c_exchange.php и /bitrix/modules/sale/admin/1c_exchange.php, а можно только второй и в первом прописать ссылку на новый — кому как больше подходит.) И уже в нем проделать то, что описано в статье со стандартным get_cataloog.
    Тогда можно будет получать данные из необходимого инфоблока просто дописав в стандартном адресе сайта переменную со значением — в моем случае iblockid=6.
    Такой функционал менее гибок чем принятый нами, но в отличии от него может использоваться со стандартым модулем обмена 1С.
    P.S. Если кто-нибудь попробует — пожалуйста отпишитесь о результатах. Интерестно же.