Загрузка товаров из CSV/XLS в 1С-Битрикс
В 1С-Битрикс есть несколько способов загрузить товары из файлов CSV или XLS. Рассмотрим их от простого к сложному.
1. Штатные профили импорта через административную панель
В модуле Торговый каталог (catalog) существуют готовые механизмы импорта через профили. Они работают через раздел административного интерфейса:
- Навигация в админке: Настройки → Торговый каталог → Экспорт/Импорт данных.
- Система позволяет создавать профили импорта, задавать путь к файлу CSV, выбирать инфоблок товаров и запускать загрузку (вручную, агентом или по cron).
- Профиль хранит имя рабочего шаблона и параметры запуска в поле
SETUP_VARS.
2. Создание собственного PHP-шаблона импорта
Можно написать свой шаблон импорта. Механизм подробно описан в документации по экспорту/импорту модуля каталога.
Где размещать шаблоны:
- Пользовательский шаблон импорта — в папке
/bitrix/php_interface/include/catalog_import/. - Файл шаблона должен заканчиваться на
_run.php. - Если рядом есть файл с именем
_setup.php, система считает его мастером импорта для настройки.
Ключевые переменные шаблона импорта:
$URL_DATA_FILE— путь к файлу CSV для импорта.$strImportErrorMessage— текст ошибки. Если установить эту переменную, импорт считается неудачным.
Пример простого шаблона импорта из CSV:
//<title>Импорт товаров из CSV</title>
$productIblockId = (int)$IBLOCK_ID;
$dataFile = (string)$URL_DATA_FILE;
$allowedDirectory = '/upload/import/';
if ($productIblockId <= 0)
{
$strImportErrorMessage = 'Не выбран инфоблок каталога';
}
elseif ($dataFile === '')
{
$strImportErrorMessage = 'Не указан файл импорта';
}
elseif (strncmp($dataFile, $allowedDirectory, strlen($allowedDirectory)) !== 0)
{
$strImportErrorMessage = 'Файл импорта должен находиться в /upload/import/';
}
elseif (!is_readable($_SERVER['DOCUMENT_ROOT'] . $dataFile))
{
$strImportErrorMessage = 'Файл импорта недоступен для чтения';
}
else
{
$file = fopen($_SERVER['DOCUMENT_ROOT'] . $dataFile, 'rb');
$element = new \CIBlockElement;
if (!$file)
{
$strImportErrorMessage = 'Не удалось открыть файл импорта';
}
else
{
fgetcsv($file, 0, ';'); // пропускаем заголовки
while (($row = fgetcsv($file, 0, ';')) !== false)
{
[$xmlId, $name] = array_pad($row, 2, '');
$xmlId = trim((string)$xmlId);
$name = trim((string)$name);
if ($xmlId === '' || $name === '')
{
$strImportErrorMessage = 'В файле есть строка без XML_ID или названия';
break;
}
$elementRow = \CIBlockElement::GetList(
[],
[
'IBLOCK_ID' => $productIblockId,
'=XML_ID' => $xmlId,
],
false,
false,
['ID']
)->Fetch();
if ($elementRow)
{
$result = $element->Update((int)$elementRow['ID'], [
'NAME' => $name,
]);
}
else
{
$result = $element->Add([
'IBLOCK_ID' => $productIblockId,
'XML_ID' => $xmlId,
'NAME' => $name,
'ACTIVE' => 'Y',
]);
}
if (!$result)
{
$strImportErrorMessage = $element->LAST_ERROR
?: 'Не удалось сохранить элемент каталога';
break;
}
}
fclose($file);
}
}
3. Загрузка товаров через API каталога + CSV
Если вам нужно загрузить не только карточки, но и цены, остатки, торговые предложения, внутри шаблона используйте API модуля catalog:
\Bitrix\Catalog\Model\Product::add()илиupdate()— для добавления товарных параметров (сделать элемент товаром).\Bitrix\Catalog\Model\Price— для загрузки цен.\Bitrix\Catalog\StoreProductTableили складские документы — для остатков.
Пример добавления товарных параметров и цены для загруженного элемента:
\Bitrix\Main\Loader::includeModule('iblock');
\Bitrix\Main\Loader::includeModule('catalog');
// Создаем элемент инфоблока
$element = new \CIBlockElement;
$productId = $element->Add([
'IBLOCK_ID' => $productIblockId,
'XML_ID' => 'EXT_001',
'NAME' => 'Новый товар из CSV',
'ACTIVE' => 'Y',
]);
// Делаем элемент товаром каталога
$result = \Bitrix\Catalog\Model\Product::add([
'ID' => $productId,
'TYPE' => \Bitrix\Catalog\ProductTable::TYPE_PRODUCT,
]);
// Добавляем цену (базовый тип цены — ID=1)
$priceResult = \Bitrix\Catalog\Model\Price::add([
'PRODUCT_ID' => $productId,
'CATALOG_GROUP_ID' => 1,
'PRICE' => 1500.00,
'CURRENCY' => 'RUB',
]);
4. Создание профиля импорта программно
Профиль импорта создаётся через класс CCatalogImport:
$importProfileId = \CCatalogImport::Add([
'FILE_NAME' => 'my_csv_import',
'NAME' => 'Импорт товаров из CSV',
'IN_MENU' => 'Y',
'IN_AGENT' => 'N',
'IN_CRON' => 'N',
'DEFAULT_PROFILE' => 'N',
'NEED_EDIT' => 'N',
'SETUP_VARS' => http_build_query([
'IBLOCK_ID' => $productIblockId,
'URL_DATA_FILE' => '/upload/import/products.csv',
]),
]);
if (!$importProfileId)
{
throw new \RuntimeException('Не удалось создать профиль импорта');
}
5. Импорт XLS (Excel)
Штатного импорта XLS напрямую в 1С-Битрикс нет. Для работы с XLS можно:
- Конвертировать XLS в CSV в Excel (сохранить как CSV с разделителем «;») и загружать CSV-файл через описанные выше механизмы.
- Написать свой PHP-шаблон, который читает XLS через библиотеки типа
PhpSpreadsheet(внимание: для Битрикса это нештатный код, требуется дополнительная установка библиотеки через composer).
Резюме по выбору способа
- Для разовой загрузки — создайте профиль импорта через админку и используйте готовый шаблон.
- Для регулярной загрузки — создайте профиль с агентами (
IN_AGENT = 'Y') или настройте запуск по cron. - Для сложной загрузки (цены, остатки, торговые предложения) — напишите свой PHP-шаблон импорта в
/bitrix/php_interface/include/catalog_import/с вызовом API каталога. - Для XLS файлов — конвертируйте в CSV либо используйте внешнюю PHP-библиотеку для чтения Excel.