Переход на PIM-систему Salsify часто вызывает проблему: как перенести каталог на 50 000 SKU с 200 атрибутами в 1С-Битрикс без потери данных? Ручной импорт через Excel занимает до 3 месяцев и не гарантирует целостности. Разная структура атрибутов, вложенные значения и медиафайлы требуют продуманной интеграции. Мы предлагаем готовое решение на основе Salsify REST API, которое сокращает этот процесс до 1–2 недель. Интеграция строится так, чтобы данные текли в обе стороны. Получите бесплатную консультацию и оценку сложности вашего проекта.
Как мы реализуем интеграцию Salsify с Битрикс?
Salsify — облачная PIM-платформа для крупного e-commerce. Её REST API позволяет выгружать продукты, атрибуты и медиафайлы. Мы подключаемся через токен-аутентификацию и строим асинхронную синхронизацию через системных агентов Битрикс. Агент обрабатывает до 10 000 элементов за один запуск, что в 3 раза быстрее ручного импорта.
Основные эндпоинты Salsify API
-
GET products— список продуктов с атрибутами, фильтрация по дате обновления. -
GET products/{product_id}— конкретный продукт. -
GET property_groups— группы атрибутов. -
GET assets?filter[product_id]={id}— медиафайлы продукта. -
GET digital_assets/{id}/download— скачать файл.
Базовая аутентификация:
GET https://app.salsify.com/api/v1/orgs/{org_id}/products Authorization: Bearer {api_key} PHP-клиент для работы с API
Мы подготовили класс SalsifyClient, который инкапсулирует HTTP-запросы, пагинацию и обработку ошибок. Он использует \Bitrix\Main\Web\HttpClient:
class SalsifyClient { private string $baseUrl; private string $apiKey; public function __construct(string $orgId, string $apiKey) { $this->baseUrl = "https://app.salsify.com/api/v1/orgs/{$orgId}/"; $this->apiKey = $apiKey; } private function request(string $endpoint, array $params = []): array { $http = new \Bitrix\Main\Web\HttpClient(); $http->setHeader('Authorization', 'Bearer ' . $this->apiKey); $http->setHeader('Content-Type', 'application/json'); $url = $this->baseUrl . $endpoint; if ($params) { $url .= '?' . http_build_query($params); } $response = $http->get($url); return json_decode($response, true) ?? []; } public function getProducts(int $page = 1, int $perPage = 100, ?string $updatedAfter = null): array { $params = ['page' => $page, 'per_page' => $perPage]; if ($updatedAfter) { $params['filter[updated_at][gte]'] = $updatedAfter; } return $this->request('products', $params); } public function getProperties(): array { return $this->request('properties'); } public function downloadAsset(string $assetId): string { $http = new \Bitrix\Main\Web\HttpClient(); $http->setHeader('Authorization', 'Bearer ' . $this->apiKey); return $http->get($this->baseUrl . 'digital_assets/' . $assetId . '/download'); } } Маппинг атрибутов
Salsify хранит атрибуты в плоской структуре: каждый атрибут — пара «имя» : «значение». Мы настраиваем маппинг в конфигурационном файле, сопоставляя ID или имя атрибута с полями и свойствами инфоблока:
// /local/config/salsify-mapping.php return [ 'Product Name' => ['target' => 'NAME', 'type' => 'field'], 'Long Description' => ['target' => 'DETAIL_TEXT', 'type' => 'field'], 'Short Description' => ['target' => 'PREVIEW_TEXT', 'type' => 'field'], 'Brand' => ['target' => 'BRAND', 'type' => 'prop'], 'Net Weight (kg)' => ['target' => 'WEIGHT', 'type' => 'prop'], 'Color' => ['target' => 'COLOR', 'type' => 'prop'], 'Country of Origin' => ['target' => 'COUNTRY_ORIGIN','type' => 'prop'], 'GTIN' => ['target' => 'CML2_BAR_CODE', 'type' => 'prop'], 'Manufacturer SKU' => ['target' => 'CML2_ARTICLE', 'type' => 'prop'], ]; Агент синхронизации
Основной агент запускается по расписанию, запрашивает продукты, изменившиеся с последнего обновления, и создаёт или обновляет элементы инфоблока. Асинхронная синхронизация через агенты в 3 раза быстрее ручного импорта через административный интерфейс.
function syncSalsifyAgent(): string { $lastSync = \Bitrix\Main\Config\Option::get('salsify_sync', 'last_run', ''); $client = new SalsifyClient(SALSIFY_ORG_ID, SALSIFY_API_KEY); $mapping = include '/local/config/salsify-mapping.php'; $page = 1; $newSync = date('c'); do { $response = $client->getProducts($page, 100, $lastSync ?: null); $products = $response['products'] ?? []; foreach ($products as $product) { importSalsifyProduct($product, $mapping, $client); } $page++; $meta = $response['meta'] ?? []; } while (($meta['current_page'] ?? 1) < ($meta['total_pages'] ?? 1)); \Bitrix\Main\Config\Option::set('salsify_sync', 'last_run', $newSync); return __FUNCTION__ . '();'; } function importSalsifyProduct(array $product, array $mapping, SalsifyClient $client): void { $attributes = $product['attributes'] ?? []; $sku = $product['salsify:id']; $getValue = static function (array $attrs, string $key): mixed { return $attrs[$key] ?? null; }; $fields = ['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y']; $props = []; foreach ($mapping as $salsifyKey => $config) { $value = $getValue($attributes, $salsifyKey); if ($value === null) continue; if (is_array($value)) { $value = implode(', ', $value); } if ($config['type'] === 'field') { $fields[$config['target']] = $value; } else { $props[$config['target']] = $value; } } $existing = CIBlockElement::GetList( [], ['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'PROPERTY_CML2_ARTICLE' => $sku] )->Fetch(); $el = new CIBlockElement(); if ($existing) { $productId = $existing['ID']; $el->Update($productId, $fields); } else { $productId = $el->Add($fields); } if ($productId) { CIBlockElement::SetPropertyValuesEx($productId, CATALOG_IBLOCK_ID, $props); $primaryImage = $product['salsify:primary_image'] ?? null; if ($primaryImage) { importSalsifyAsset($productId, $primaryImage, $client); } } } Данные, передаваемые из Salsify в Битрикс
Синхронизация охватывает три группы данных:
- Основные атрибуты — название, описание, характеристики, GTIN, вес, цвет, страна происхождения.
- Медиафайлы — изображения, документы, видео. Поддерживаются два режима: полная загрузка на сервер или использование CDN-ссылок.
- Связи между продуктами — иерархии переносятся в структуру разделов и связей инфоблоков.
Цены обычно не синхронизируются — они поступают из 1С. Маппинг настраивается под конкретный каталог.
Как выбрать способ хранения медиа?
Есть два подхода: загружать файлы на сервер или хранить внешние CDN-ссылки. Сравним их:
| Критерий | Загрузка на сервер | Внешние CDN-ссылки |
|---|---|---|
| Контроль над файлами | Полный | Зависит от провайдера |
| Дисковое пространство | Требуется | Не требуется |
| Скорость загрузки страниц | Зависит от сервера | Быстрее (CDN) |
| Риск битых ссылок | Минимальный | Возможен при изменении URL |
| Нагрузка на сервер | Высокая (скачивание) | Низкая |
Для каталогов до 10 000 SKU часто выбирают загрузку, для крупных проектов — CDN.
Как настроить маппинг атрибутов?
Маппинг — ключевой этап. Для каждого атрибута Salsify мы указываем, в какое поле или свойство инфоблока он должен попасть. Поддерживаются множественные значения, справочники и привязки к highload-блокам. Мы предоставляем конфигурационный файл, который легко редактировать без изменения кода. Если атрибут Salsify имеет сложный тип (например, enum с вложенными полями), его нужно предварительно преобразовать — для этого используются кастомные функции-конвертеры.
Пример маппинга сложного атрибута
Допустим, в Salsify есть атрибут "Specifications" с вложенными полями: "Weight", "Dimensions", "Material". Маппинг преобразует его в несколько свойств инфоблока: WEIGHT, DIMENSIONS, MATERIAL. Кастомный конвертер парсит JSON-структуру и записывает значения в соответствующие поля.
Процесс работы
- Анализ структуры данных — изучение маппинга, выявление сложных атрибутов.
- Разработка клиента Salsify — с учётом пагинации, обработки ошибок и лимитов API.
- Настройка маппинга — для полей и свойств инфоблоков, включая множественные и справочники.
- Реализация агента синхронизации — с поддержкой дельты и вебхуков (опционально).
- Перенос медиафайлов — с выбором стратегии (скачивание или внешние ссылки).
- Тестирование и отладка — на тестовом каталоге, затем на боевом.
- Документация и передача — описание архитектуры, инструкция по эксплуатации.
Состав работ
- Архитектурная документация и схема интеграции.
- Исходный код с комментариями в репозитории.
- Настройка мониторинга агентов и алертов.
- Обучение вашей команды (1-2 сессии).
- Гарантийная поддержка в течение 1 месяца после запуска.
Сроки реализации
| Объём | Состав | Срок |
|---|---|---|
| До 5 000 SKU, базовый контент | Клиент + маппинг + агент | 1–2 недели |
| 10 000–100 000 SKU + медиа + вебхуки | + обработка сложных атрибутов + оптимизация | 3–4 недели |
| Мультирегиональный каталог (разные цены, контент по регионам) | + логика каналов Salsify + мультисайт Битрикс | 5–7 недель |
Типовые ошибки при интеграции
- Игнорирование сложных атрибутов (enum с вложенной структурой) — приводит к потере данных.
- Отсутствие обработки дубликатов по SKU — создаются дубли элементов.
- Синхронизация цен из Salsify без согласования — Salsify не рассчитан на цены, лучше брать их из 1С.
- Полное скачивание медиафайлов — перегружает сервер. Рекомендуем внешние URL.
Мы — сертифицированные специалисты по Битрикс с опытом более 7 лет. За это время реализовали 50+ проектов интеграции с внешними системами, включая PIM, ERP и маркетплейсы. Наши решения стабильно работают с каталогами до 100 000 SKU. Свяжитесь с нами для предварительной оценки сложности и сроков. Закажите бесплатную консультацию — мы подробно расскажем о процессе интеграции и ответим на ваши вопросы.
Подробнее о возможностях Salsify API читайте в официальной документации: Salsify API Guide.







