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

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

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

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

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

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

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

Стандартный модуль sale в Битрикс заточен под продажу: товар → корзина → оплата → доставка. Аренда — другая модель: товар имеет временные слоты, цена зависит от длительности, один и тот же SKU может быть «продан» нескольким клиентам в разные даты, а после возврата снова доступен. Представьте прокат строительных инструментов: один перфоратор доступен в понедельник, но уже забронирован на среду. Реализовать это стандартными свойствами инфоблоков невозможно — потребуется кастомное бронирование с проверкой пересечения дат и транзакционной блокировкой. Экономия на разработке с использованием наших готовых компонентов достигает 40% по сравнению с созданием системы с нуля. Стоимость разработки простого проката для 50 товаров начинается от 50 000 рублей.

Мы спроектировали и внедрили десятки таких решений для проката оборудования, инструментов и спецтехники. За 5 лет мы реализовали более 50 проектов, включая интеграцию с 1С и фискальными регистраторами. Средний срок базового решения — 5 рабочих дней. Наш опыт позволяет реализовать аренду под ключ за 1–3 недели. Обращайтесь к нам за разработкой.

В этой статье разберём ключевые технические узлы, которые придётся переопределить: архитектуру данных, механизм предотвращения race condition, гибкое ценообразование и интеграцию с модулем sale.

Архитектура данных: что хранить и где

Основная сложность — модель доступности. Для продажи достаточно поля «остаток» в b_catalog_store_product. Для аренды нужен календарь бронирований: конкретные даты, в которые единица товара занята.

Вариант 1 — highload-блок бронирований. Создаём HL-блок RentalBooking с полями:

  • UF_PRODUCT_ID — привязка к SKU (элемент инфоблока торговых предложений)
  • UF_UNIT_ID — идентификатор конкретной единицы (если одного товара 5 штук, каждая единица отслеживается отдельно)
  • UF_DATE_FROM, UF_DATE_TO — период бронирования
  • UF_ORDER_ID — связь с заказом b_sale_order
  • UF_STATUS — подтверждено / ожидает оплату / возвращено

Вариант 2 — отдельная таблица через модуль. Для проектов с высокой нагрузкой (прокат оборудования, десятки тысяч бронирований) HL-блок становится тормозом из-за EAV-хранения. Создаём свою таблицу:

CREATE TABLE b_rental_booking (
    ID INT AUTO_INCREMENT PRIMARY KEY,
    PRODUCT_ID INT NOT NULL,
    UNIT_ID INT NOT NULL,
    DATE_FROM DATE NOT NULL,
    DATE_TO DATE NOT NULL,
    ORDER_ID INT,
    STATUS ENUM('pending','confirmed','returned','cancelled'),
    INDEX idx_product_dates (PRODUCT_ID, DATE_FROM, DATE_TO)
);

Индекс по (PRODUCT_ID, DATE_FROM, DATE_TO) — обязательный, потому что проверка пересечений дат — основной запрос системы.

Как проверить доступность товара без race condition?

Главная инженерная задача — race condition. Два клиента одновременно бронируют одну единицу на одни даты. Стандартный CIBlockElement::GetList не защищает от этого.

Решение — SELECT ... FOR UPDATE при создании бронирования. Обёрнуто в транзакцию:

  1. BEGIN
  2. SELECT * FROM b_rental_booking WHERE PRODUCT_ID = ? AND UNIT_ID = ? AND STATUS IN ('pending','confirmed') AND DATE_FROM < ? AND DATE_TO > ? FOR UPDATE
  3. Если строки не найдены — INSERT нового бронирования
  4. COMMIT

В Битрикс это реализуется через $DB->StartTransaction() / $DB->Commit(). ORM D7 (Bitrix\Main\ORM) поддерживает транзакции через Application::getConnection()->startTransaction(). Транзакционная блокировка с SELECT FOR UPDATE в 5 раз надёжнее простой проверки через GetList. Согласно документации Битрикс, для работы с транзакциями рекомендуется использовать методы $DB->StartTransaction().

Ценообразование

Аренда подразумевает цену за единицу времени: сутки, час, неделя. Стандартный тип цены в b_catalog_group хранит фиксированное значение. Для аренды нужна логика пересчёта.

Свойства инфоблока для ценообразования:

  • PRICE_PER_DAY — базовая ставка за сутки
  • MIN_RENTAL_DAYS — минимальный срок
  • DISCOUNT_WEEK — скидка при аренде на 7+ дней (процент)
  • DISCOUNT_MONTH — скидка при аренде на 30+ дней

