Экспорт двух и более каталогов из Битрикс в 1С по запросу

в 6:46, , рубрики: , 1С-Битрикс

Многие сталкивались с задачей экспорта каталога из Битрикс в 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С.

Автор: andreyjktl

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js