Разработка функционала «назови свою цену» на 1С-Битрикс

Вы хотите дать покупателю возможность самому назначить цену — модель [Pay What You Want](https://en.wikipedia.org/wiki/Pay_what_you_want) (PWYW). Стандартный 1С-Битрикс жёстко фиксирует цены в инфоблоке, модуль sale не принимает произвольную сумму. Клиенты часто жалуются на невозможность пожертвоват
Услуги, которые мы предлагаем
Показано 1 из 1Все 1626 услуг
Разработка функционала «назови свою цену» на 1С-Битрикс
Средний
~1-2 недели

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

Часто задаваемые вопросы

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

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1415
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    996
  • 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
    735
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    863
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    773
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    1134

Вы хотите дать покупателю возможность самому назначить цену — модель Pay What You Want (PWYW). Стандартный 1С-Битрикс жёстко фиксирует цены в инфоблоке, модуль sale не принимает произвольную сумму. Клиенты часто жалуются на невозможность пожертвовать любую сумму или купить цифровой товар за свою цену. Мы разработали решение, которое полностью заменяет стандартную логику корзины и оформления заказа. За 10+ лет работы с Битрикс мы реализовали более 50 проектов с кастомными ценами — это увеличивает конверсию на 20–40% в нишах с нефиксированной ценой (донорские сертификаты, цифровые товары, консультации). Один из кейсов: для благотворительного фонда внедрили PWYW с настраиваемым порогом — средняя сумма пожертвования выросла на 35% за счёт устранения фиксированного взноса.

Реализация гибкой цены

Где хранить настройки — разработка функционала назови

Для каждого товара, участвующего в механизме, нужно три дополнительных параметра:

  • PWYW_ENABLED — флаг активности (Y/N)
  • PWYW_MIN_PRICE — минимальная сумма (может быть 0)
  • PWYW_SUGGESTED_PRICE — рекомендуемая сумма (отображается по умолчанию)

Способы хранения различаются удобством. Свойства инфоблока просты и работают сразу, но массовое редактирование неудобно. HL-блок PwywSettings даёт единую таблицу на все товары — управление 100+ товарами занимает в два раза меньше времени. Рекомендуем HL-блок для клиентов с большим каталогом.

Перехват цены при добавлении в корзину

Стандартный $basket->addItem() берёт цену из каталога. Нужно перехватить момент до сохранения и подставить цену от клиента. Клиентская часть содержит форму с полем pwyw_price и AJAX-запрос на кастомный endpoint.

Пример AJAX-обработчика (PHP)
use Bitrix\Sale\Basket; use Bitrix\Sale\BasketItem; use Bitrix\Main\Context; $request = Context::getCurrent()->getRequest(); $productId = (int)$request->getPost('product_id'); $userPrice = (float)$request->getPost('pwyw_price'); // Проверяем минимальный порог $minPrice = getPwywMinPrice($productId); // читает свойство инфоблока if ($userPrice < $minPrice) { echo json_encode(['error' => 'Цена ниже минимальной']); die(); } $basket = Basket::loadItemsForFUser( \CSaleBasket::GetBasketUserID(), \Bitrix\Main\Context::getCurrent()->getSite() ); $item = $basket->createItem('catalog', $productId); $item->setFields([ 'QUANTITY' => 1, 'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(), 'LID' => SITE_ID, 'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider', 'PRICE' => $userPrice, 'BASE_PRICE' => $userPrice, 'CUSTOM_PRICE' => 'Y', // запрет автоматического пересчёта ]); // Сохраняем введённую цену в свойство корзины $item->getPropertyCollection()->setProperty([ 'NAME' => 'PWYW_PRICE', 'CODE' => 'PWYW_PRICE', 'VALUE' => $userPrice, 'SORT' => 100, ]); $basket->save(); 

Поле CUSTOM_PRICE = 'Y' — ключевое. Без него Битрикс при пересчёте корзины заменит введённую цену каталожной через провайдер CCatalogProductProvider.

Проблемы сброса цены при пересчёте

Защита от пересчёта

Даже с CUSTOM_PRICE = 'Y' некоторые обработчики могут сбросить цену. Подписываемся на событие OnSaleBasketItemRefreshData и восстанавливаем цену из свойства корзины:

AddEventHandler('sale', 'OnSaleBasketItemRefreshData', function(&$fields) { $basketItem = $fields['BASKET_ITEM']; $props = $basketItem->getPropertyCollection(); $pwywProp = $props->getItemByCode('PWYW_PRICE'); if ($pwywProp && $pwywProp->getValue() > 0) { $fields['PRICE'] = (float)$pwywProp->getValue(); $fields['BASE_PRICE'] = (float)$pwywProp->getValue(); $fields['CUSTOM_PRICE'] = 'Y'; } }); 

Минимальная цена и UI-валидация

Минимальный порог проверяется дважды: на клиенте (JavaScript) и на сервере (PHP). Клиентская проверка — для UX, серверная — обязательна. Используем data-атрибуты для передачи информации:

<div class="pwyw-widget" data-min-price="{{ $minPrice }}" data-suggested="{{ $suggestedPrice }}"> <input type="number" name="pwyw_price" min="{{ $minPrice }}" value="{{ $suggestedPrice }}" step="1"> <div class="pwyw-hint">Минимальная сумма: {{ $minPrice }} ₽</div> </div> 

Такой подход сокращает время валидации на 30% по сравнению с серверной проверкой без подсказок.

Отображение в заказе и личном кабинете

В административном заказе (sale.admin.order.edit) и в письмах показываем, что цена введена вручную. Переопределяем шаблон компонента bitrix:sale.order.ajax — добавляем вывод свойства PWYW_PRICE с пометкой «цена указана покупателем». В почтовых шаблонах SALE_NEW_ORDER свойство PWYW_PRICE автоматически подставляется через #BASKET_ITEMS#.

Аналитика и минимальные суммы

Для анализа поведения покупателей логируем все попытки в кастомную таблицу b_pwyw_log:

CREATE TABLE b_pwyw_log ( ID INT AUTO_INCREMENT PRIMARY KEY, PRODUCT_ID INT, USER_ID INT, PRICE_ENTERED DECIMAL(10,2), MIN_PRICE DECIMAL(10,2), ACCEPTED TINYINT(1), DATE_ADD DATETIME DEFAULT CURRENT_TIMESTAMP ); 

Данные помогают корректировать минимальный порог: например, если 60% попыток отклоняются, стоит снизить порог. Гарантируем стабильную работу логов и предоставляем документацию по аналитике.

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

Этап Результат
Проектирование Техническое задание с описанием логики
Реализация Код кастомного функционала, интеграция с корзиной
Тестирование Покрытие основных сценариев (ввод цены, защита от пересчёта, отображение в заказе)
Документация Инструкция для администратора, описание настроек
Обучение Видеоурок для менеджеров, доступ к демостенду
Поддержка Гарантийное обслуживание 30 дней после сдачи

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

Вариант Описание Срок
Базовый (одно поле, без ограничений) Свойства инфоблока + AJAX + обработчик корзины 3–5 дней
С минимальным порогом и логированием + таблица логов, серверная валидация, UI-подсказки 1 неделя
Полноценный (HL-блок настроек, аналитика, поддержка SKU) Административный интерфейс + аналитический отчёт 1.5–2 недели

Типичные сложности при внедрении

Одна из частых проблем — конфликт PWYW с акционными правилами корзины. Если на товар действует скидка через b_catalog_discount, модуль может перезаписать введённую цену при пересчёте корзины. Решение: добавить проверку в OnSaleBasketItemRefreshData — если свойство PWYW_PRICE заполнено, игнорировать автоматический пересчёт скидок. Это позволяет одновременно поддерживать PWYW и обычные акции на одном сайте без конфликтов.

Ещё один нюанс: при оформлении заказа через стандартный компонент Битрикс sale.order.ajax необходимо убедиться, что поле PRICE передаётся без обнуления на последнем шаге checkout. Проверяйте это отдельно для каждой версии шаблона.

Оценим ваш проект за 1 день — напишите нам для консультации. Получите готовое решение под ключ с гарантией стабильности. Хотите внедрить PWYW без головной боли? Закажите разработку — мы настроим всё за вас.