Миграция сайта с другой CMS на 1С-Битрикс
Перенести сайт с WordPress, OpenCart или MODx на Битрикс — значит не просто скопировать файлы. Структуры данных кардинально разные: что в WordPress хранится в wp_posts + wp_postmeta, в Битрикс разбито по b_iblock_element, b_iblock_element_property и b_iblock_element_prop_m. Миграция — это ETL-проект (Extract, Transform, Load) с серьёзной аналитической фазой.
Аудит исходной CMS
Первый шаг — инвентаризация того, что нужно перенести:
Контент:
- Статические страницы (количество, структура URL)
- Новости, статьи, блог (объём, теги, категории)
- Галереи и медиафайлы
Каталог (для магазинов):
- Количество товаров и торговых предложений (SKU)
- Структура атрибутов и характеристик
- Цены и остатки
- Изображения товаров
Пользователи и заказы:
- База покупателей (email, хешированные пароли)
- История заказов
- Бонусные баллы и скидки
SEO:
- Текущие URL и их структура
- Meta title/description для всех страниц
- Sitemap и robots.txt
Типичные маппинги данных
WordPress → Битрикс (контент):
| WordPress | Битрикс |
|---|---|
wp_posts (post) |
Инфоблок «Статьи», элемент b_iblock_element |
wp_posts (page) |
Страница в файловой структуре или инфоблок |
wp_postmeta |
Свойства инфоблока b_iblock_element_property |
wp_terms |
Разделы инфоблока b_iblock_section |
wp_users |
b_user |
OpenCart → Битрикс (каталог):
| OpenCart | Битрикс |
|---|---|
oc_product |
b_iblock_element (каталог) |
oc_product_attribute |
Свойства инфоблока (характеристики) |
oc_product_option + oc_product_option_value |
Торговые предложения (SKU) |
oc_category |
Разделы инфоблока b_iblock_section |
oc_order |
b_sale_order |
Скрипт миграции: подход
Миграция реализуется через PHP-скрипты, работающие с API Битрикс. Прямая запись в таблицы БД — только для массовых данных с последующей перестройкой индексов.
Пример миграции товара через API:
// Чтение товара из источника (OpenCart DB)
$ocProduct = $sourceDb->query("SELECT * FROM oc_product WHERE product_id = ?", [$productId])->fetch();
$ocDesc = $sourceDb->query("SELECT * FROM oc_product_description WHERE product_id = ? AND language_id = 2", [$productId])->fetch();
$ocImages = $sourceDb->query("SELECT * FROM oc_product_image WHERE product_id = ? ORDER BY sort_order", [$productId])->fetchAll();
// Создание элемента в Битрикс
$el = new CIBlockElement();
$elementId = $el->Add([
'IBLOCK_ID' => CATALOG_IBLOCK_ID,
'NAME' => $ocDesc['name'],
'CODE' => \Bitrix\Main\Text\StringHelper::translit($ocDesc['name']),
'DETAIL_TEXT' => $ocDesc['description'],
'PREVIEW_TEXT' => $ocDesc['meta_description'],
'ACTIVE' => $ocProduct['status'] ? 'Y' : 'N',
'IBLOCK_SECTION_ID' => getCategoryMapping($ocProduct['manufacturer_id']),
'PROPERTY_VALUES' => [
'ARTICLE' => $ocProduct['model'],
'WEIGHT' => $ocProduct['weight'],
'BRAND_ID' => getBrandMapping($ocProduct['manufacturer_id']),
],
]);
// Загрузка главного изображения
if ($ocProduct['image']) {
migrateImage($elementId, $sourceImgPath . $ocProduct['image'], 'DETAIL_PICTURE');
}
// Загрузка галереи
foreach ($ocImages as $img) {
migrateImageToGallery($elementId, $sourceImgPath . $img['image']);
}
// Установка цены
CCatalogProduct::Add(['ID' => $elementId, 'QUANTITY' => $ocProduct['quantity']]);
CPrice::SetBasePrice($elementId, $ocProduct['price'], 'RUB');
Сохранение SEO и URL-структуры
Это самая коммерчески чувствительная часть. Потеря позиций в поиске при смене CMS — реальный риск.
Стратегия сохранения URL:
- Формируем маппинг старых URL → новых URL в Битрикс
- Настраиваем редиректы 301 через
.htaccessили nginx - В Битрикс устанавливаем символьные коды (
CODE) элементов и разделов максимально близко к старым URL
# .htaccess — редиректы старых URL WordPress
RewriteRule ^blog/(.+)/$ /news/$1/ [R=301,L]
RewriteRule ^product/(.+)/$ /catalog/item/$1/ [R=301,L]
- Meta title и description переносятся в свойства инфоблока или через модуль SEO-фильтров Битрикс
Карта редиректов — обязательный артефакт проекта, экспортируется в CSV для проверки.
Перенос пользователей
Пароли из WordPress (bcrypt) нельзя перенести напрямую — алгоритм хеширования в Битрикс другой. Варианты:
- Принудительный сброс — пользователи получают письмо с просьбой установить новый пароль
- Временный логин по email — при первом входе после миграции запрашивается только email, затем установка нового пароля
- Гибридный хеш — при входе проверять пароль сначала по старому алгоритму, при успехе перехешировать в Битрикс-формат
Третий вариант требует кастомного обработчика авторизации, но сохраняет UX — пользователи не замечают миграции.
Тестирование и приёмка
После миграции — сверка данных:
# Псевдокод сверки
source_count = source_db.query("SELECT COUNT(*) FROM oc_product WHERE status=1")
bitrix_count = bitrix_db.query("SELECT COUNT(*) FROM b_iblock_element WHERE IBLOCK_ID=? AND ACTIVE='Y'", [CATALOG_IBLOCK_ID])
assert source_count == bitrix_count, f"Product count mismatch: {source_count} vs {bitrix_count}"
Проверяется: количество товаров, разделов, пользователей, заказов. Выборочно — контент 20–30 случайных элементов.
Сроки выполнения
| Масштаб проекта | Срок |
|---|---|
| Контентный сайт (до 500 страниц) | 1–2 недели |
| Магазин до 5 000 товаров | 3–6 недель |
| Крупный каталог 10 000+ товаров + история заказов | 2–4 месяца |
Миграция с другой CMS — это полноценный проект разработки, а не просто «экспорт-импорт». Качество результата зависит от глубины аудита на старте.







