Интеграция 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 дней |







