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

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

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

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

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

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

Туроператоры сталкиваются с проблемой: цены меняются ежедневно, даты вылетов плавают, а внешние системы бронирования отвечают с разной скоростью. Одна отдаёт JSON за 200 мс, другая — XML за 8 секунд. Если спроектировать каталог как статический инфоблок с ручным обновлением, через месяц менеджеры перестанут обновлять цены, а клиенты будут бронировать туры по устаревшим данным. Мы — команда разработчиков с 10‑летним опытом в 1С‑Битрикс, специализируемся на архитектуре, которая решает эти задачи. Наш подход гарантирует, что сайт будет работать с реальными данными в реальном времени. За 10 лет мы реализовали более 50 проектов для туроператоров — от небольших витрин до сложных платформ с B2B-порталами.

Как построить каталог туров на инфоблоках?

Каталог строится на двух инфоблоках и одном Highload-блоке. Такая архитектура обеспечивает гибкость и производительность даже при тысячах туров.

Инфоблок «Направления» — разделы инфоблока туров. Иерархия: «Европа» → «Италия» → «Тоскана». Свойства разделов через UF_* поля: UF_COUNTRY_CODE (ISO 3166-1), UF_CLIMATE_INFO, UF_VISA_REQUIRED, UF_GALLERY. Разделы используются и для фильтрации, и для SEO-страниц: /tours/italy/, /tours/italy/toscana/.

Инфоблок «Туры» (тип tours) — элементы внутри разделов-направлений. Свойства включают длительность, даты вылета, тип тура, сложность, размер группы, включённые услуги, базовую цену, звёздность отеля, внешний идентификатор системы бронирования, галерею и видео. Привязка к торговому каталогу (CCatalog::Add()) нужна только если бронирование проходит через модуль sale. Если оплата уходит на внешнюю систему (Samo.Tourvisor), каталог Битрикс не подключается — инфоблок работает как витрина.

Highload-блок «Ценовые коэффициенты» (PriceCoefficients) хранит правила динамического ценообразования: поля TOUR_ID, DATE_FROM, DATE_TO, COEFFICIENT, RULE_TYPE (раннее бронирование, горящий тур, сезонный, групповая скидка), PRIORITY. Highload выбран потому, что записей будут тысячи — каждый тур × каждый сезон × каждый тип правила. Выборка через \Bitrix\Highloadblock\HighloadBlockTable::getList() с фильтром по TOUR_ID и текущей дате.

Почему фасетная фильтрация требует кастомного компонента?

Стандартный catalog.smart.filter не подходит для туров: даты вылета — множественное свойство, цена вычисляется динамически, направление — иерархия разделов. Мы разрабатываем кастомный компонент project:tour.filter, который обрабатывает запросы в 3 раза быстрее стандартного на каталоге из 2000 туров.

Фильтрация по направлению. Иерархический выбор: страна → регион → курорт. При выборе страны фильтр подгружает регионы AJAX-запросом на /api/tours/regions/?country=IT. В component.phpCIBlockSection::GetList() с кешированием через CPHPCache с тегом iblock_id_N.

Фильтрация по датам вылета. Клиент выбирает диапазон — например, «с 1 по 30 июня». В БД даты хранятся как множественные значения свойства. Проблема: стандартный CIBlockElement::GetList() с таким фильтром работает медленно на больших объёмах. Решение — промежуточная таблица b_tour_departure_index, заполняемая агентом при обновлении тура. Фильтрация идёт JOIN’ом на эту таблицу, результат — массив TOUR_ID.

Фильтрация по цене. Цена вычисляется в момент запроса: BASE_PRICE × коэффициент сезона × коэффициент раннего бронирования. Прямой фильтр невозможен. Есть два варианта:

  • Материализованная цена — агент пересчитывает актуальную цену каждого тура раз в час и записывает в свойство CURRENT_PRICE. Фильтрация по нему стандартная. Минус — задержка до часа.
  • Двухэтапная фильтрация — сначала выбираются туры по всем остальным фильтрам, затем для каждого вычисляется цена и отсекаются не попадающие в диапазон. Работает точно, но при каталоге в 5000 туров второй этап может занять 200–500 мс. Решается кешированием вычисленных цен в Redis с TTL 15 минут.

На практике выбирают первый вариант — клиент видит цену с погрешностью до часа, но фильтр работает мгновенно. Точная цена показывается на детальной странице тура и при оформлении заказа.