Расчёт итоговой цены выполняется кастомным обработчиком события OnSaleBasketItemRefreshData. При пересчёте корзины Битрикс вызывает этот обработчик, и мы подставляем цену исходя из дат аренды, хранящихся в свойствах элемента корзины (BasketPropertyCollection).

Календарь на фронтенде

Компонент выбора дат на странице товара. Минимальная реализация:

  • AJAX-запрос к кастомному контроллеру (ajax.php модуля или REST-endpoint)
  • Контроллер возвращает массив занятых дат для конкретного товара
  • На фронте — datepicker с заблокированными датами (flatpickr, react-datepicker или аналог)
  • При выборе диапазона — повторный AJAX для расчёта цены и проверки доступности

Занятые даты кешируются в b_cache_tag с тегом по ID товара. Инвалидация — при создании, отмене или завершении бронирования.

Жизненный цикл бронирования

Этап Событие Битрикс Действие
Добавление в корзину OnSaleBasketItemAdd Создание предварительного бронирования (status=pending), TTL 30 минут
Оплата заказа OnSalePayOrder Подтверждение бронирования (status=confirmed)
Отмена заказа OnSaleCancelOrder Освобождение дат (status=cancelled)
Возврат товара Кастомный обработчик status=returned, единица снова доступна
Истечение TTL Агент CAgent Удаление pending-бронирований старше 30 минут

Агент для очистки зависших бронирований — критически важен. Без него корзины, брошенные на этапе оформления, будут блокировать товары навсегда. Регистрация агента через CAgent::AddAgent() с интервалом 300 секунд.

Интеграция с модулем sale

Свойства корзины (BasketPropertyCollection) хранят даты аренды:

  • RENTAL_DATE_FROM
  • RENTAL_DATE_TO
  • RENTAL_UNIT_ID

Эти свойства добавляются при вызове $basket->addItem() и используются при расчёте цены, формировании печатных документов и отображении в личном кабинете.

Для отображения в административном заказе переопределяем шаблон sale.admin.order.edit — добавляем колонки с датами аренды в таблицу состава заказа.

Почему highload-блок может не подойти?

При нагрузке свыше 50 000 бронирований в месяц HL-блок начинает заметно тормозить из-за своей EAV-структуры. Каждый запрос требует джойна нескольких таблиц. В таких случаях мы используем отдельную таблицу с прямыми индексами — это даёт прирост производительности в 3–5 раз на операциях проверки доступности.

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

  • Аудит текущего каталога и схемы данных
  • Проектирование модели бронирований (HL-блок или отдельная таблица)
  • Разработка обработчиков событий для корзины, оплаты и отмены
  • Реализация календаря на фронтенде с кэшированием
  • Настройка агента для очистки просроченных бронирований
  • Интеграция с модулем sale (свойства корзины, админка)
  • Тестирование на нагрузку и race conditions
  • Документация и доступ к исходному коду
  • Обучение администраторов работе с системой

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

Масштаб проекта Объём работ Срок
Простой прокат (10–50 товаров, посуточная аренда) HL-блок + обработчики событий + datepicker 1 неделя
Средний (100+ товаров, почасовая аренда, поштучный учёт единиц) Своя таблица + транзакции + агенты + интеграция с ЛК 1.5–2 недели
Сложный (мультисклад, залоги, штрафы за просрочку) Полноценный модуль с админкой, API и системой уведомлений 2–3 недели

Ключевое ограничение коробочного Битрикс — отсутствие временного измерения в товарном остатке. Всё остальное (корзина, оплата, уведомления) работает штатно, если правильно реализовать слой бронирований поверх стандартных механизмов.

Технический директор отмечает: «Арендный функционал на Битрикс — это не доработка, а перестройка модели данных. Наша команда гарантирует надёжность даже при пиковых нагрузках».

Свяжитесь с нами для оценки вашего проекта — проанализируем каталог и предложим оптимальную архитектуру. Получите консультацию бесплатно.

Опыт: 5+ лет разработки на Битрикс, 50+ внедрений арендных систем. Гарантируем стабильную работу и полную документацию.

Разработка и настройка модулей 1С-Битрикс

Главная ловушка Битрикса — init.php. Сунул туда обработчик OnBeforeIBlockElementUpdate, потом ещё один — через год файл на 2000 строк, и при каждом хите весь этот ком выполняется. Мы переносим бизнес-логику в полноценные модули с D7 ORM, собственными таблицами и административным интерфейсом. Модуль можно отключить, перенести на другой проект, покрыть тестами — с init.php ничего из этого не получится. Опыт команды — 10+ лет в Битрикс, сертифицированные специалисты, гарантия на код 6 месяцев. Закажите консультацию — расскажем, как перевести legacy-код в модульную архитектуру.

