Настройка импорта/экспорта товаров Magento 2
Импорт/экспорт — одна из наиболее нагруженных операций в Magento 2. Встроенный механизм работает через CSV с жёстко определённой схемой колонок. При неправильной конфигурации импорт 10 000 SKU может занимать несколько часов и падать с memory/timeout ошибками. Правильная настройка batch-размеров, индексации и управления памятью решает большинство проблем.
Форматы и структура CSV
Magento 2 поддерживает импорт следующих сущностей: catalog_product, catalog_category, customer, customer_address, customer_finance, stock_sources (MSI).
Обязательные колонки для продуктов:
| Колонка | Описание | Пример |
|---|---|---|
sku |
Уникальный идентификатор | prod-001 |
store_view_code |
Пусто = admin scope | ru, en |
attribute_set_code |
Набор атрибутов | Default |
product_type |
Тип товара | simple, configurable |
name |
Название | Куртка зимняя |
price |
Цена | 1299.00 |
qty |
Количество (legacy, без MSI) | 100 |
visibility |
Видимость | Catalog, Search |
status |
Статус | 1 |
Для конфигурируемых товаров необходимы дополнительные колонки: configurable_variations и configurable_variation_labels.
sku,attribute_set_code,product_type,name,price,configurable_variations,configurable_variation_labels
jacket-base,Default,configurable,Куртка зимняя,1299.00,"sku=jacket-red-s,color=Red,size=S|sku=jacket-red-m,color=Red,size=M","Color=Цвет,Size=Размер"
jacket-red-s,Default,simple,Куртка зимняя Красная S,1299.00,,,
jacket-red-m,Default,simple,Куртка зимняя Красная M,1299.00,,,
Оптимизация производительности импорта
Дефолтные настройки Magento не рассчитаны на большие объёмы. Ключевые параметры в app/etc/env.php и конфигурации сервера:
// Увеличение batch-размера для импорта
// app/code/Vendor/Import/etc/di.xml
<type name="Magento\ImportExport\Model\Import">
<arguments>
<argument name="data" xsi:type="array">
<item name="bunch_size" xsi:type="number">500</item>
</argument>
</arguments>
</type>
# php.ini для процессов импорта
memory_limit = 2G
max_execution_time = 3600
max_input_time = 3600
# Отключение ненужных индексеров во время импорта
bin/magento indexer:set-mode schedule cataloginventory_stock catalog_product_price catalogsearch_fulltext
Импорт через CLI и API
Для автоматизации используйте CLI-команду или REST API:
# Стандартный импорт через CLI
bin/magento import:run \
--entity=catalog_product \
--behavior=append \
--validation-strategy=validation-skip-errors \
--allowed-error-count=100 \
--input-file=var/import/products.csv
# С указанием разделителя и кодировки
bin/magento import:run \
--entity=catalog_product \
--behavior=add_update \
--field-separator=";" \
--multiple-value-separator="|" \
--input-file=var/import/products_semicolon.csv
REST API для импорта (Magento 2.3+):
# Создание job через API
curl -X POST "https://example.com/rest/V1/import/csv" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"source": {
"entity": "catalog_product",
"behavior": "append",
"validationStrategy": "validation-stop-on-errors",
"allowedErrorCount": "0",
"csvData": "c2t1LG5hbWUscHJpY2U..."
}
}'
Настройка экспорта
Экспорт в Magento 2 работает через те же фильтры, что и импорт. Для больших каталогов необходим асинхронный экспорт через scheduled export:
// Программный экспорт через ExportFactory
use Magento\ImportExport\Model\ExportFactory;
class ProductExporter
{
public function __construct(private ExportFactory $exportFactory) {}
public function export(array $filters = []): string
{
$export = $this->exportFactory->create();
$export->setData([
'entity' => 'catalog_product',
'file_format' => 'csv',
'fields_enclosure' => 1,
]);
// Фильтр по store view и типу
$export->filterAttributeCollection(
$export->getEntityAttributeCollection()
);
return $export->export();
}
}
Интеграция с внешними системами через ImportExport
Для регулярной синхронизации с ERP/1С используется кастомный адаптер источника данных:
// Реализация AbstractSource для кастомного источника
class ErpImportSource extends \Magento\ImportExport\Model\Import\AbstractSource
{
public function __construct(private ErpApiClient $erpClient)
{
$this->_colNames = ['sku', 'name', 'price', 'qty', 'description'];
}
protected function _getNextRow(): array|bool
{
$product = $this->erpClient->getNextProduct($this->_varienIo->tell());
if (!$product) {
return false;
}
return [
'sku' => $product['article'],
'name' => $product['title'],
'price' => $product['retail_price'],
'qty' => $product['stock'],
'description' => $product['full_description'],
];
}
}
MSI (Multi-Source Inventory) импорт
С Magento 2.3+ для управления складами используется MSI. Импорт остатков по источникам:
source_code,sku,quantity,status
warehouse-moscow,jacket-red-s,50,1
warehouse-spb,jacket-red-s,30,1
warehouse-moscow,jacket-red-m,0,0
bin/magento import:run \
--entity=stock_sources \
--behavior=append \
--input-file=var/import/stock_msi.csv
Типичные проблемы и их решение
Memory exhausted: увеличьте memory_limit до 2–4G, уменьшите bunch_size до 200–300 записей.
URL key already exists: при поведении append Magento проверяет уникальность URL. Используйте add_update или очистите таблицу url_rewrite перед импортом.
Invalid value for Attribute Set: значение в attribute_set_code должно точно совпадать с именем в базе — регистр важен.
Медленная индексация после импорта: при режиме индексеров realtime каждый bunch запускает индексацию. Переключите на schedule, выполните импорт, затем запустите индексацию вручную:
bin/magento indexer:reindex catalog_product_attribute catalog_product_price catalogsearch_fulltext catalog_product_category
Сроки выполнения
- Настройка и тест импорта до 1 000 SKU: 1 день
- Разработка кастомного адаптера для ERP-синхронизации: 3–5 дней
- Настройка scheduled import с мониторингом ошибок: 2–3 дня
- Миграция каталога 50 000+ SKU из другой платформы: 5–10 дней







