Тысячи торговых предложений висят без привязки к товару — после массового импорта из 1С или миграции с другой платформы. В результате в карточке товара пусто, цены и остатки не передаются, корзина не работает. Восстановить привязку вручную для 10 000 SKU — неделя рутины. Мы решаем эту задачу с помощью скриптов массовой привязки по XML_ID, артикулу или внешней таблице. Экономия до 70% времени по сравнению с ручным трудом. Опыт более 10 лет и 500+ успешных проектов позволяют гарантировать корректную работу каталога. Получите консультацию — проведём бесплатный анализ базы данных и предложим оптимальное решение.
Кейс: магазин одежды с 15 000 SKU
После миграции с OpenCart на Битрикс все предложения отвязались. Мы за 2 часа написали скрипт, сопоставивший артикулы по XML_ID, и восстановили привязку. Каталог заработал в течение дня.Почему важно правильно привязывать торговые предложения?
Без корректной привязки через свойство CML2_LINK Битрикс не может собрать единый торговый каталог. Предложения не отображаются в карточке товара, цены и остатки не передаются в корзину, а фильтр по фасетам выдаёт пустые результаты. Особенно критично для интернет-магазинов с большим ассортиментом — ошибка привязки ведёт к потере конверсии и росту возвратов. Стоимость такой ошибки может достигать десятков тысяч долларов потерянной выручки за день.
Как массово восстановить привязку торговых предложений?
Шаг 1. Анализ структуры данных
Определяем инфоблоки товаров (catalogIblockId) и предложений (offersIblockId). Проверяем свойство CML2_LINK в b_iblock_property.
SELECT COUNT(*) FROM b_iblock_element ie WHERE ie.IBLOCK_ID = {offers_iblock_id} AND NOT EXISTS ( SELECT 1 FROM b_iblock_element_property iep INNER JOIN b_iblock_property ip ON ip.ID = iep.IBLOCK_PROPERTY_ID WHERE iep.IBLOCK_ELEMENT_ID = ie.ID AND ip.CODE = 'CML2_LINK' AND iep.VALUE IS NOT NULL ); Шаг 2. Массовая привязка по XML_ID
Самый распространённый сценарий — товары и предложения имеют артикул из 1С в поле XML_ID. Мы создаём карту соответствия и устанавливаем CML2_LINK пакетами по 200 записей. Это в 20 раз быстрее ручной привязки.
$offersIblockId = 11; $propRes = \Bitrix\Iblock\PropertyTable::getList([ 'filter' => ['IBLOCK_ID' => $offersIblockId, 'CODE' => 'CML2_LINK'], 'select' => ['ID'], ])->fetch(); $linkPropertyId = $propRes['ID']; $catalogIblockId = 10; $productMap = []; $productsRes = \CIBlockElement::GetList([], ['IBLOCK_ID' => $catalogIblockId], false, false, ['ID', 'XML_ID']); while ($row = $productsRes->Fetch()) { $productMap[$row['XML_ID']] = $row['ID']; } $offersRes = \CIBlockElement::GetList([], ['IBLOCK_ID' => $offersIblockId], false, false, ['ID', 'XML_ID']); $batch = []; while ($row = $offersRes->Fetch()) { $parentXmlId = substr($row['XML_ID'], 0, 8); if (!isset($productMap[$parentXmlId])) continue; $parentId = $productMap[$parentXmlId]; $batch[] = ['offer_id' => $row['ID'], 'parent_id' => $parentId]; if (count($batch) >= 200) { bindOffersToProducts($batch, $offersIblockId, $linkPropertyId); $batch = []; } } if (!empty($batch)) { bindOffersToProducts($batch, $offersIblockId, $linkPropertyId); } function bindOffersToProducts(array $batch, int $iblockId, int $propId): void { foreach ($batch as $item) { $existing = \Bitrix\Iblock\ElementPropertyTable::getList([ 'filter' => ['IBLOCK_ELEMENT_ID' => $item['offer_id'], 'IBLOCK_PROPERTY_ID' => $propId], 'select' => ['ID'], ])->fetch(); if ($existing) { \Bitrix\Iblock\ElementPropertyTable::update($existing['ID'], ['VALUE' => $item['parent_id']]); } else { \Bitrix\Iblock\ElementPropertyTable::add([ 'IBLOCK_ELEMENT_ID' => $item['offer_id'], 'IBLOCK_PROPERTY_ID' => $propId, 'VALUE' => $item['parent_id'] ]); } } } Шаг 3. Привязка через CSV-маппинг
Если логика определения родителя сложнее (например, по цвету и размеру), используем внешнюю таблицу. Пример файла:
offer_xml_id,parent_xml_id SKU-001-RED,PROD-001 SKU-001-BLUE,PROD-001 Скрипт загружает маппинг, находит ID элементов по XML_ID и устанавливает CML2_LINK. Производительность — до 10 000 привязок в минуту.
Как проверить корректность привязки?
После выполнения привязки обязательно:
- Выборочно проверьте карточки товаров на публичной части — предложения должны отображаться.
- Сбросьте тегированный кэш инфоблоков.
- Переиндексируйте фасетный фильтр, если предложения участвуют в фильтрации.
\Bitrix\Iblock\InformationBlock::cleanTagCache($catalogIblockId); \Bitrix\Iblock\InformationBlock::cleanTagCache($offersIblockId); \Bitrix\Iblock\PropertyIndex\Manager::markIblockToReindex($offersIblockId); Сравнение ручной и автоматической привязки
| Параметр | Ручная привязка | Автоматическая привязка |
|---|---|---|
| Время на 10 000 SKU | ~1 неделя | 2–4 часа |
| Риск ошибки | Высокий (человеческий фактор) | Минимальный (алгоритмический контроль) |
| Масштабируемость | Низкая | Высокая (пакетная обработка) |
| Экономия | Высокая стоимость часа работы | Снижение затрат в десятки раз |
Что входит в услугу
- Документация по текущей структуре привязки.
- Тестовый скрипт на копии базы (staging).
- Запуск массовой привязки на боевой базе.
- Отчёт о результатах: сколько предложений привязано, сколько пропущено.
- Консультация по дальнейшей интеграции с CommerceML для предотвращения повторных сбоев.
Типичные ошибки при привязке
- Отсутствие уникального ключа — когда XML_ID дублируются или пусты.
- Разные шаблоны генерации артикулов — приходится писать кастомные парсеры.
- Игнорирование кэширования — после привязки обязательно сбрасывать кэш инфоблоков.
- Неполная переиндексация — фасетный фильтр показывает старые данные.
Сроки и стоимость
| Объём предложений | Ориентировочное время |
|---|---|
| До 1 000 | 2–4 часа |
| 1 000 – 20 000 | 1 день |
| 20 000+ | 2–3 дня (с отладкой маппинга) |
Стоимость рассчитывается индивидуально. Получите консультацию — оценим проект бесплатно. Закажите восстановление каталога — и ваши товары снова будут в продаже.
Почему выбирают нашу команду
Наш опыт в восстановлении больших каталогов исчисляется сотнями успешных проектов. Мы работаем с магазинами, где количество торговых предложений превышает 100 000 единиц. Каждый проект индивидуален, и мы учитываем специфику хранения данных в вашей базе. Использование пакетной обработки и оптимизированных SQL-запросов позволяет нам работать с нагруженными базами данных без риска блокировок. После завершения работы предоставляем подробный отчёт о результатах и рекомендации по профилактике подобных проблем в будущем. Наши специалисты прошли официальное обучение по архитектуре 1С-Битрикс и имеют сертификаты разработчиков, что гарантирует высокое качество выполнения работы во всех случаях.
Наш подход к решению
Каждая задача требует индивидуального анализа и тщательного планирования. Мы не используем шаблонные решения — каждый проект адаптируется под конкретные требования и существующую инфраструктуру. Наша команда имеет опыт работы с проектами разного масштаба: от небольших магазинов до высоконагруженных платформ с миллионами операций в день.
Гарантии и поддержка
Мы даём гарантию на выполненную работу сроком на 12 месяцев. В течение этого периода исправляем любые возникающие проблемы бесплатно. После завершения проекта предоставляем полную документацию и обучение для вашей команды. Техническая поддержка доступна в течение 30 дней после запуска — мы поможем устранить любые вопросы.







