Developing a Tour Operator Website on 1C-Bitrix

Our company is engaged in the development, support and maintenance of Bitrix and Bitrix24 solutions of any complexity. From simple one-page sites to complex online stores, CRM systems with 1C and telephony integration. The experience of developers is confirmed by certificates from the vendor.
Showing 1 of 1All 1626 services
Developing a Tour Operator Website on 1C-Bitrix
Complex
from 1 week to 3 months
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1356
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    943
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Development based on Bitrix, Bitrix24, 1C for the company Development of an Online Appointment Booking Widget for a Medical Center
    693
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    828
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    731
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    1073

Tour operators face a problem: prices change daily, departure dates fluctuate, and external booking systems respond at different speeds. One returns JSON in 200 ms, another returns XML in 8 seconds. If the catalog is designed as a static information block with manual updates, within a month managers stop updating prices, and customers book tours with outdated data. We are a development team with 10 years of experience in 1C-Bitrix, specializing in certified Bitrix development and proven architecture that solves these problems. Our approach guarantees the site works with real data in real time. Over 10 years, we have implemented more than 50 projects for tour operators—from small showcases to complex platforms with B2B agent portals. Basic project costs start from $5,000 for a simple showcase, saving clients up to 40% on operational costs through automation. For a typical catalog with one API integration, clients save an average of $15,000 per year on manual updates.

How to Build a Tour Catalog on Information Blocks

The catalog is built on two information blocks and one Highload-block. This architecture provides flexibility and performance even with thousands of tours.

Information block "Destinations" — sections of the tour information block. Hierarchy: "Europe" → "Italy" → "Tuscany". Section properties via UF_* fields: UF_COUNTRY_CODE (ISO 3166-1), UF_CLIMATE_INFO, UF_VISA_REQUIRED, UF_GALLERY. Sections are used both for filtering and for SEO optimization with Schema.org markup for structured data.

Information block "Tours" (type tours) — elements inside destination sections. Properties include duration, departure dates, tour type, complexity, group size, included services, base price, hotel stars, external booking system identifier, gallery, and video. Linking to the trade catalog (CCatalog::Add()) is only needed if booking goes through the sale module. If payment goes to an external system (Samo.Tourvisor), Bitrix catalog is not connected—the information block works as a showcase.

Highload-block "Price Coefficients" (PriceCoefficients) stores dynamic pricing rules: fields TOUR_ID, DATE_FROM, DATE_TO, COEFFICIENT, RULE_TYPE (early booking, hot deal, seasonal, group discount), PRIORITY. Highload is chosen because there will be thousands of records—each tour × each season × each rule type. Query via \Bitrix\Highloadblock\HighloadBlockTable::getList() with filter by TOUR_ID and current date.

The Need for a Custom Facet Filter Component

The standard catalog.smart.filter is not suitable for tours: departure dates are a multiple property, price is calculated dynamically, destination is a section hierarchy. We develop a custom component project:tour.filter that processes requests 3 times faster than the standard one on a catalog of 2000 tours.

Filtering by destination. Hierarchical selection: country → region → resort. When a country is selected, the filter loads regions via an AJAX request to /api/tours/regions/?country=IT. In component.php — CIBlockSection::GetList() with caching via CPHPCache with tag iblock_id_N.

Filtering by departure dates. The client selects a range—for example, "from June 1 to June 30". In the database, dates are stored as multiple property values. Problem: standard CIBlockElement::GetList() with such a filter works slowly on large volumes. Solution—intermediate table b_tour_departure_index, populated by an agent when the tour is updated. Filtering uses a JOIN on this table, result is an array of TOUR_ID.

Filtering by price. Price is calculated at request time: BASE_PRICE × season coefficient × early booking coefficient. Direct filtering is impossible. Two options exist:

  • Materialized price — an agent recalculates the current price of each tour once an hour and writes it to the CURRENT_PRICE property. Filtering by it is standard. Downside: up to an hour delay.
  • Two-stage filtering — first select tours by all other filters, then for each calculate the price and cut off those not within the range. Works accurately, but with a catalog of 5000 tours, the second stage can take 200–500 ms. This is solved by caching calculated prices in Redis with a TTL of 15 minutes.

In practice, we choose the first option—the client sees a price with a margin of error up to an hour, but filtering works instantly. The exact price is shown on the tour detail page and during checkout.

AJAX filtering. All filters are sent as one GET request: /api/tours/search/?destination=IT&date_from=01.06&date_to=30.06&duration_min=7&duration_max=10&price_max=2000&type=excursion. The controller in local/modules/project.tours/lib/controller/search.php inherits \Bitrix\Main\Engine\Controller, validates parameters, builds the filter for CIBlockElement::GetList(), returns JSON with an array of tours and facet metadata (how many tours for each type under current filters). Facets—counters next to each filter value—are calculated with separate COUNT(*) queries, cached for 5 minutes.

How Do We Handle Dynamic Pricing?