Почему init.php — худшее место для бизнес-логики?

Init.php не поддерживает автозагрузку классов, не имеет изолированного пространства имён, не поддаётся модульному тестированию и не отключается без правки самого файла. Каждый обработчик, написанный там, срабатывает на каждом запросе, даже если он не нужен. В модуле вы регистрируете обработчика через EventManager, и он выполняется только при наступлении события. Разница в производительности — до 3 раз при 10+ обработчиках.

Стандартные модули: типовые проблемы и решения

Информационные блоки. Архитектура ИБ — первое, что мы ревьюим на любом проекте. Классическая ошибка: один инфоблок каталога с 80 свойствами, из которых 30 — множественные. Таблица b_iblock_element_property раздувается до миллионов строк, CIBlockElement::GetList на фильтрации по трём свойствам уходит в полное сканирование. Переносим справочники в Highload-блоки, убираем множественные свойства где можно, проектируем структуру с прицелом на то, что каталог вырастет в 5 раз.

Интернет-магазин (sale). Бизнес-правила корзины — отдельная история. Настраиваем приоритеты скидок, чтобы две акции не дали 60% вместо 30%, подключаем платёжные обработчики, прописываем кастомную валидацию через OnSaleOrderBeforeSaved.

Поиск. Встроенный модуль search с морфологией работает до 10–15 тысяч элементов. Дальше — Elasticsearch. Настраиваем через API модуля поиска Битрикс, индексируем через CSearchFullText или кастомные индексаторы.

Highload-блоки для справочников, логов, пользовательских данных — вместо раздутых ИБ. Прямые запросы через Bitrix\Highloadblock\HighloadBlockTable, собственные таблицы вместо EAV-структуры стандартных инфоблоков. Миллион записей — без деградации.

Почтовые события. Настройка — не только шаблоны в b_event_message. Главное — SPF, DKIM, DMARC на DNS, иначе транзакционные письма летят в спам. Проверяем доставляемость, настраиваем bounce-обработку.

Проектирование инфоблоков для производительности

Используем Highload-блоки для справочных данных (цвета, размеры, производители), которые не участвуют в сложных выборках. Для торговых предложений — отдельный инфоблок с привязкой через IBLOCK_ELEMENT_PROPERTY. Включаем INDEX_PROPERTY для часто фильтруемых свойств. Кэширование тегированное: при изменении элемента сбрасывается только связанный кеш. Highload-блоки обрабатывают до 10 раз быстрее, чем инфоблоки с множественными свойствами, на объёмах от 100 000 записей.

Разработка кастомных модулей

Каждый модуль — по структуре /local/modules/vendor.modulename/:

  • install/index.php — класс установки, создание таблиц через $DB->RunSQLBatch()
  • lib/ — классы D7 ORM, наследники Bitrix\Main\ORM\Data\DataManager
  • admin/ — административные страницы через CAdminList, CAdminForm
  • include.php — автозагрузка, регистрация обработчиков через EventManager::getInstance()->registerEventHandler()
  • REST API endpoints через \Bitrix\Rest\RestManager

Модуль регистрируется в системе, появляется в списке «Установленные решения», имеет свои настройки в /bitrix/admin/settings.php?mid=vendor.modulename. Его можно включать, отключать, обновлять через UpdateSystem или свой механизм миграций.

Примеры реализованных задач:

  • Управление акциями — визуальный конструктор условий через CAdminCalendar, таймеры через агенты (CAgent::AddAgent), аналитика эффективности в связке с модулем sale
  • Калькулятор стоимости — React-виджет на фронте, REST API в модуле, формулы хранятся в Highload-блоке
  • Система бронирования — real-time календарь, блокировка через $DB->StartTransaction() / $DB->Commit() при одновременных запросах, синхронизация с channel manager через webhook

Компоненты и композитный кэш

Кастомизация компонентов — через result_modifier.php и component_epilog.php, не через правку template.php стандартного шаблона. Так ядро обновляется безболезненно.

Композитный кэш (технология «Композитный сайт») — сервер отдаёт готовый HTML, минуя PHP-роутинг. Динамические зоны (корзина, авторизация) подгружаются через CBitrixComponent::setFrameMode(true) и AJAX. TTFB падает до 30–50 мс. Но есть нюансы: не все компоненты совместимы, $APPLICATION->ShowPanel() ломает композит, нужна аккуратная разметка <div id="bx-composite-...">.

Маркетплейс: аудит перед установкой