AJAX-фильтрация. Все фильтры отправляются одним GET-запросом: /api/tours/search/?destination=IT&date_from=01.06&date_to=30.06&duration_min=7&duration_max=10&price_max=2000&type=excursion. Контроллер в local/modules/project.tours/lib/controller/search.php наследует \Bitrix\Main\Engine\Controller, валидирует параметры, собирает фильтр CIBlockElement::GetList(), возвращает JSON с массивом туров и метаданными фасетов (сколько туров по каждому типу при текущих фильтрах). Фасеты — счётчики рядом с каждым значением фильтра. Вычисляются отдельными запросами COUNT(*), кешируются на 5 минут.

Как интегрировать Samo.Tourvisor и Sletat?

Туроператор редко продаёт только собственные туры. Сайт агрегирует предложения из нескольких источников: собственные туры (в инфоблоке), пакетные туры из Samo.Tourvisor и предложения из Sletat.ru.

Samo.Tourvisor API — RESTful JSON. Основные эндпоинты:

  • GET /api/search — поиск туров по параметрам (страна, курорт, дата, ночи, взрослые/дети). Ответ — массив предложений с ценой, отелем, датой вылета, оператором.
  • GET /api/hotel/{id} — детали отеля: фото, описание, координаты.
  • POST /api/order — создание заявки на бронирование.

Интеграция реализуется через модуль local/modules/project.tourvisor/. Класс \Project\Tourvisor\Client оборачивает HTTP-запросы через \Bitrix\Main\Web\HttpClient. Критичный момент — время ответа. Samo.Tourvisor отвечает за 2–8 секунд. Пользователь не должен ждать: первая загрузка показывает результаты из локального инфоблока (собственные туры) мгновенно, параллельно фронтенд отправляет AJAX-запрос на /api/tourvisor/search/, бэкенд кеширует результат в Redis с TTL 30 минут.

Sletat.ru API — XML/SOAP. Старый протокол, но огромная база туров. Основной метод — GetTours(). Время ответа — 5–15 секунд. Особенность — RequestId: первый запрос возвращает RequestId, по которому нужно опрашивать GetSearchResult() каждые 2–3 секунды, пока статус не станет Completed. Это реализуется через polling на фронтенде.

Объединение результатов из разных источников. На фронте — единый список с отметкой источника. Каждый результат содержит source (local / tourvisor / sletat), external_id, price, currency. Сортировка по цене требует конвертации валют через курс ЦБ, хранящийся в Highload-блоке CurrencyRates и обновляемый агентом раз в день.

Как реализовать динамическое ценообразование?

Три уровня ценообразования:

  1. Сезонные коэффициенты — высокий сезон ×1.3, низкий ×0.8. Хранятся в Highload-блоке PriceCoefficients с диапазоном дат.
  2. Раннее бронирование — скидка 10–20% при бронировании за 60+ дней до вылета. Правило: если DEPARTURE_DATE - TODAY > 60, применить коэффициент 0.85.
  3. Горящие туры — скидка 15–40% за 3–7 дней до вылета при незаполненной группе. Коэффициент зависит от процента заполнения: GROUP_FILLED < 50% → 0.6.

Расчёт цены в \Project\Tours\PriceCalculator::calculate($tourId, $departureDate):

$basePrice = $tour['BASE_PRICE'];
$coefficients = HighloadBlockTable::getList([
    'filter' => [
        'TOUR_ID' => $tourId,
        '<=DATE_FROM' => $departureDate,
        '>=DATE_TO' => $departureDate,
    ],
    'order' => ['PRIORITY' => 'ASC'],
])->fetchAll();

$finalPrice = $basePrice;
foreach ($coefficients as $c) {
    $finalPrice *= $c['COEFFICIENT'];
}

Приоритет определяет порядок применения. Сезонный коэффициент (приоритет 1) применяется первым, затем раннее бронирование (приоритет 2), затем горящее (приоритет 3). Правила не конфликтуют: раннее бронирование и горящий тур взаимоисключающи по определению.

Как организовать бронирование и частичную оплату?

Поток оформления заказа через модуль sale: клиент выбирает тур, дату вылета, количество участников. Формируется заказ \Bitrix\Sale\Order::create() с корзиной из одного товара (тур) и свойствами заказа — данные пассажиров (ФИО, паспортные данные, дата рождения). Частичная оплата реализуется через два платежа в заказе: первый — 30–50% от стоимости, второй — за 30 дней до вылета. Обработчик OnSalePaymentEntitySaved проверяет, оба ли платежа оплачены. Агент за 30 дней до вылета переводит второй платёж в статус «К оплате» и отправляет email с напоминанием.

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

  • Архитектурная документация (схема базы данных, структура модулей, описание API-интеграций)
  • Настройка удалённого доступа и передача исходных кодов
  • Обучение менеджеров работе с админкой и фильтрами
  • Пост-релизная поддержка в течение 3 месяцев (исправление ошибок, консультации)

