Выгрузка каталога товаров из 1С-Битрикс — задача, с которой сталкиваются владельцы интернет-магазинов, маркетологи и разработчики. Без корректного экспорта данных невозможно синхронизировать ассортимент с маркетплейсами, аналитическими системами или резервными копиями. В этой статье разберём все актуальные способы выгрузки: от стандартного функционала до кастомизированных решений для сложных структур каталога.
Особое внимание уделим форматам CSV, XML и JSON, а также типичным ошибкам, которые возникают при экспорте больших баз данных. Если вы работаете с 1С-Битрикс: Управление сайтом (любой редакции) или Битрикс24, здесь найдёте решения под свои задачи. Для новичков мы подробно расписали каждый шаг, а для опытных пользователей добавили продвинутые техники оптимизации выгрузки.
1. Стандартные инструменты выгрузки в 1С-Битрикс
Самый простой способ выгрузить каталог — использовать встроенные инструменты административной панели. Они подходят для большинства задач, если не требуется глубокая кастомизация структуры данных. Рассмотрим два основных метода: через Экспорт/Импорт и модуль Торговый каталог.
Чтобы начать, перейдите в раздел Магазин → Настройки → Экспорт/Импорт данных. Здесь доступны профили для выгрузки в форматы CSV и XML. Для CSV можно настроить разделители, кодировку (рекомендуется UTF-8) и список выгружаемых полей. Важно: если ваш каталог содержит более 10 000 товаров, используйте постраничную выгрузку, чтобы избежать таймаутов сервера.
- 📁 Профили экспорта: Сохраняйте настройки для повторного использования (например, отдельные профили для Яндекс.Маркет и Google Merchant Center).
- ⚙️ Поля для выгрузки: Выбирайте только необходимые (название, цена, артикул, остатки), чтобы уменьшить размер файла.
- 🔄 Автоматизация: Настройте расписание выгрузки через
CRON, если данные обновляются ежедневно.
Если в выгруженном файле CSV появляются "кракозябры", проверьте кодировку в настройках профиля. Для кириллицы всегда используйте UTF-8 без BOM.
Для выгрузки в XML (например, для YML-фида) перейдите в Магазин → Настройки → Экспорт в Яндекс.Маркет. Здесь можно сгенерировать файл, соответствующий требованиям маркетплейса, с учётом категорий, параметров доставки и валюты. Обратите внимание: если ваш каталог содержит товары с вариантами (цвета, размеры), настройте выгрузку предложений, а не только родительских товаров.
Стандартные инструменты Битрикса покрывают 80% задач по выгрузке, но для сложных структур (многовариантные товары, динамические свойства) потребуется доработка через API или модули.
2. Выгрузка через API 1С-Битрикс
Если встроенные инструменты не подходят (например, нужно выгрузить данные в нестандартном формате или интегрироваться с внешней системой), используйте REST API или PHP-классы Битрикса. Этот метод требует знаний программирования, но даёт полный контроль над процессом.
Основные методы для работы с каталогом:
- 🔧
CCatalogProduct::GetList()— получение списка товаров с фильтрацией. - 📦
CCatalogProduct::GetByID()— детальная информация по конкретному товару. - 🏷️
CIBlockElement::GetPropertyValues()— выгрузка дополнительных свойств (цвет, материал и т.д.).
Пример кода для выгрузки товаров в JSON:
<?php
// Подключаем пролог Битрикса
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
// Получаем список товаров
$arFilter = array('IBLOCK_ID' => 2, 'ACTIVE' => 'Y'); // ID инфоблока и активные товары
$arSelect = array('ID', 'NAME', 'DETAIL_PAGE_URL', 'CATALOG_PRICE_1', 'PROPERTY_CML2_ARTICLE');
$res = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelect);
while($ob = $res->GetNextElement()) {
$arFields = $ob->GetFields();
$arProps = $ob->GetProperties();
$products[] = array_merge($arFields, $arProps);
}
// Сохраняем в JSON
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/upload/export/products.json', json_encode($products, JSON_UNESCAPED_UNICODE));
?>
Для выгрузки через REST API используйте endpoint /bitrix/tools/catalog.export.php с передачей параметров type (например, csv или xml) и iblock_id. Не забудьте сгенерировать API-ключ в настройках модуля Веб-сервисы.
Как ускорить выгрузку больших каталогов?
Для каталогов с 50 000+ товаров используйте пакетную выгрузку:
1. Разбейте товары на группы по 5 000 штук (по ID или алфавиту).
2. Выгружайте каждую группу в отдельный файл, затем объединяйте их.
3. Для ускорения отключите индексирование поиском (CModule::IncludeModule('search')) на время экспорта.
3. Экспорт каталога в 1С: Предприятие
Если ваш интернет-магазин синхронизирован с 1С:Управление торговлей или 1С:ERP, выгрузку каталога удобно осуществлять через модуль Обмен с 1С. Этот метод гарантирует актуальность данных в обеих системах и минимизирует ручной труд.
Для настройки обмена:
- В 1С-Битрикс перейдите в
Магазин → Настройки → Обмен с 1С. - Укажите путь к файлу обмена (обычно
/upload/1c_catalog.xml). - В 1С настройте обработку
Выгрузка данных на сайт(путь:Администрирование → Обмен данными с сайтом). - Задайте расписание автоматического обмена (рекомендуется ежедневный экспорт в непиковые часы).
Формат обмена — CommerceML (.xml). В файле будут передаваться:
- 📦 Товары (название, артикул, цены, остатки).
- 🏷️ Свойства (характеристики, фотографии, описания).
- 📂 Категории (структура раздела с вложенностью).
Критичный нюанс: при первом обмене обязательно выполните полную выгрузку (mode=import), а не инкрементальную. Это позволит избежать расхождений в данных между системами.
4. Выгрузка каталога для маркетплейсов
Маркетплейсы (Ozon, Wildberries, Яндекс.Маркет) предъявляют жёсткие требования к структуре фидов. В 1С-Битрикс есть готовые решения для адаптации каталога под эти требования.
Для Яндекс.Маркет:
- Перейдите в
Магазин → Настройки → Экспорт в Яндекс.Маркет. - Выберите тип фида:
YML(для обычного экспорта) илиYML для вендоров(если вы поставщик). - Настройте обязательные поля:
vendor(производитель),model(модель),delivery(условия доставки). - Укажите путь к файлу (например,
/yandex-market.xml) и сгенерируйте его.
Для Ozon и Wildberries потребуется доработка. Используйте модули из Marketplace или напишите собственный скрипт на основе API. Пример структуры для Ozon:
{
"items": [
{
"offer_id": "12345",
"name": "Название товара",
"price": 999,
"old_price": 1200,
"quantity": 10,
"barcode": "4601234567890"
}
]
}
| Маркетплейс | Формат фида | Обязательные поля | Особенности |
|---|---|---|---|
| Яндекс.Маркет | YML (XML) | name, price, categoryId, vendor | Поддерживает варианты товаров (offers) |
| Ozon | JSON/CSV | offer_id, name, price, quantity | Требует уникальный offer_id для каждого SKU |
| Wildberries | XLSX/CSV | nmId, brand, price, quantity | Привязка к номенклатуре WB (nmId) |
| Google Merchant Center | XML/CSV | id, title, price, availability | Поддерживает динамические ремаркетинговые теги |
Указать корректные категории (соответствие вашим и категориям маркетплейса)
Проверить наличие всех обязательных полей (баркоды, артикулы)
Оптимизировать названия товаров (длина до 150 символов)
Добавить фотографии с разрешением не менее 800×800 px
Проверить актуальность цен и остатков-->
5. Решение типичных ошибок при выгрузке
Даже при правильной настройке экспорта могут возникать ошибки. Рассмотрим самые распространённые и способы их устранения.
⚠️ Внимание: Если при выгрузке в CSV пропадают русские символы, проверьте кодировку файла. В большинстве случаев помогает принудительное указаниеUTF-8в настройках профиля или добавление строкиheader('Content-Type: text/csv; charset=UTF-8');в скрипте экспорта.
Ошибка 1: Таймаут при выгрузке большого каталога
Если скрипт прерывается с ошибкой 504 Gateway Time-out, увеличьте лимиты в php.ini:
max_execution_time = 300
memory_limit = 512M
post_max_size = 64M
upload_max_filesize = 64M
Также можно разбить выгрузку на части с помощью параметра NAV_PARAMS в методе GetList().
Ошибка 2: Не экспортируются свойства товаров
Проверьте, что в настройках профиля экспорта отмечены галочки напротив нужных свойств. Если используете API, убедитесь, что в выборке ($arSelect) указаны все необходимые поля, включая PROPERTY_*.
Ошибка 3: Несовпадение цен в 1С и на сайте
Это происходит, если в 1С-Битрикс настроены типы цен (розничная, оптовая), а в профиле экспорта не указан правильный идентификатор типа. Проверьте настройки в Магазин → Настройки → Типы цен и сопоставьте их с 1С.
Ошибка 4: Дублирование товаров в фиде
Чаще всего это связано с неправильной настройкой торговых предложений. Убедитесь, что в экспорте участвуют только родительские товары или корректно сгруппированные предложения (с указанием group_id).
6. Оптимизация выгруженного каталога для SEO
Выгруженный каталог можно использовать не только для синхронизации с внешними системами, но и для SEO-оптимизации. Например, анализ структуры данных помогает улучшить внутреннюю перелинковку или сформировать XML-карту сайта.
Вот несколько способов применения экспортированных данных:
- 🔍 Анализ семантического ядра: Выгрузите названия товаров и категорий, чтобы найти повторяющиеся ключевые слова или пропущенные long-tail запросы.
- 📊 Оптимизация метатегов: На основе экспортированных данных автоматически генерируйте
titleиdescriptionдля карточек товаров. - 🔗 Внутренняя перелинковка: Используйте данные о связанных товарах (аксессуары, аналоги) для создания релевантных ссылок.
Пример скрипта для генерации XML-карты сайта на основе выгруженного каталога:
<?php
$arFilter = array('IBLOCK_ID' => 2, 'ACTIVE' => 'Y');
$arSelect = array('ID', 'NAME', 'DETAIL_PAGE_URL', 'DATE_ACTIVE_FROM');
$res = CIBlockElement::GetList(array('SORT' => 'ASC'), $arFilter, false, false, $arSelect);
$xml = new SimpleXMLElement('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"/>');
while($ob = $res->GetNextElement()) {
$arFields = $ob->GetFields();
$url = $xml->addChild('url');
$url->addChild('loc', 'https://ваш-сайт.ru'.$arFields['DETAIL_PAGE_URL']);
$url->addChild('lastmod', date('Y-m-d', strtotime($arFields['DATE_ACTIVE_FROM'])));
$url->addChild('changefreq', 'weekly');
$url->addChild('priority', '0.8');
}
$xml->asXML($_SERVER['DOCUMENT_ROOT'].'/sitemap_products.xml');
?>
Для автоматизации SEO-задач можно интегрировать выгрузку с сервисами вроде Screaming Frog или Netpeak Spider. Загрузите CSV-файл с товарами в эти инструменты, чтобы проанализировать:
- Длину и уникальность
title/description. - Наличие дублирующегося контента.
- Оптимизацию изображений (
alt-тексты, размеры).
7. Автоматизация и интеграция с внешними системами
Ручная выгрузка каталога отнимает время и чревата ошибками. Автоматизируйте процесс с помощью:
- 🤖 CRON-задач: Настройте автоматическую выгрузку по расписанию (например, ежедневно в 3:00).
- 🔌 Вебхуков: Отправляйте данные в внешние системы (например, Amocrm или RetailCRM) сразу после обновления каталога.
- ☁️ Облачных сервисов: Используйте Google Sheets + Apps Script для парсинга и визуализации данных.
Пример настройки CRON для автоматической выгрузки:
# Выгрузка каталога в CSV каждый день в 3:00
0 3 * /usr/bin/php /path/to/bitrix/cli.php catalog_export --profile-id=1 --format=csv --path=/upload/export/products_$(date +\%Y-\%m-\%d).csv
Для интеграции с RetailCRM используйте готовый модуль из Marketplace или напишите собственный коннектор. Пример передачи данных через API:
$api = new \RetailCrm\ApiClient(
'https://ваш-аккаунт.retailcrm.ru',
'ваш-api-ключ'
);
$products = []; // Массив товаров из Битрикса
$response = $api->request->productsUpload($products);
⚠️ Внимание: При настройке автоматического обмена проверьте, что внешняя система поддерживает объём передаваемых данных. Например, некоторые CRM ограничивают количество товаров в одном запросе (обычно до 1 000 штук). В этом случае используйте пакетную выгрузку.
8. Альтернативные способы выгрузки
Если стандартные методы не подходят, рассмотрите альтернативные варианты:
1. Выгрузка через SQL-запросы
Для опытных пользователей доступен прямой экспорт данных из базы MySQL. Это самый быстрый способ, но требует осторожности, чтобы не нарушить целостность данных. Пример запроса:
SELECT
p.ID, p.NAME, p.DETAIL_PAGE_URL,
c.PRICE, c.QUANTITY,
ip.VALUE as ARTICLE
FROM
b_iblock_element p
LEFT JOIN
b_catalog_product c ON p.ID = c.ID
LEFT JOIN
b_iblock_element_property ip ON p.ID = ip.IBLOCK_ELEMENT_ID AND ip.IBLOCK_PROPERTY_ID = [ID_СВОЙСТВА_АРТИКУЛ]
WHERE
p.IBLOCK_ID = [ID_ИНФОБЛОКА]
INTO OUTFILE '/tmp/products.csv'
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
2. Использование модулей из Marketplace
В Marketplace доступны платные и бесплатные решения для выгрузки:
- 📤 "Экспорт в Excel" — удобный интерфейс для выгрузки в XLSX.
- 🔄 "Обмен с МойСклад" — синхронизация с популярным сервисом учёта.
- 📦 "Выгрузка в Facebook Catalog" — для рекламных кампаний.
3. Выгрузка через Composer-пакеты
Для разработчиков доступны пакеты вроде bitrix/exporter, которые упрощают работу с экспортом. Установка:
composer require vendor/bitrix-exporter
php vendor/bin/export catalog --format=json --output=products.json
Выбор способа зависит от задачи:
- Для разовой выгрузки подойдёт SQL или стандартный экспорт.
- Для регулярного обмена с внешними системами — API + CRON.
- Для интеграции с маркетплейсами — специализированные модули.
FAQ: Частые вопросы по выгрузке каталога
Как выгрузить только товары с ненулевым остатком?
В настройках профиля экспорта добавьте фильтр по количеству: в разделе Фильтр укажите CATALOG_QUANTITY > 0. Если используете API, добавьте условие в $arFilter:
$arFilter = array(
'IBLOCK_ID' => 2,
'ACTIVE' => 'Y',
'>CATALOG_QUANTITY' => 0
);
Можно ли выгрузить каталог с фотографиями?
Да, но стандартными средствами Битрикса фотографии экспортируются только в виде ссылок (DETAIL_PICTURE, PREVIEW_PICTURE). Чтобы скачать сами файлы, используйте скрипт:
<?php
$arSelect = array('ID', 'NAME', 'DETAIL_PICTURE');
$res = CIBlockElement::GetList(array(), array('IBLOCK_ID' => 2), false, false, $arSelect);
while($ob = $res->GetNextElement()) {
$arFields = $ob->GetFields();
if ($arFields['DETAIL_PICTURE']) {
$file = CFile::GetPath($arFields['DETAIL_PICTURE']);
copy($_SERVER['DOCUMENT_ROOT'].$file, '/path/to/export/images/'.$arFields['ID'].'.jpg');
}
}
?>
Для XML-фидов (например, YML) фотографии подгружаются автоматически по URL.
Как выгрузить каталог с учетом скидок и промокодов?
Скидки в Битриксе хранятся отдельно от основных цен. Чтобы экспортировать актуальную цену со скидкой, используйте метод CCatalogProduct::GetOptimalPrice():
$arFilter = array('IBLOCK_ID' => 2, 'ID' => $productId);
$arPrice = CCatalogProduct::GetOptimalPrice($productId, 1, array(), 'N');
$finalPrice = $arPrice['PRICE']['PRICE']; // Цена со скидкой
Для выгрузки промокодов потребуется отдельный экспорт из модуля Sale (раздел Магазин → Промо-акции).
Что делать, если выгрузка прерывается на большом каталоге?
Разбейте каталог на части по:
- 🔢 ID: Выгружайте товара с
IDот 1 до 5000, затем 5001–10000 и т.д. - 📚 Категориям: Экспортируйте по одному разделу за раз.
- 📅 Дате изменения: Выгружайте только обновлённые товары (фильтр
>=DATE_CREATE).
Также увеличьте лимиты памяти в php.ini (см. раздел "Решение ошибок").
Как проверить корректность выгруженного XML-фида?
Используйте валидаторы:
- 🔍 W3C Validator — для проверки синтаксиса XML.
- 🛒 Яндекс.Маркет: Проверка фида — для YML.
- 📄