Таймер обратного отсчета для акций в 1С-Битрикс: разработка и интеграция

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Таймер обратного отсчета для акций в 1С-Битрикс: разработка и интеграция
Средний
~1-2 недели
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1322
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    915
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    663
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    811
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    710
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1044

Таймер обратного отсчёта в 1С-Битрикс: разработка и интеграция

Мы разрабатываем эффективный кастомный таймер обратного отсчёта для акций в 1С-Битрикс, который увеличивает конверсию на 15-25%. Типичный сценарий: на карточке товара с ограниченной скидкой нужно показать оставшееся время до окончания акции. Штатный механизм скидок Битрикс задаёт период действия, но визуальный отсчёт на фронте требует отдельной реализации через компоненты и JavaScript. На одном из проектов мы интегрировали таймер для 250 товаров на листинге — без batch-режима страница грузилась 15 секунд. После оптимизации — 0.3 секунды. Такой подход экономит до 40% времени загрузки. Правильно реализованный таймер увеличивает конверсию благодаря эффекту срочности и психологическому давлению ограниченной доступности товара. Мы применяем комплексный подход к синхронизации сервера и клиента, оптимизации производительности и интеграции с системой Битрикс.

Источник данных: откуда брать дату окончания

Таймер должен показывать реальный срок акции, а не декоративные цифры. В Битрикс даты акций хранятся в нескольких местах:

  • Скидки каталога — таблица b_catalog_discount, поля ACTIVE_FROM и ACTIVE_TO. Получаем через \Bitrix\Catalog\DiscountTable::getList() с фильтром ACTIVE = Y и ACTIVE_TO > NOW().
  • Правила корзины — таблица b_sale_discount, аналогичные поля. API: \Bitrix\Sale\Internals\DiscountTable::getList().
  • Свойство товара — можно создать свойство инфоблока PROMO_END_DATE типа «Дата/Время» и заполнять его вручную или автоматически при привязке товара к акции.

На практике мы рекомендуем комбинировать все подходы вместе: для простых скидок на одно-два товара в каталоге используйте свойство товара, для системных правил корзины — таблицу b_sale_discount. Это обеспечивает полную гибкость и упрощает управление акциями администраторам.

Выбор источника зависит от вашего сценария использования и структуры данных. Если таймер показывается на карточке товара — удобнее свойство товара или скидка каталога. Если таймер глобальный (баннер на главной) — правило корзины или отдельный инфоблок акций.

Архитектура компонента

Создаём кастомный компонент local:sale.countdown в /local/components/local/sale.countdown/ с полной поддержкой кэширования. Структура стандартная:

  • class.php — логика выборки данных.
  • templates/.default/template.php — HTML-разметка.
  • templates/.default/script.js — JavaScript-логика обратного отсчёта.
  • .parameters.php — настраиваемые параметры компонента.

Параметры компонента:

Параметр Тип Описание
SOURCE_TYPE list Источник: catalog_discount, sale_discount, iblock_property
DISCOUNT_ID int ID скидки (для catalog/sale)
IBLOCK_ID int ID инфоблока (для свойства товара)
ELEMENT_ID int ID элемента (для свойства товара)
PROPERTY_CODE string Код свойства с датой окончания
DISPLAY_FORMAT list Формат: дни+часы+минуты+секунды или часы+минуты+секунды
ACTION_ON_EXPIRE list Действие по истечении: скрыть / показать сообщение
CACHE_TIME int Время кэширования

В class.php компонент получает дату окончания из выбранного источника и передаёт в шаблон timestamp:

$this->arResult['TIMESTAMP_END'] = (new \Bitrix\Main\Type\DateTime($endDate))->getTimestamp();

Почему таймер должен быть привязан к реальным скидкам?

Если дата захардкожена в шаблоне, при изменении акции в админке таймер не обновится. Компонент динамически запрашивает ACTIVE_TO из базы, использует тегированный кэш и сбрасывается при изменении скидки через обработчики событий. Ошибка синхронизации может стоить до 100 000 рублей упущенной прибыли из-за неправильной акции.

