Каталог на 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 позволяет передавать богатые атрибуты, медиа и переводы.







