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