Інтеграція 1С-Бітрікс з Metacommerce (моніторинг цін)
Metacommerce — російський сервіс моніторингу цін конкурентів. Спеціалізується на рітейлі: парсить ціни з сайтів конкурентів, маркетплейсів (Wildberries, Ozon, Яндекс.Маркет) і агрегує в єдиний звіт. Інтеграція з Бітрікс дозволяє бачити позицію за ціною безпосередньо в картці товару і на основі цих даних приймати цінові рішення.
API Metacommerce
Metacommerce надає REST API. Базовий URL залежить від тарифу, авторизація через Authorization: Token {api_token}. Основні методи:
-
GET /api/v3/products/— список товарів у проекті Metacommerce -
GET /api/v3/products/{id}/prices/— ціни конкурентів по конкретному товару -
GET /api/v3/reports/price-position/— звіт про цінову позицію -
POST /api/v3/products/— додавання товарів для моніторингу
Зіставлення товарів
Metacommerce зберігає свої товари з ID, які потрібно зіставити з товарами в Бітрікс. Маппінг зберігається в bl_metacommerce_product_map:
CREATE TABLE bl_metacommerce_product_map (
bitrix_product_id INT NOT NULL PRIMARY KEY,
metacommerce_id VARCHAR(64) NOT NULL,
last_position SMALLINT, -- місце за ціною серед конкурентів
last_check TIMESTAMP,
min_competitor_price NUMERIC(12,2),
max_competitor_price NUMERIC(12,2),
avg_competitor_price NUMERIC(12,2),
UNIQUE (metacommerce_id)
);
Первинне зіставлення виконується за EAN/артикулом через POST /api/v3/products/match. Незіставлені товари потребують ручного зіставлення.
Синхронізація цінової позиції
Агент раз на годину отримує свіжі дані по всіх товарах:
function SyncMetacommercePositions(): string
{
$mappedProducts = MetacommerceMapTable::getList(['select' => ['BITRIX_PRODUCT_ID', 'METACOMMERCE_ID']]);
$ids = array_column($mappedProducts->fetchAll(), 'METACOMMERCE_ID');
// Пакетний запит позицій
$positions = $metacommerceClient->get('/api/v3/reports/price-position/', [
'product_ids' => implode(',', $ids),
'date' => date('Y-m-d'),
]);
foreach ($positions['results'] as $pos) {
$bitrixId = MetacommerceMapTable::getByMetacommerceId($pos['product_id'])['BITRIX_PRODUCT_ID'] ?? null;
if (!$bitrixId) continue;
MetacommerceMapTable::update($bitrixId, [
'LAST_POSITION' => $pos['rank'],
'LAST_CHECK' => new \Bitrix\Main\Type\DateTime(),
'MIN_COMPETITOR_PRICE' => $pos['min_price'],
'MAX_COMPETITOR_PRICE' => $pos['max_price'],
'AVG_COMPETITOR_PRICE' => $pos['avg_price'],
]);
// Оновлюємо UF-поля товару в інфоблоці для відображення в картці
\CIBlockElement::SetPropertyValuesEx($bitrixId, CATALOG_IBLOCK_ID, [
'COMPETITOR_MIN_PRICE' => $pos['min_price'],
'PRICE_RANK' => $pos['rank'],
]);
}
return __FUNCTION__ . '();';
}
Відображення цінової позиції в картці товару (каталог)
В адміністративному редакторі товару додаємо вкладку «Моніторинг цін». Дані підтягуються з bl_metacommerce_product_map і bl_metacommerce_price_history.
На публічній стороні — віджет для категорійного менеджера (видимий лише авторизованим з потрібними правами): «Ви на X місці. Мінімальна ціна конкурента: Y грн.»
Історія цін конкурентів
Для аналітики зберігаємо історичні дані в bl_metacommerce_price_history:
CREATE TABLE bl_metacommerce_price_history (
id SERIAL PRIMARY KEY,
bitrix_product_id INT NOT NULL,
check_date DATE NOT NULL,
our_price NUMERIC(12,2),
min_competitor NUMERIC(12,2),
avg_competitor NUMERIC(12,2),
rank SMALLINT,
UNIQUE (bitrix_product_id, check_date)
);
Це дозволяє будувати графіки динаміки позиції за період у дашборді.
Терміни
| Етап | Термін |
|---|---|
| API-клієнт + зіставлення товарів | 2 дні |
| Синхронізація позицій (агент) | 2 дні |
| Відображення в картці товару | 1–2 дні |
| Історія + дашборд | 2 дні |
| Тестування | 1 день |
| Разом | 8–9 днів |