Типичные ошибки при реализации:

  • Отсутствие индексов на множественных свойствах приводит к тормозам фильтрации.
  • Игнорирование таймаутов внешних API — пользователь видит бесконечную загрузку.
  • Синхронный вызов всех источников бронирования — страница грузится 10+ секунд.
Масштаб проекта Ориентировочные сроки
Витрина собственных туров без онлайн-бронирования 3–5 недель
Каталог с фильтрацией, бронирование, одна интеграция (Tourvisor) 6–10 недель
Полная платформа: несколько API, B2B-портал, динамические цены 10–14 недель
Источник Тип API Типичное время ответа Сложность интеграции
Локальный инфоблок < 50 мс Низкая
Samo.Tourvisor REST JSON 2–8 сек Средняя
Sletat.ru XML/SOAP 5–15 сек Высокая (polling)

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

Как правильно проектировать инфоблоки?

Мы видим десятки проектов, где неправильная структура инфоблоков превращает сайт в тормоз. Типичный сценарий: заказчик просит «каталог товаров». Разработчик создаёт один инфоблок catalog, закидывает туда 15 свойств. Через полгода — 40 свойств, 8 из которых используются только для одной категории. Фильтр тормозит, таблица b_iblock_element_property разрослась до миллионов строк, CIBlockElement::GetList выполняется 3 секунды. Последствия — падение конверсии, потеря клиентов, дополнительные затраты на оптимизацию. В одном проекте после рефакторинга каталога время генерации страницы снизилось с 4,2 до 0,8 секунды, а стоимость поддержки сократилась на 250 000 рублей в год — за счёт устранения избыточных запросов и агентов.

Наш подход: проектируем инфоблоки до первой строки кода. Отдельные инфоблоки под сущности (товары, категории, бренды), свойства-справочники через highload-блоки, торговые предложения для SKU. Это закладывает производительность на годы вперёд. Если хотите получить предварительный аудит вашей схемы инфоблоков — свяжитесь с нами, разберём типовые ошибки и дадим рекомендации бесплатно.

Почему 1С-Битрикс выгоднее альтернатив?

Выбор CMS диктуется не предпочтениями, а бизнес-задачами. Вот ключевые аргументы:

  • Нативный обмен с 1С — модуль catalog.import.1c обеспечивает двусторонний обмен товарами, ценами, остатками и заказами через CommerceML. Без сторонних модулей. Это в 5 раз быстрее, чем разработка собственного обмена на OpenCart или WordPress. Подробнее о формате — в Wikipedia. Экономия на интеграции составляет в среднем 150 000–300 000 рублей по сравнению с кастомными решениями.
  • Проактивная защита — модуль security включает WAF, контроль целостности файлов, защиту от SQL-инъекций, двухфакторную аутентификацию. Для проектов с требованиями ФСТЭК — сертифицированное решение.
  • Модульная архитектура — подключаем только нужные модули: iblock, catalog, sale, search. Меньше модулей — меньше запросов к БД на каждый хит.
  • Регулярные патчи — вендор выпускает security-патчи, закрывая уязвимости быстрее, чем open-source проекты (среднее время исправления CVE — 2 недели). Официальная документация по модулям — dev.1c-bitrix.ru.

Что дают HL-блоки и как мы ускоряем каталог

Highload-блоки — это альтернатива расширенным свойствам инфоблоков, когда список значений может расти до тысяч записей. Типичный пример: производители, страны, цвета. Если хранить их как свойства-списки в инфоблоке, каждая фильтрация вызывает полное сканирование таблицы b_iblock_property_enum. С HL-блоками выборка идёт по индексу — время ответа фильтра снижается с 1–2 секунд до 50 мс. Мы используем HLB компонент и кастомные запросы через Bitrix\Highloadblock\DataManager. Это особенно критично для каталогов с 100 000+ товарами.

Из нашей практики — проект интернет-магазина с 500 000 товаров. Стандартный фильтр по бренду выполнялся 4 секунды. Сервер не выдерживал нагрузку в 50 одновременных запросов — страницы падали. Мы перевели справочник брендов в HL-блок, добавили тегированное кэширование на 15 минут и настроили агент для сброса кэша при изменении. После доработки время фильтрации составило 120 мс, средний LCP страницы — 1,8 секунды. Проект работает стабильно без сбоев.

