Перехід на 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.







