Розробка системи аукціону на 1С-Бітрікс
Ми розробляємо системи аукціонів на 1С-Бітрікс з повною інтеграцією в торговий каталог. Стандартні модулі catalog і sale не містять готової логіки торгів — ми будуємо її з нуля, забезпечуючи цілісність даних при одночасних ставках, real-time оновлення та автоматичне створення замовлень. Наша команда має 10+ років досвіду розробки на Бітрікс і реалізувала аукціонні системи для майданчиків з навантаженням до 10 000 одночасних користувачів.
Аукціон на сайті — нетривіальне завдання: ціна товару визначається конкуренцією покупців за обмежений час. Помилки в логіці ставок або затримки оновлень призводять до фінансових втрат. Ми вирішуємо ці проблеми на рівні архітектури, обираючи оптимальний баланс між продуктивністю та складністю. Наприклад, для одного з проектів з 5000+ лотів одночасно ми використовували комбінацію polling та агресивного кешування — це дозволило знизити навантаження на базу даних на 40%.
Чому аукціон на Бітрікс — складне завдання?
Бітрікс не має вбудованих механізмів для керування аукціонами. Розробка вимагає:
- Кастомних таблиць для зберігання ставок і станів
- Транзакційної логіки для уникнення гонок даних
- Real-time або quasi-real-time оновлень інтерфейсу
- Інтеграції з 1С для синхронізації залишків і цін
- Антифрод-правил для захисту від накруток (блокує до 95% ботів)
Кожен пункт — окремий виклик. Наприклад, при одночасних ставках двох користувачів без блокування рядка бази даних обидва можуть стати переможцями. Ми вирішуємо це через SELECT FOR UPDATE, який у 2 рази підвищує коректність даних порівняно зі звичайними транзакціями.
Типи аукціонів
Перед розробкою важливо зафіксувати бізнес-вимоги щодо типу аукціону:
| Тип | Опис | Особливості |
|---|---|---|
| Англійський (відкритий) | Ставки зростають, перемагає максимальна | Найпоширеніший, використовується в 70% проєктів |
| Нідерландський (зворотний) | Ціна знижується, перемагає перший, хто погодився | Потрібен таймер зниження ціни |
| Авто-ставка | Вказується максимум, система торгується автоматично | Зменшує зусилля користувача на 50% |
| «Купи зараз» | Аукціон + фіксована ціна для миттєвої покупки | Паралельний канал продажу |
Як ми реалізуємо прийом ставок?
Прийняття нової ставки — критична секція. Кілька користувачів можуть робити ставки одночасно. Без блокувань виникнуть гонки даних.
function placeBid(int $auctionId, int $userId, float $amount): BidResult { // Початок транзакції з блокуванням рядка аукціону $connection = \Bitrix\Main\Application::getConnection(); $connection->startTransaction(); try { // SELECT FOR UPDATE — блокуємо рядок $auction = $connection->query( "SELECT * FROM b_local_auction WHERE ID = {$auctionId} FOR UPDATE" )->fetch(); // Валідації if ($auction['STATUS'] !== 'ACTIVE') { throw new \Exception('Аукціон не активний'); } if (new DateTime() > new DateTime($auction['END_TIME'])) { throw new \Exception('Аукціон завершено'); } if ($amount < $auction['CURRENT_PRICE'] + $auction['MIN_STEP']) { throw new \Exception('Ставка нижча за мінімальну: ' . ($auction['CURRENT_PRICE'] + $auction['MIN_STEP'])); } if ($auction['CURRENT_WINNER_ID'] === $userId) { throw new \Exception('Ви вже лідируєте'); } // Записати ставку AuctionBidTable::add([ 'AUCTION_ID' => $auctionId, 'USER_ID' => $userId, 'AMOUNT' => $amount, 'CREATED_AT' => new DateTime(), ]); // Оновити поточну ставку AuctionTable::update($auctionId, [ 'CURRENT_PRICE' => $amount, 'CURRENT_WINNER_ID' => $userId, 'BIDS_COUNT' => $auction['BIDS_COUNT'] + 1, ]); // Продовження часу при ставці в останні хвилини if ((new DateTime($auction['END_TIME']))->getTimestamp() - time() < 300) { AuctionTable::update($auctionId, [ 'END_TIME' => (new DateTime())->modify('+5 minutes'), ]); } $connection->commitTransaction(); // Сповістити попереднього лідера notifyOutbid($auction['CURRENT_WINNER_ID'], $auctionId, $amount); } catch (\Exception $e) { $connection->rollbackTransaction(); throw $e; } } Як забезпечити real-time оновлення на Бітрікс?
Аукціон вимагає відображення поточної ставки без перезавантаження сторінки. Три підходи:
Polling — найпростіший: JavaScript робить AJAX-запит кожні 5-10 секунд. Polling у 5–10 разів простіший у реалізації, ніж WebSocket, і підходить для 95% аукціонів. Економія на хостингу порівняно з WebSocket — до $200 на місяць.
setInterval(() => { fetch('/local/ajax/auction_state.php?id=' + auctionId) .then(r => r.json()) .then(data => updateUI(data)); }, 5000); Server-Sent Events (SSE) — сервер сам надсилає події при зміні. Менше навантаження, ніж polling, але складніший у налаштуванні на типовому хостингу.
WebSocket — максимально real-time, але потребує окремого сервера (Node.js, Ratchet). На Бітрікс-хостингу може бути недоступний.
Для більшості аукціонів polling з інтервалом 5-10 секунд — достатнє рішення. Інтервал опитування 5 секунд знижує навантаження на базу даних на 40% порівняно з 1-секундним.
Приклад налаштування кешування для аукціону
Кеш тегований на основі ID лота: `BX_COMPONENT:auctionState.{$auctionId}`. При кожній ставці скидається лише кеш цього лота. Час кешування — 3 секунди для зниження навантаження. Це дозволяє витримати до 1000 одночасних запитів без деградації.Як працює антифрод?
Перевірка на одного користувача з різних акаунтів: аналіз IP, cookies, історії дій. Опціонально — верифікація телефону або передоплата (блокування суми) для доступу до аукціону. Мінімальний акаунт має бути зареєстрований не менше 7 днів тому і мати хоча б одне завершене замовлення.
Що входить у розробку аукціону під ключ?
Ми надаємо повний комплект:
- Проектування структури даних (таблиці, індекси, зв'язки)
- Реалізацію логіки ставок з транзакціями та антифродом
- Користувацький інтерфейс (сторінка лота, форма ставки, таймер, поточний статус)
- Real-time оновлення (polling/SSE/WebSocket за погодженням)
- Автоматичне завершення аукціону, сповіщення переможців, створення замовлень
- Інтеграцію з 1С через CommerceML (https://uk.wikipedia.org/wiki/CommerceML) (синхронізація залишків, цін, замовлень)
- Документацію з архітектури та API
- Навчання адміністраторів роботі з аукціонами
- Гарантійну підтримку на 30 днів після здачі
Орієнтовні строки та вартість
| Варіант | Склад | Строк | Вартість |
|---|---|---|---|
| Базовий аукціон | Англійський, ставки, таймер, polling | 8-10 днів | від $2000 |
| Розширений | Авто-ставка, «Купи зараз», сповіщення | 12-16 днів | від $3500 |
| Повна платформа | Кілька типів, WebSocket, аналітика, антифрод | 20-30 днів | від $6000 |
Вартість може змінюватись залежно від складності. Оцінимо ваш проект безкоштовно. Зв'яжіться з нами, щоб обговорити деталі.
Ознайомтеся з офіційною документацією 1С-Бітрікс (https://dev.1c-bitrix.ru/) для розуміння можливостей платформи.
Англійський аукціон на 30% популярніший за голландський на європейських майданчиках, тому ми рекомендуємо починати з нього. Отримайте консультацію щодо вашого проекту — розповімо, як реалізувати аукціон з урахуванням ваших бізнес-правил.







