Интеграция 1С-Битрикс с Competera (мониторинг цен)
Competera — платформа динамического ценообразования и мониторинга конкурентов. Ядро системы — алгоритмы машинного обучения, которые анализируют данные конкурентов, эластичность спроса и дают рекомендации по ценам. Задача интеграции с Битрикс: получать эти рекомендации и либо применять автоматически, либо показывать категорийному менеджеру для ручного решения.
API Competera
Competera предоставляет REST API. Базовый URL: https://api.competera.io/v1/. Авторизация — API-ключ в заголовке X-Api-Key. Ключевые эндпоинты:
-
GET /products— каталог товаров в Competera -
POST /products/upload— загрузка/обновление каталога -
GET /repricing/recommendations— рекомендации по ценам -
POST /prices/upload— загрузка актуальных цен из магазина -
GET /competitors/prices— цены конкурентов по вашим товарам
Синхронизация каталога Битрикс → Competera
Competera нужен каталог товаров с вашей стороны: SKU, название, EAN, текущая цена, себестоимость (опционально). Формат — CSV или JSON.
Агент выгружает изменения раз в сутки (или при изменении товара):
function SyncCatalogToCompetera(): string
{
$products = \CIBlockElement::GetList(
['ID' => 'ASC'],
['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y'],
false,
['nPageSize' => 1000],
['ID', 'NAME', 'PROPERTY_ARTICLE', 'PROPERTY_BARCODE']
);
$rows = [['sku', 'name', 'ean', 'price', 'cost', 'category']];
while ($product = $products->GetNext()) {
$price = \CCatalogProduct::GetOptimalPrice($product['ID'])['PRICE']['PRICE'] ?? 0;
$cost = \CIBlockElement::GetProperty(CATALOG_IBLOCK_ID, $product['ID'], [], ['CODE' => 'COST_PRICE'])->Fetch()['VALUE'] ?? 0;
$rows[] = [
$product['PROPERTY_ARTICLE_VALUE'],
$product['NAME'],
$product['PROPERTY_BARCODE_VALUE'],
$price,
$cost,
$product['SECTION_NAME'],
];
}
$csv = implode("\n", array_map('str_getcsv', $rows));
$competera->post('/products/upload', ['file' => $csv, 'format' => 'csv']);
return __FUNCTION__ . '();';
}
Получение рекомендаций и применение цен
GET /repricing/recommendations возвращает массив с рекомендованными ценами, причинами изменения и уровнем уверенности алгоритма:
{
"recommendations": [
{
"sku": "ART-12345",
"current_price": 4990.00,
"recommended_price": 4750.00,
"reason": "competitor_undercut",
"confidence": 0.87,
"competitor_min": 4720.00
}
]
}
Логика применения зависит от настроек:
foreach ($recommendations as $rec) {
$product = ProductRepository::findBySku($rec['sku']);
if (!$product) continue;
$autoApply = (bool)\Bitrix\Main\Config\Option::get('competera', 'auto_apply_' . $product['SECTION_ID'], false);
$minConfidence = (float)\Bitrix\Main\Config\Option::get('competera', 'min_confidence', 0.8);
if ($autoApply && $rec['confidence'] >= $minConfidence) {
// Применяем автоматически
\CCatalogProduct::Update($product['ID'], ['PRICE' => $rec['recommended_price']]);
\CCatalogProduct::SetPrice($product['ID'], BASE_PRICE_TYPE_ID, $rec['recommended_price']);
PriceChangeLog::write($product['ID'], $rec['current_price'], $rec['recommended_price'], 'competera_auto');
} else {
// Ставим в очередь на одобрение менеджеру
CompeteraPendingTable::add([
'PRODUCT_ID' => $product['ID'],
'CURRENT_PRICE' => $rec['current_price'],
'RECOMMENDED' => $rec['recommended_price'],
'CONFIDENCE' => $rec['confidence'],
'REASON' => $rec['reason'],
'STATUS' => 'pending',
]);
}
}
Интерфейс одобрения рекомендаций
В административной части Битрикс — страница «Рекомендации Competera» с таблицей:
| Товар | Артикул | Текущая цена | Рек. цена | Изменение | Конкуренты от | Уверенность | Действие |
|---|---|---|---|---|---|---|---|
| Фен Philips BHD... | ART-12345 | 4990 ₽ | 4750 ₽ | −4.8% | 4720 ₽ | 87% | [Применить] [Отклонить] |
При клике «Применить» — вызов API изменения цены в Битрикс + обновление статуса в bl_competera_pending. При «Отклонить» — статус rejected, рекомендация не применяется.
Сроки
| Этап | Срок |
|---|---|
| API-клиент Competera + аутентификация | 1 день |
| Синхронизация каталога и цен | 2 дня |
| Получение рекомендаций + логика применения | 2 дня |
| Интерфейс одобрения менеджером | 2 дня |
| Логирование и тестирование | 1 день |
| Итого | 8–10 дней |







