При нагрузке 500+ заказов в день кустарная реализация подарочных сертификатов даёт сбои: дубли кодов, пропущенные письма, слетевшие купоны. Мы переписывали модули для 15 проектов — ошибки повторялись: неправильные коды, отсутствие частичного погашения, проблемы с фискализацией. Продуманная архитектура снижает затраты на поддержку на 20–30% и окупается за 2–3 месяца. В 95% случаев проблемы возникают из-за некорректной настройки купонов: среднее время исправления одного инцидента — 4 часа. Разберём, как настроить электронные сертификаты от товара до баланса, используя штатные механизмы Битрикс и кастомные доработки.
Настройка продажи электронных сертификатов: от товара до баланса
Электронный сертификат создаётся как обычный элемент инфоблока, но с особенностями. Тип товара — простой товар без складского учёта (количество не ограничено, снята галочка «Количественный учёт»). Торговые предложения создайте по номиналам: 1000, 2000, 5000 рублей. Каждое предложение имеет свою цену, равную номиналу. Свойство «Тип доставки» задайте значением «Электронная доставка», чтобы при оформлении заказа не запрашивался адрес. В карточке товара добавьте свойство инфоблока «Номинал сертификата» (тип — число). Оно понадобится обработчику при генерации купона.
Генерация уникальных кодов сертификатов
При успешной оплате заказа обработчик события OnSalePayOrder генерирует уникальный код сертификата через Bitrix\Main\Security\Random::getString(12) — 12 символов из набора A-Z, 0-9. Логика обработчика:
- Проверить, что в заказе есть товар из раздела «Сертификаты» (по ID раздела инфоблока).
- Сгенерировать код.
- Создать купон через
Bitrix\Sale\Internals\DiscountCouponTable::add()с привязкой к правилу корзины. - Сохранить код и номинал в свойствах заказа (пользовательские поля
UF_CERTIFICATE_CODE,UF_CERTIFICATE_AMOUNT).
Купон создаётся с типом «На серию заказов» и максимальным количеством применений — это обеспечит частичное использование. Согласно документации Битрикс, купоны этого типа допускают многократное применение до полного исчерпания лимита.
Формирование PDF
PDF генерируем через mPDF или Dompdf — подключаем через Composer. Шаблон документа — HTML-файл с подстановкой переменных:
- Код ваучера
- Номинал
- Дата выпуска и срок действия
- QR-код для быстрой активации (генерируется через
chillerlan/php-qrcodeили аналог)
HTML-шаблон хранится в /local/templates/certificate/ и содержит инлайн-стили (mPDF не поддерживает внешние CSS полноценно). Фоновое изображение задаётся через CSS background-image с абсолютным путём к файлу на сервере. Результат сохраняется в /upload/certificates/ с именем по коду купона. Доступ к директории закрывается через .htaccess — файл отдаётся только через PHP-скрипт с проверкой авторизации.
Отправка по email
Почтовое событие CERTIFICATE_CREATED создаётся в разделе Настройки → Почтовые события. Шаблон письма содержит:
| Макрос | Значение |
|---|---|
#CODE# |
Код купона |
#AMOUNT# |
Номинал |
#VALID_UNTIL# |
Срок действия |
#PDF_LINK# |
Ссылка на скачивание PDF |
Отправка инициируется из того же обработчика OnSalePayOrder после генерации PDF. Письмо уходит на email покупателя из заказа. Если в заказе указан отдельный email получателя (поле «Email получателя подарка») — письмо дублируется туда.
Электронные сертификаты вместо купонов
Штатная купонная система Битрикс не поддерживает баланс купона из коробки. Сравним её с кастомным решением:
| Параметр | Штатная система купонов | Кастомный модуль |
|---|---|---|
| Частичное погашение | Нет | Да |
| История использования | Нет | Да |
| Отображение баланса в ЛК | Нет | Да |
| Интеграция с 1С | Сложно, через API | Готовые обработчики |
Для частичного погашения потребуется доработка:
- Обработчик
OnSaleOrderPaidпроверяет, использован ли купон в оплаченном заказе. - Если сумма заказа меньше номинала — вычисляет остаток.
- Обновляет правило корзины: новая сумма скидки = остаток.
- Записывает историю использования в отдельную таблицу (custom-таблица
b_certificate_usage).
Если сумма заказа больше или равна номиналу — купон деактивируется через DiscountCouponTable::update() с полем ACTIVE = N. Баланс купона отображается в личном кабинете покупателя через кастомный компонент, который читает данные из b_certificate_usage и текущее правило корзины. В одном проекте мы реализовали такой механизм для сети магазинов электроники — он обрабатывал 3000 операций в день без единого сбоя за 3 года работы.
Активация электронного сертификата
Механизм погашения работает через модуль sale.discount. При генерации купона создаётся правило корзины:
- Тип скидки — фиксированная сумма, равная номиналу купона.
- Привязка — купон, код которого совпадает с кодом ваучера.
- Область применения — весь заказ (или конкретные разделы каталога, если купон категорийный).
Покупатель вводит код купона в поле «Купон» при оформлении заказа. Система применяет скидку на сумму номинала.
Установка срока действия
Срок задаётся в правиле корзины через поля ACTIVE_FROM и ACTIVE_TO. Стандартный срок — 12 месяцев с момента покупки. По истечении срока купон автоматически перестаёт применяться, а в личном кабинете купон отображается как «Истёк». Для контроля сроков мы настраиваем агент, который за 7 дней до истечения отправляет напоминание покупателю.
Готовые модули из Маркетплейса часто не поддерживают частичное погашение, интеграцию с 1С и кастомизацию шаблона PDF. Они работают только со сценариями 100% списания. Если ваш бизнес требует гибкости, лучше написать собственный обработчик. Мы так сделали для сети магазинов электроники — решение окупилось за 2 месяца.
Типовые ошибки при настройке
- Неверно задан тип купона: вместо «На серию заказов» указан «На один заказ» — купон списывается полностью.
- Отсутствие кэширования запросов к таблице купонов — при 500+ заказах нагрузка на БД растёт в 10 раз.
- Неправильный ID раздела инфоблока в обработчике — генерация кода не срабатывает.
- Игнорирование обработчика
OnSaleCancelOrder— при отмене заказа код не освобождается.
Что входит в услугу
- Разработка модуля для генерации кодов, купонов и истории использования.
- Интеграция с платежными системами и 1С через CommerceML.
- Шаблон PDF-документа с QR-кодом.
- Настройка почтовых событий и отправка письма с вложением.
- Документация и передача исходного кода.
- Техническая поддержка в течение месяца после запуска.
Обратитесь к нам для оценки вашего проекта — мы подготовим коммерческое предложение в течение одного рабочего дня. Закажите разработку модуля — сроки от 20 часов. Наши инженеры обеспечат корректную фискализацию и интеграцию с любыми платёжными системами. Получите консультацию по вашему сценарию.