Three pricing levels:

  1. Seasonal coefficients — high season ×1.3, low season ×0.8. Stored in Highload-block PriceCoefficients with date ranges.
  2. Early booking — discount 10–20% when booking 60+ days before departure. Rule: if DEPARTURE_DATE - TODAY > 60, apply coefficient 0.85.
  3. Hot deals — discount 15–40% for 3–7 days before departure when group is unfilled. Coefficient depends on fill percentage: GROUP_FILLED < 50% → 0.6.

Price calculation in \Project\Tours\PriceCalculator::calculate($tourId, $departureDate):

Click to see the price calculation algorithm

$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']; }

Priority determines the application order. Seasonal coefficient (priority 1) is applied first, then early booking (priority 2), then hot deal (priority 3). Rules do not conflict: early booking and hot deal are mutually exclusive by design.

Integrating Samo.Tourvisor and Sletat

A tour operator rarely sells only their own tours. The site aggregates offers from multiple sources: own tours (in information block), package tours from Samo.Tourvisor, and offers from Sletat.ru.

Samo.Tourvisor API — RESTful JSON. Main endpoints:

  • GET /api/search — search tours by parameters (country, resort, date, nights, adults/children). Response: an array of offers with price, hotel, departure date, operator.
  • GET /api/hotel/{id} — hotel details: photos, description, coordinates.
  • POST /api/order — create a booking request.

Integration is implemented via a module local/modules/project.tourvisor/. Class \Project\Tourvisor\Client wraps HTTP requests via \Bitrix\Main\Web\HttpClient. Critical point — response time. Samo.Tourvisor responds in 2–8 seconds. The user should not wait: first load shows results from the local information block (own tours) instantly; in parallel, the frontend sends an AJAX request to /api/tourvisor/search/, the backend caches the result in Redis with a TTL of 30 minutes.

Sletat.ru API — XML/SOAP. Old protocol, but huge tour database. Main method — GetTours(). Response time — 5–15 seconds. Feature — RequestId: first request returns RequestId, which must be polled via GetSearchResult() every 2–3 seconds until status becomes Completed. This polling mechanism is implemented on the frontend.

Merging results from different sources. On the frontend — a single list with source mark. Each result contains source (local / tourvisor / sletat), external_id, price, currency. Sorting by price requires currency conversion using the Central Bank rate, stored in a Highload-block CurrencyRates and updated by an agent once a day.

Steps to Set Up Facet Filtering

Here is a step-by-step guide to implementing facet filtering:

  1. Define destination hierarchy in the information block sections.
  2. Create the intermediate table b_tour_departure_index and populate it via an agent.
  3. Build the custom component project:tour.filter with AJAX endpoints.
  4. Implement materialized price updates using an agent.
  5. Cache facet counts with a short TTL (5 minutes).
  6. Test with a catalog of 2000 tours to ensure performance.

What Is Included in the Work (Deliverables)

  • Architectural documentation (database schema, module structure, API integration descriptions)
  • Remote access setup and source code transfer
  • Training managers to work with the admin panel and filters
  • Post-release support for 3 months (bug fixes, consultations)

Common mistakes during implementation:

  • Lack of indexes on multiple properties leads to slow filtering.
  • Ignoring external API timeouts — user sees infinite loading.
  • Synchronous call to all booking sources — page loads 10+ seconds.
Project Scale Estimated Timeline
Showcase of own tours without online booking 3–5 weeks
Catalog with filtering, booking, one integration (Tourvisor) 6–10 weeks
Full platform: multiple APIs, B2B portal, dynamic pricing 10–14 weeks
Source API Type Typical Response Time Integration Complexity
Local information block < 50 ms Low
Samo.Tourvisor REST JSON 2–8 sec Medium
Sletat.ru XML/SOAP 5–15 sec High (polling)

We specialize in tour operator website development, including SEO optimization and tour booking systems. Contact us to discuss the architecture of your catalog. Get a consultation on timelines and cost—we will calculate an individual plan. Our engineers with certified 1C-Bitrix expertise and 10 years of experience guarantee a performant solution that avoids common pitfalls.

How to properly design infoblocks?

When developing a 1C-Bitrix website, we see dozens of projects where poor infoblock structure slows down the site. Typical scenario: the client asks for a "product catalog." The developer creates one infoblock catalog, puts 15 properties in it. Six months later – 40 properties, 8 of which are used only for one category. The filter lags, the b_iblock_element_property table grows to millions of rows, CIBlockElement::GetList runs for 3 seconds. Consequences – conversion drop, loss of customers, additional optimization costs. In one project after catalog refactoring, page generation time dropped from 4.2 to 0.8 seconds, and annual support costs were reduced by over $10,000 through eliminated redundant queries and agents.

Our approach: design infoblocks before writing a single line of code. Separate infoblocks for entities (products, categories, brands), dictionary properties via highload blocks, trade offers for SKUs. This builds performance for years. If you want a preliminary audit of your infoblock schema, contact us for a free review of common mistakes and recommendations.

Why 1C-Bitrix outperforms most CMS for business

