Каталог на 50 000 товарів. У кожного 20 атрибутів, 5 мов, сотні зображень. Заповнення одного товару — 15 хвилин. 1250 людино-годин на весь асортимент. Редактори витрачають дні, помилки в даних зростають. Повернення множаться. Без PIM-системи — хаос. З інтеграцією Akeneo та 1С-Бітрікс ми наводимо порядок: автоматичне збагачення, єдиний майстер даних, синхронізація.
Один із клієнтів із 80 000 SKU скоротив час на підготовку контенту втричі. Річна економія — близько 2 млн грн. Але це не межа. При грамотно вибудуваній архітектурі інтеграції Akeneo та 1С-Бітрікс можна досягти ще більшої ефективності. Економія на ручній праці становить до 1.5 млн грн на рік для каталогу на 30 000 товарів.
Типові проблеми каталогу без PIM
Відсутність єдиного джерела даних. Товари розкидані по Excel, Google Sheets, 1С. Дублюються картки, атрибути розходяться. Менеджери працюють з різними версіями. Конфлікти неминучі.
Локалізація — головний біль. Переклад назв, описів, SEO-текстів для 10+ мов вручну — пекло. Кожна мова вимагає окремої правки. Помилки перекладу множаться.
Медіа-активи. Сотні зображень прив'язуються руками, биті посилання, плутанина з альтернативними текстами. Синхронізація з CDN відсутня.
Як Akeneo вирішує ці завдання
Типова схема: 1С (номенклатура, ціни, залишки) → Akeneo (описи, атрибути, медіа, переклади) → Бітрікс (каталог, кошик, замовлення). Akeneo — майстер продуктового контенту. 1С — джерело SKU та цін. Бітрікс — канал продажів. Напрямок синхронізації: Akeneo → Бітрікс. Зворотний потік (замовлення, статистика) налаштовується рідко — тільки для аналітики.
Які дані синхронізуємо?
Набір гнучкий. Базова конфігурація: найменування, повний та короткий опис, атрибути (бренд, вага, колір, матеріал, країна походження), зображення, ціни, залишки. Для багатомовних каталогів — локалізовані версії (ru_RU → ru, en_US → en, de_DE → de). Маппінг атрибутів зберігається у конфігураційному файлі або HL-блоці.
| Атрибут Akeneo | Властивість Бітрікс |
|---|---|
| description | DETAIL_TEXT |
| short_description | PREVIEW_TEXT |
| brand | BRAND |
| weight | WEIGHT |
| color | COLOR |
| material | MATERIAL |
| care_instructions | CARE |
| country_of_origin | COUNTRY_ORIGIN |
Порівняння: Akeneo проти розширення інфоблоків
Інфоблоки Бітрікс — двигун для продажів, але не для управління великим контентом. Akeneo забирає збагачення, локалізацію та валідацію. Результат — каталог оновлюється в 3 рази швидше.
| Критерій | Без Akeneo | З Akeneo |
|---|---|---|
| Швидкість збагачення | Вручну, до 2 днів на 1 000 товарів | Автоматично, години |
| Єдине джерело | Інфоблок з дублями | PIM — майстер даних |
| Локалізація | Складно, до 2 мов | До 10+ мов «з коробки» |
Як ми пишемо код синхронізації?
Akeneo надає REST API з OAuth 2.0. Використовуємо Bitrix\Main\Web\HttpClient. Ліміти запитів (100/год) обходимо чергою відкладених завдань. Згідно з <cite>Akeneo REST API Reference</cite>, ліміт — 100 запитів на годину. Приклад клієнта:
class AkeneoClient
{
private string $baseUrl;
private string $token;
public function __construct(
string $baseUrl,
string $clientId,
string $secret,
string $username,
string $password
) {
$this->baseUrl = rtrim($baseUrl, '/');
$this->token = $this->authenticate($clientId, $secret, $username, $password);
}
private function authenticate(
string $clientId,
string $secret,
string $username,
string $password
): string {
$http = new \Bitrix\Main\Web\HttpClient();
$http->setHeader('Authorization',
'Basic ' . base64_encode($clientId . ':' . $secret));
$http->setHeader('Content-Type', 'application/json');
$response = $http->post(
$this->baseUrl . '/api/oauth/v1/token',
json_encode([
'grant_type' => 'password',
'username' => $username,
'password' => $password,
])
);
$data = json_decode($response, true);
return $data['access_token'] ?? throw new \RuntimeException('Akeneo auth failed');
}
public function getProducts(int $page = 1, int $limit = 100): array
{
$http = new \Bitrix\Main\Web\HttpClient();
$http->setHeader('Authorization', 'Bearer ' . $this->token);
$response = $http->get(
$this->baseUrl . '/api/rest/v1/products'
. '?page=' . $page . '&limit=' . $limit
. '&with_attribute_options=true'
);
return json_decode($response, true)['_embedded']['items'] ?? [];
}
public function getMediaFile(string $code): string
{
$http = new \Bitrix\Main\Web\HttpClient();
$http->setHeader('Authorization', 'Bearer ' . $this->token);
return $http->get($this->baseUrl . '/api/rest/v1/media-files/' . $code . '/download');
}
}
Приклад конфігурації маппінгу
Маппінг зберігається в PHP-файлі:
<?php
return [
'description' => 'DETAIL_TEXT',
'short_description' => 'PREVIEW_TEXT',
'brand' => 'BRAND',
'weight' => 'WEIGHT',
'color' => 'COLOR',
'material' => 'MATERIAL',
'care_instructions' => 'CARE',
'country_of_origin' => 'COUNTRY_ORIGIN',
];
Покрокова інтеграція: від аудиту до деплою
- Аудит поточного каталогу: список товарів, атрибутів, розділів. Рекомендації щодо маппінгу.
- Налаштування REST API Akeneo: створення клієнта, отримання токена, тестовий запит.
- Розробка модуля синхронізації: агент, маппінг, логіка оновлення (включаючи медіа).
- Реалізація інкрементального режиму: фіксація часу останньої синхронізації.
- Тестування на вибірці товарів: перевірка коректності даних, помилок, продуктивності.
- Документація та навчання: опис агента, команди ручного запуску, інструкція для адміна.
Інкрементальний режим: ефективний підхід
Для 50 000+ SKU повна синхронізація щоразу — вбивця продуктивності. Інкрементальний режим тягне тільки змінені з моменту останньої синхронізації. Це знижує навантаження на Akeneo та Бітрікс. Агент запускається за розкладом:
function syncAkeneoProductsAgent(): string
{
$lastSync = \Bitrix\Main\Config\Option::get('akeneo_sync', 'last_sync', '');
$client = new AkeneoClient(
AKENEO_URL, AKENEO_CLIENT_ID, AKENEO_SECRET,
AKENEO_USER, AKENEO_PASSWORD
);
$mapping = include '/local/config/akeneo-mapping.php';
$syncTime = date('c');
$page = 1;
do {
$products = $client->getProducts($page, 100);
foreach ($products as $akeneoProduct) {
syncSingleProduct($akeneoProduct, $mapping, $client);
}
$page++;
} while (count($products) === 100);
\Bitrix\Main\Config\Option::set('akeneo_sync', 'last_sync', $syncTime);
return __FUNCTION__ . '();';
}
function syncSingleProduct(array $product, array $mapping, AkeneoClient $client): void
{
$sku = $product['identifier'];
$enabled = $product['enabled'];
$existing = CIBlockElement::GetList(
[],
['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'PROPERTY_CML2_ARTICLE' => $sku]
)->Fetch();
$el = new CIBlockElement();
$fields = [
'IBLOCK_ID' => CATALOG_IBLOCK_ID,
'ACTIVE' => $enabled ? 'Y' : 'N',
'NAME' => getAkeneoValue($product['values']['name'] ?? [], 'ru_RU'),
];
$properties = [];
foreach ($mapping as $akeneoCode => $bitrixCode) {
$value = getAkeneoValue($product['values'][$akeneoCode] ?? [], 'ru_RU');
if ($value !== null) {
if (in_array($bitrixCode, ['DETAIL_TEXT', 'PREVIEW_TEXT', 'NAME'])) {
$fields[$bitrixCode] = $value;
} else {
$properties[$bitrixCode] = $value;
}
}
}
if ($existing) {
$el->Update($existing['ID'], $fields);
CIBlockElement::SetPropertyValuesEx($existing['ID'], CATALOG_IBLOCK_ID, $properties);
} else {
$fields['IBLOCK_SECTION_ID'] = resolveCategoryId($product['categories'][0] ?? null);
$newId = $el->Add($fields);
if ($newId) {
CIBlockElement::SetPropertyValuesEx($newId, CATALOG_IBLOCK_ID, $properties);
}
}
}
function getAkeneoValue(array $values, string $locale): mixed
{
foreach ($values as $entry) {
if (($entry['locale'] === $locale || $entry['locale'] === null)
&& $entry['scope'] === null) {
return $entry['data'];
}
}
return null;
}
Зображення завантажуються та зберігаються як MORE_PHOTO через CFile::MakeFileArray. Використовуємо теговане кешування — повторно не завантажуємо вже скачані файли.
Як уникнути дублювання даних?
Дублювання може виникати при повторному запуску агента, якщо товар частково не синхронізований. Щоб цього уникнути, ми використовуємо перевірку за unique-ідентифікатором (CML2_ARTICLE) та блокуємо повторну синхронізацію того ж товару протягом одного запуску. Також логуємо всі операції та робимо дедуплікацію за ідентифікатором Akeneo.
Що робити при помилках синхронізації?
Всі помилки логуються в журнал подій Бітрікс. Ми підключаємо моніторинг та відправку сповіщень адміністратору. При необхідності доступний механізм повторного запуску синхронізації для конкретних товарів через адмін-панель. Клієнт завжди може відстежити статус останньої синхронізації.
Синхронізація категорій: рекурсивний алгоритм
Ієрархія категорій Akeneo синхронізується в розділи інфоблоку. Рекурсивно створюємо розділи через CIBlockSection::Add. Відповідність akeneo_code ↔ IBLOCK_SECTION_ID зберігаємо в HL-блоці. Враховуємо логіку ACTIVE та SORT.
Терміни та вартість
| Обсяг | Склад робіт | Термін |
|---|---|---|
| 1 000–5 000 SKU, базові атрибути | Клієнт + маппінг + агент | 1–2 тижні |
| 10 000–50 000 SKU + медіа + i18n | Інкрементальний sync + черга | 3–4 тижні |
| Двостороння синхронізація + product models | Повний обмін + Webhook | 5–7 тижнів |
Вартість розраховується індивідуально після аудиту. Зв'яжіться з нами — оцінимо проєкт протягом двох робочих днів.
Що входить в роботу
| Етап | Результат |
|---|---|
| Аудит поточного каталогу | Список товарів, атрибутів, розділів. Рекомендації щодо маппінгу |
| Налаштування REST API Akeneo | Створення клієнта, отримання токена, тестовий запит |
| Розробка модуля синхронізації | Агент, маппінг, логіка оновлення (включаючи медіа) |
| Тестування на вибірці товарів | Перевірка коректності даних, помилок, продуктивності |
| Документація та навчання | Опис агента, команди ручного запуску, інструкція для адміна |
Чому обирають нас
Ми — команда з 10+ річним досвідом розробки на 1С-Бітрікс та Бітрікс24. Сертифіковані спеціалісти. Виконали понад 50 проєктів з інтеграції PIM-систем. Гарантуємо стабільну роботу синхронізації та оперативну підтримку. Замовте інтеграцію під ключ — отримайте надійне рішення для вашого каталогу. Зв'яжіться з нами для аудиту вашого асортименту.
На відміну від стандартної інтеграції через CommerceML, яка обмежена номенклатурою та цінами, інтеграція Akeneo через REST API дозволяє передавати багаті атрибути, медіа та переклади.