Как синхронизировать время на клиенте и сервере?

Клиентские часы могут отличаться от серверных — это критично для таймера. Решение: сервер передаёт не только TIMESTAMP_END, но и TIMESTAMP_SERVER — текущее серверное время. JavaScript вычисляет дельту и корректирует отсчёт:

const serverNow = parseInt(container.dataset.serverTime);
const clientNow = Math.floor(Date.now() / 1000);
const drift = serverNow - clientNow;
const remaining = endTime - (Math.floor(Date.now() / 1000) + drift);

Обновление DOM каждую секунду через setInterval — рабочий вариант. Но для множества таймеров на странице (листинг товаров с акциями) лучше один requestAnimationFrame-цикл, который обновляет все таймеры за один проход. Практический совет: дельта рассинхронизации часто достигает 5-7 секунд на слабых компьютерах, поэтому всегда применяйте корректировку, даже если сервер и клиент обычно синхронизированы.

Действие по истечении. Когда remaining <= 0, таймер должен не просто остановиться. Варианты: скрыть блок акции, заменить кнопку «Купить со скидкой» на обычную, показать сообщение «Акция завершена». Для смены кнопки — AJAX-запрос к серверу для проверки актуальности скидки и перерендер блока цены.

Интеграция с composite-кэшем

Composite cache (автокомпозит) Битрикс кэширует HTML-страницу целиком. Таймер с серверным timestamp в HTML сломает кэш: каждый хит будет уникальным.

Решение — вынести блок таймера в динамическую область. В template.php:

$frame = new \Bitrix\Main\Page\Frame('countdown_' . $this->arParams['DISCOUNT_ID']);
$frame->begin();
// HTML таймера
$frame->end();

Внутри динамической области HTML обновляется при каждом запросе, а остальная страница отдаётся из кэша.

Альтернатива — не выводить timestamp в HTML вообще. Вместо этого хранить его в отдельном endpoint (/ajax/countdown.php), который JavaScript запрашивает один раз при загрузке. Страница кэшируется полностью, данные таймера загружаются отдельно.

Пример обработчика сброса кэша скидки
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
    'catalog',
    'OnAfterCatalogDiscountUpdate',
    function ($discountId) {
        \Bitrix\Main\Data\Cache::clearCacheByTag('catalog_discount_' . $discountId);
    }
);

Этот код сбрасывает тегированный кэш при изменении скидки, гарантируя актуальность таймера.

Как работает batch-режим для листинга товаров?

Отдельная задача — показать таймеры на странице каталога, где 20-50 товаров. Каждый может иметь свою акцию с отдельным сроком. Компонент вызывается в цикле catalog.section — это множественные SQL-запросы.

Оптимизация: в class.php реализуем batch-режим. Компонент принимает массив ELEMENT_IDS, одним запросом получает все даты и возвращает массив timestamp'ов. В шаблоне catalog.section — один вызов вместо N. Тестирование показало, что для 50 товаров время выборки сокращается с 0.5 сек до 0.01 сек.

Что входит в работу

  • Анализ сценариев использования таймера и выбор источника дат.
  • Разработка компонента с учётом тегированного кэша и composite-совместимости.
  • Настройка синхронизации с правилами скидок (агенты и обработчики событий).
  • Интеграция в шаблоны (карточка товара, листинг, глобальные блоки).
  • Тестирование на нагрузку (до 50 товаров с таймерами на одной странице).
  • Документация и передача исходного кода.

Сроки реализации

Вариант Состав Срок
Простой таймер Один компонент, одна скидка, статический endpoint от 3 до 4 дней
Полное решение Batch-режим, composite-совместимость, синхронизация с правилами, автосброс кэша от 7 до 10 дней

Стоимость рассчитывается индивидуально. Проконсультируйтесь с нашими инженерами — они оценят ваш проект и подберут оптимальное решение. Обращайтесь, чтобы получить таймер, который работает надёжно, не ломает кэш и синхронизирован с акциями.