The choice of CMS is dictated by business needs, not preferences. Native 1C exchange via catalog.import.1c provides two-way synchronization of products, prices, balances, and orders through CommerceML without third-party modules — five times faster than developing custom exchange on OpenCart or WordPress, saving hundreds of thousands of rubles. Proactive security module includes WAF, file integrity control, SQL injection protection, and two-factor authentication; it's certified for FSTEK requirements. Modular architecture lets you enable only needed modules — iblock, catalog, sale, search — reducing DB queries per hit. Regular patches close vulnerabilities faster than open-source projects (average CVE fix time two weeks). Official documentation is maintained on the vendor's site.

What highload blocks are and how they speed up the catalog

Highload blocks are an alternative to extended infoblock properties when the list of values can grow to thousands of entries. Typical example: manufacturers, countries, colors. If stored as list properties in an infoblock, each filter triggers a full scan of b_iblock_property_enum table. With HL-blocks, selection uses indexes – filter response time drops from 1–2 seconds to 50 ms. We use HLB component and custom queries via Bitrix\Highloadblock\DataManager. This is critical for catalogs with 100,000+ items.

From our practice: an online store with 500,000 items. Standard filter by brand took 4 seconds. The server couldn't handle 50 concurrent requests – pages crashed. We moved the brand directory to an HL-block, added tagged caching for 15 minutes, and set up an agent to clear cache on change. After optimization, filter time was 120 ms, average LCP was 1.8 seconds. The project runs stable without failures.

What integrations are critical for 1C-Bitrix stores

Each e‑commerce project requires reliable connections with payments, fiscalization, logistics, and CRM. We integrate YooKassa, CloudPayments, Tinkoff, Apple Pay, Google Pay for payments; ATOL and OrangeData for 54-FZ compliance via sale.cashbox; CDEK, Boxberry, PEC, Russian Post, Yandex.Delivery for logistics; Bitrix24, amoCRM, Roistat, Calltouch, Mindbox for analytics and CRM. All integrations are configured with proper error handling and fallback logic.

What's included in 1C-Bitrix website development

Each project includes a full set of documentation and artifacts to prevent knowledge loss after handover.

  • Technical specification – user stories, infoblock diagrams, integration schemas.
  • Source code in Git – with commit history, release tags, branching rules.
  • Administrative documentation – description of custom components, deployment instructions, list of agents and events.
  • Staff training – up to a 3-hour webinar: admin panel, order management, price settings. Recorded for later review.
  • Access to staging during development – test before production deployment.
  • Warranty support – bug fixes for 30 days after launch. Post-warranty support packages with SLA (response 2 hours, resolution 8 hours).

Our process and technologies

Project type Timeline Complexity Key features
Corporate website from 1 month Medium Catalog, news, forms, CRM integration
Online store from 2 months High 54-FZ, marketplaces, 1C exchange, SKU
B2B portal from 3 months Very high Personal prices, document flow, Bizproc
Landing page from 2 weeks Low LCP < 2s, composite cache, static
Multisite structure from 1.5 months High Separate content, shared catalog, hreflang

Tech stack: mobile-first markup, tested on physical devices (iPhone, iPad, Android). Use BrowserStack for Safari on iOS. Performance goals: LCP < 2.5 s, FID < 100 ms, CLS < 0.1. Enable composite site (composite module), CDN, tagged caching, WebP/AVIF, lazy loading. SEO: Schema.org via JSON-LD, auto-generation of sitemap.xml via seo module, canonical and hreflang for multilingual versions. robots.txt blocks /bitrix/ from indexing. CI/CD: Git, auto-deploy via GitLab CI, staging. DB migrations: sprint.migration module with versioning.

Process:

  1. Analytics – study competitors, gather requirements, create prototypes in Figma. Output: technical specification with user stories.
  2. Design – UI/UX with design system. Components are reusable.
  3. Development – write components with custom templates in local/templates/. Business logic in local/modules/.
  4. Testing – functional, cross-browser, load testing (up to 1000 requests). Critical bugs fixed before launch.
  5. Launch – deploy to production, monitoring via UptimeRobot, alerts in Telegram. Fixes for first 48 hours.

Multilingual support and redesign

Full localization via language files lang/ and SITE_ID mechanism. hreflang for each version. Regional versions with different prices and content – IP detection (main.geo) or manual selection. Multidomain – unified management of multiple domains.

Redesign without losing rankings: performance audit (PageSpeed, WebPageTest), SEO (Screaming Frog). New template in local/templates/ with preserved URL structure. 301 redirects only if URL changes significantly. Kernel update, migration to D7 ORM, infoblock restructuring, migration via sprint.migration with Git.

Guarantee and support

We have been working with 1C-Bitrix for 12+ years, completed 500+ projects. Certified developers on staff. Fixed price in contract – no surprises. Warranty period covers code errors. After warranty, subscription packages with SLA (response time 2 hours, resolution 8 hours). 24/7 availability monitoring, alerts in Telegram. Get a consultation and preliminary estimate: contact us via the form on the website or chat – we'll respond within an hour. Order turnkey development – we'll design infoblocks, integrate 1C, and speed up the catalog. If you already have a site on another CMS, order a performance audit and migration to Bitrix.