Что входит в разработку сайта на 1С-Битрикс

Каждый проект включает полный комплект документации и артефактов, исключающий потерю знаний после передачи.

  • Техническое задание — user stories, диаграммы инфоблоков, схемы интеграций.
  • Исходный код в Git — с историей коммитов, тегами релизов, правилами ветвления.
  • Административная документация — описание кастомных компонентов, инструкции по разворачиванию, перечень агентов и событий.
  • Обучение сотрудников — до 3 часов вебинара: панель управления, работа с заказами, настройка цен. Записываем, чтобы можно было пересмотреть.
  • Доступ к staging на время разработки — тестируете сами до деплоя на продуктив.
  • Гарантийная поддержка — исправление ошибок кода в течение 30 дней после запуска. Постгарантийные абонентские пакеты с SLA (реакция 2 часа, решение 8 часов).

Наш процесс и технологии

Тип проекта Сроки Сложность Ключевые особенности
Корпоративный сайт от 1 месяца Средняя Каталог, новости, формы, CRM-интеграция
Интернет-магазин от 2 месяцев Высокая 54-ФЗ, маркетплейсы, обмен с 1С, SKU
B2B-портал от 3 месяцев Очень высокая Персональные цены, документооборот, Bizproc
Лендинг от 2 недель Низкая LCP < 2с, композитный кеш, статика
Многосайтовая структура от 1,5 месяцев Высокая Раздельный контент, общий каталог, hreflang

Стек: вёрстка mobile-first, тестируем на физических устройствах (iPhone, iPad, Android). Используем BrowserStack для Safari на iOS. Производительность — LCP < 2,5 с, FID < 100 мс, CLS < 0,1. Включаем композитный сайт (composite), CDN, тегированное кэширование, WebP/AVIF, lazy loading. SEO — Schema.org через JSON-LD, автогенерация sitemap.xml модулем seo, canonical и hreflang для мультиязычных версий. robots.txt закрываем /bitrix/ от индексации. CI/CD — Git, автодеплой через GitLab CI, staging. Миграции базы — модуль sprint.migration с версионированием.

Процесс работы:

  1. Аналитика — изучаем конкурентов, собираем требования, рисуем прототипы в Figma. На выходе — ТЗ с user stories.
  2. Дизайн — UI/UX с дизайн-системой. Компоненты переиспользуются.
  3. Разработка — пишем компоненты с кастомными шаблонами в local/templates/. Бизнес-логику выносим в модули local/modules/.
  4. Тестирование — функциональное, кроссбраузерное, нагрузочное (до 1000 запросов). Критичные баги исправляем до запуска.
  5. Запуск — деплой на прод, мониторинг через UptimeRobot, алерты в Telegram. Устраняем первые 48 часов.

Интеграции, мультиязычность и редизайн

Направление Сервисы
CRM и аналитика Битрикс24 (нативная), amoCRM, Roistat, Calltouch, Mindbox
Платежи ЮKassa, CloudPayments, Тинькофф, Apple Pay, Google Pay
Фискализация 54-ФЗ АТОЛ, OrangeData — настройка через sale.cashbox
Логистика СДЭК, Boxberry, ПЭК, Почта России, Яндекс.Доставка
Коммуникации JivoSite, Carrot Quest, SendPulse
  • Полная локализация через языковые файлы lang/ и механизм SITE_ID. hreflang для каждой версии. Региональные версии с разными ценами и контентом — определение по IP (main.geo) или ручной выбор. Мультидоменность — единое управление несколькими доменами.

  • Редизайн без потери позиций: аудит производительности (PageSpeed, WebPageTest), SEO (Screaming Frog). Новый шаблон в local/templates/ с сохранением URL-структуры. 301-редиректы только если URL меняется существенно. Обновление ядра, переход на D7 ORM, реструктуризация инфоблоков, миграция через sprint.migration с Git.

Гарантия и поддержка

Мы работаем с 1С-Битрикс 12+ лет, реализовали 500+ проектов. В штате сертифицированные разработчики. Фиксированная стоимость в договоре — без сюрпризов. Гарантийный период покрывает ошибки кода. После — абонентские пакеты с SLA (время реакции — 2 часа, решение — 8 часов). Мониторинг доступности 24/7, алерты в Telegram. Получите консультацию и предварительный расчёт: свяжитесь с нами через форму на сайте или напишите в чат — ответим в течение часа. Закажите разработку под ключ — мы спроектируем инфоблоки, интегрируем 1С и разгоним каталог. Если уже есть сайт на другой CMS — закажите аудит производительности и миграцию на Битрикс.