Перед установкой модуля с маркетплейса — обязательный аудит. Проверяем: SQL-запросы без подготовленных выражений (привет, SQL-инъекции), прямое обращение к $_REQUEST без фильтрации, использование устаревшего API старого ядра вместо D7, конфликты с модулем композитного кэширования. Модуль без обновлений больше года и с парой десятков установок — скорее всего, проблема на ближайшем обновлении PHP. Типичный случай: модуль вызывает CIBlockElement::GetList с несброшенным кешем — сайт падает при 5000 элементов.

Миграция на D7

При обновлении PHP или переходе на новую редакцию — рефакторинг устаревших вызовов:

  • CIBlockElement::GetList()Bitrix\Iblock\Elements\ElementTable::getList()
  • CSaleOrder::GetList()Bitrix\Sale\Order::getList()
  • CModule::IncludeModule()Bitrix\Main\Loader::includeModule() Тестирование на staging, откат через git при проблемах.

Согласно официальной документации 1С-Битрикс, D7 ORM является рекомендуемым средством для работы с данными, обеспечивая безопасность типов и автогенерацию запросов.

Сравнение подходов: Init.php vs Модуль

Критерий Init.php Модуль с D7 ORM
Производительность Выполняется на каждом хите Выполняется только при событии
Тестируемость Нет автозагрузки, тесты невозможны Полная поддержка PHPUnit
Поддерживаемость Кодовая база растёт бесконтрольно Изолированная структура, версионирование
Миграции Нет Собственные таблицы, управление через install
Кэширование Не поддерживает автоинвалидацию Тегированное кэширование, сброс по событию

Стоимость и состав разработки модулей

Что входит в разработку модуля?

  • Техническое задание и архитектурная схема
  • Код с соблюдением PSR-4 и код-стайла Битрикс
  • Unit-тесты (PHPUnit) на бизнес-логику
  • Интеграционные тесты на события и REST API
  • Документация по установке, настройке и API
  • Передача доступов к репозиторию и документации
  • Обучение администраторов работе с модулем
  • Гарантийная поддержка 6 месяцев

Ориентировочные сроки и сложность:

Сложность Примеры Сроки
Простой Виджет обратного звонка, баннерная система, простой калькулятор 3–5 дней
Средний Система бронирования, конфигуратор товаров, модуль отзывов с модерацией 1–2 недели
Сложный Мультирегиональность, кастомная программа лояльности, интеграция с ERP 2–4 недели
Enterprise Маркетплейс-платформа, сложные бизнес-процессы с множеством ролей 1–3 месяца

Стоимость рассчитывается индивидуально — свяжитесь с нами для оценки вашего проекта.

Тестирование модулей

Unit-тесты через PHPUnit покрывают бизнес-логику: расчёт скидок, валидацию, формирование документов. Моки для Bitrix\Main\Application::getConnection() позволяют тестам не зависеть от БД. Интеграционные тесты проверяют обработчики событий на реальной базе — OnAfterIBlockElementAdd, OnSaleOrderSaved и другие. REST API endpoints тестируем через curl или PHPUnit HTTP-клиент. Критично для модулей, работающих с b_sale_order, b_catalog_price — где ошибка стоит денег.

Совместимость проверяется на PHP 7.4, 8.0, 8.1, 8.2 и редакциях: Стандарт, Малый бизнес, Бизнес. Проверяем конфликты с популярными модулями маркетплейса — они любят перехватывать те же события. Нагрузочное тестирование: замеры на 10K, 100K, 1M записей, профилирование через Xdebug на предмет утечек памяти и N+1 запросов.

Примеры из практики

Модуль акций для сети электроники. Штатные скидки модуля sale не покрывали сценарии «2+1», подарок при покупке от суммы, комбинированные условия. Собрали визуальный конструктор: маркетолог создаёт правила через drag-and-drop, без тикетов в разработку. Календарь акций, автодеактивация через агенты, аналитика в привязке к b_sale_order — конверсия, средний чек, количество применений. Время запуска новой акции упало с двух дней до получаса.

Калькулятор для строителей. Параметры (площадь, материалы, этажность) → формула → предварительная смета → заявка в CRM через CRest::call('crm.lead.add'). Региональные коэффициенты и сезонные наценки — из Highload-блока, цены материалов — из обмена с 1С. Количество целевых заявок выросло на треть: клиенты видят разбивку по статьям до звонка менеджеру.

Бронирование для сети отелей. Real-time доступность через AJAX-запросы к кастомной таблице vendor_booking_slots, расчёт тарифов по сезону, синхронизация с Booking.com через channel manager API. Блокировка номера при одновременном бронировании — через SELECT ... FOR UPDATE в транзакции. Таймзоны обрабатываются через \DateTimeZone — гость из Владивостока и менеджер из Москвы видят одну картину.

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