Magento является e-commerce решением, т.е. больше нацелено на продажу продуктов, чем на сопутствующий продажам складской, логистический или финансовый учёт. Для сопутствующего лучше подходят другие приложения (например, ERP-системы). Поэтому достаточно часто в практике использования Magento возникает задача интеграции магазина с этими другими системами (например, с 1С). По большому счёту интеграцию можно свести к репликации данных по: Magento для манипуляции с данными в базе предлагает отдельный класс объектов — репозитории. В силу специфики Magento добавление данных в базу через репозитории легко кодируется, но происходит, скажем так, небыстро. В данной публикации я рассматриваю основные этапы программного добавления в Magento 2 продукта "классическим" способом — с использованием репо-классов. Клиенты и заказы реплицируются, обычно, в другую сторону — из Magento во внешние ERP-системы. Поэтому с ними попроще, на стороне Magento нужно просто выбрать соответствующие данные, а дальше — "с нашей стороны пули вылетели". На данный момент создание сохраняемых в базе объектов программным способом в Magento делается через Factory: а запись в базу — через Repository: Подход с использованием "Factory" и "Repository" можно использовать для всех основных моделей в предметной области Magento 2. Я рассматриваю структуру данных, соответствующую версии Magento 2.3. Самая основная информация о продукте находится в таблице catalog_product_entity (реестр продуктов): Ограничиваюсь одним типом продукта (type_id='simple'), набором атрибутов по-умолчанию (attribute_set_id=4) и игнорирую атрибуты has_options и required_options. Так как атрибуты entity_id, created_at и updated_at генерируются автоматически, то, по сути дела, нам для добавления нового продукта достаточно задать sku. Делаю так: и получаю исключение: Добавляю в запрос имя продукта и получаю сообщение, что не хватает атрибута Price. После добавления цены продукт ложится в базу: Название продукта сохраняется в таблице varchar-атрибутов продукта (catalog_product_entity_varchar), цена — в таблице catalog_product_entity_decimal. Перед добавлением продукта желательно в явном виде указать, что мы используем административную витрину для импорта данных: Обработка дополнительных атрибутов продуктов средствами Magento — одно удовольствие. EAV-модель данных для основных сущностей (см. таблицу eav_entity_type) — одна из ключевых особенностей этой платформы. Просто добавляем соответствующие атрибуты к модели продукта: и при сохранении модели через репо-объект : дополнительные атрибуты будут также сохранены в соответствующих таблицах БД. По-простому — количество продукта на складе. В Magento 2.3 структуры в БД, описывающие формат хранения инвентарных данных, значимо отличаются от того, что было ранее. Тем не менее, добавление количества продукта на складе через модель продукта не намного сложнее, чем добавление других атрибутов: Как правило, медиа-сопровождение продукта для клиента в магазине (e-commerce) отличается от медиа-сопровождения этого же продукта для сотрудника во внутренней системе учёта (ERP). В первом случае желательно показать "товар лицом", во втором — достаточно дать общее представление о продукте. Тем не менее, перенос хотя бы первичного изображения продукта — достаточно распространённый case при импорте данных.  При добавлении изображения через админку картинка сначала сохраняется во временном каталоге (./pub/media/tmp/catalog/product) и только при сохранении продукта перемещается в медиа-каталог (./pub/media/catalog/product). Также при добавлении через админку изображению выставляются теги image, small_image, thumbnail, swatch_image. Почему-то медиа подвязывается только после предварительного сохранения продукта и получения его из репозитория заново. И нужно указывать атрибут label при добавлении записи в медиа-галерею продукта (иначе получаем исключение Undefined index: label in .../module-catalog/Model/Product/Gallery/CreateHandler.php on line 516).  Зачастую структура категорий магазина и backend-приложения или размещение в них продуктов может значительно различаться. Стратегии переноса данных о категориях и продуктах в них зависят от множества факторов. В данном примере я придерживаюсь следующей: Основная информация о категории находится в таблице catalog_category_entity (каталог категорий). Создание категории в Magento: Привязка продукта к категории осуществляется по ID категории и SKU продукта: Написать код для добавления в Magento 2 продукта программным путём весьма несложно. Всё изложенное выше я свёл в демо-модуль "flancer32/mage2_ext_demo_import". В модуле всего одна консольная команда fl32:import:prod, которая импортирует продукты, описанные в JSON-файле "./etc/data/products.json": Картинки для импорта находятся в каталоге ./etc/data/img. Время импорта 10 продуктов подобным способом составляет порядка 10 секунд на моём ноутбуке. Если развивать эту мысль дальше, то несложно прийти к выводу, что в час можно импортировать порядка 3600 продуктов, а на импорт 100К продуктов может уйти порядка 30 часов. Замена ноутбука на сервер позволяет несколько сгладить ситуацию. Может быть даже в разы. Но не на порядки. Возможно эта скорость медленность в какой-то мере является одной из причин появления проекта magento/async-import. Кардинальным решением для увеличения скорости импорта может стать прямая запись в базу, но в этом случае теряются все "плюшки", касающиеся расширяемости Magento — придётся всё "расширенное" делать самому. Тем не менее, оно того стоит. Если получится, то рассмотрю подход с прямой записью в БД в следующей статье. wiredgeese.com