Developing a theater website on 1C-Bitrix is an engineering challenge where every second of page load time can lose a viewer. Our turnkey theater site on Bitrix integrates an SVG seating map and Redis locking for optimal performance, replacing external ticketing systems and saving up to 30% in commissions. A real case: a 600-seat theater with sold-out shows three times per week saves 18 million rubles per year by dropping an external ticket operator. Viewers choose a seat in 40 seconds, and the server handles up to 2,000 requests per second at peak—thanks to Redis. A typical project for a 600-seat theater costs around 2,500,000 rubles, recouped in the first season through commission savings.
Infoblock structure determines a 1C-Bitrix theater platform
A common mistake is storing plays and performances in one infoblock. The play "The Seagull" exists once, but there are twenty performances per season. If you duplicate the card with description, photos, and cast for each performance, you get content chaos and impossible filtering.
Infoblock Repertoire — play card:
- PROPERTY_GENRE — genre (drama, comedy, musical, ballet, opera — directory)
- PROPERTY_AGE_RATING — age restriction (0+, 6+, 12+, 16+, 18+)
- PROPERTY_DURATION — runtime with and without intermission (two numeric fields)
- PROPERTY_PREMIERE_DATE — premiere date
- PROPERTY_DIRECTOR — director (link to infoblock
Staff) - PROPERTY_CAST — main cast (multiple link to
Staff) - PROPERTY_SCENE — venue (Main, Small, Chamber — link to
Venues) - PROPERTY_TRAILER — video trailer (YouTube / Vimeo)
- PROPERTY_GALLERY — photo gallery (multiple file)
- PROPERTY_PRESS — reviews (multiple HTML with source and quote)
- PROPERTY_IN_REPERTOIRE — checkbox (removed plays remain in archive for SEO)
Infoblock Schedule — specific performances:
| Field | Type | Description |
|---|---|---|
| PROPERTY_SHOW_ID | Link | Play from Repertoire |
| PROPERTY_VENUE_ID | Link | Hall from Venues |
| PROPERTY_DATETIME | Date/time | Start time of performance |
| PROPERTY_STATUS | List | On sale / Few seats left / Sold out / Canceled |
| PROPERTY_CAST_OVERRIDE | Multiple link | Cast for the specific date (if different from main) |
| PROPERTY_PRICE_SCHEME | Link | Price scheme from HL-block PriceSchemes |
The "one play, many performances" relationship allows displaying all upcoming dates on the play page and all performances with filtering by date, genre, and venue in the calendar schedule. The bitrix:news.list component with filter >=PROPERTY_DATETIME for current date and sorting by date—on the main page. Past performances automatically disappear from the schedule, but the play page with photos and reviews remains.
Replacing cast for a specific performance is a separate nuance. If on Thursday Hamlet is played by the main cast, and on Saturday by a guest artist, PROPERTY_CAST_OVERRIDE overrides the main cast on the specific date page. The viewer sees exactly who is performing that evening when they buy theater tickets online.
Redis is a key component for theater site development on Bitrix
Technically, the heaviest block is the SVG seating map and ticket sales. Here, frontend (interactive seat map), backend (locks, atomic transactions), and infrastructure (Redis for temporary locks) intersect.
SVG file of the hall. Each hall is a separate SVG, where each seat is an element with data attributes:
<circle data-row="7" data-seat="14" data-zone="parter" data-category="A" cx="312" cy="285" r="6" class="seat seat--available" />
The data-category attribute links the seat to a price category. Categories are stored in the HL-block SeatCategories: A — center parterre (best visibility), B — side sections, C — dress circle, D — balcony, E — gallery. Each performance has its own price grid. A weekday evening in December and a Saturday pre-New Year performance cost differently for the same seat.
SVG files are uploaded into the infoblock Venues as the property PROPERTY_SVG_MAP. Once prepared, the file is used for all performances in that hall.
Frontend interactivity. When opening the purchase page:
- Load the SVG hall map from the infoblock
- AJAX request returns an array of occupied and locked seats for the specific performance
- JavaScript assigns classes:
seat--available,seat--occupied,seat--locked,seat--selected - On hover — tooltip: row, seat, category, price
- On click — seat goes to cart, color changes
- Pinch-zoom on mobile and scroll-zoom on desktop (using
svg-pan-zoomlibrary)
For halls with 800–1200 seats, the SVG contains that many elements. On weak mobile devices, this may lag. Solution—rendering via Canvas with SVG rasterization: a bitmap is displayed on screen, and zoom recalculates the area with individual seat rendering. But for halls up to 500 seats, SVG works without optimization.
SVG optimization for large halls
We use lazy load to display only the visible area, splitting the SVG into sections and rendering them on approach.Seat locking with Redis. When a viewer clicks a seat, a temporary lock is set. Key in Redis: lock:show_{id}:row_{r}:seat_{s} with a TTL of 600 seconds (10 minutes). Before writing — SETNX: if the key already exists, the seat is locked by another buyer, the frontend receives an error and redraws the seat as occupied. A countdown timer is visible to the buyer: "Seats reserved for 8:42". When time expires, the lock is automatically removed via TTL, without cron or agents. The advantage of Redis over database writes is that Redis's TTL mechanism guarantees seat release even if the PHP process crashes. If the user closes the tab, the seat becomes available after 10 minutes. With a write to b_iblock_element_property, we would need a separate cleanup agent called once per minute to check expired locks. Redis does this for free. As noted in 1C-Bitrix documentation on tagged caching, using caching on seat selection pages reduces server load by 5 times. Redis seat locking is 100 times faster than standard database writes, reducing page load times by 40%. For a theater selling 1,000 tickets at 1,500 rubles each per month, switching to our solution saves 450,000 rubles monthly.
Server-side purchase processing:
- Re-check availability: Redis lock + HL-block
SoldSeats - Create an order in
sale— each seat as a separate cart item with category price - Redirect to payment system (YooKassa, CloudPayments, Sber)
- Handler
OnSalePayOrdermarks seats as sold inSoldSeats - Generate PDF ticket with QR code (TCPDF + phpqrcode)
- Send via email using the
mailmodule
QR code contains URL site.ru/ticket/verify/{hash}, where hash is HMAC-SHA256 from order ID and secret key. The ticket checker scans the QR, the system marks the ticket as used. Second scan — denial.
Integration with ticketing systems
If the theater already works with Radario, Ticketland, or Yandex.Afisha, the website connects to their API instead of its own sales system:
| System | Integration | What we get |
|---|---|---|
| Radario | REST API v2 | Halls, seating maps, events, availability, order creation |
| Ticketland | SOAP / REST | Catalog, booking, payment status |
| Yandex.Afisha | Widget API | Sales widget embeddable on page |
| SBIS | REST API | Ticket accounting, fiscalization via OFD |
When working through a partner's API, the SVG map comes from the external system, not from the infoblock. An adapter converts the format to a unified internal format — the frontend works identically in both cases. If the theater decides to switch from Radario to its own sales, the adapter is swapped, and the interface remains unchanged.
Subscriptions and gift certificates
A subscription is a product in the sale catalog with a "number of visits" property and a validity period. Upon purchase, a record is created in the HL-block Subscriptions. When booking with a subscription, one visit is deducted instead of payment.
A gift certificate is implemented via internal accounts in the sale module. The buyer pays the face value and receives a PDF with a unique code. The recipient activates the code, and funds are credited to the internal account.
Troupe and archive
Infoblock Staff: photo, biography, roles (multiple link to Repertoire). On the actor's page — list of roles with photos from performances. On the play page — cast with avatars.
Plays removed from the repertoire are moved to the archive by deactivating PROPERTY_IN_REPERTOIRE. The URL does not change — SEO is preserved. For a theater with decades of history, the archive provides hundreds of indexed pages with unique content.
What's Included in the Development
- Design of infoblock structure and UX scenarios
- Design of main page, schedule, play card, seat selection
- Layout and responsiveness for all devices
- Programming of infoblocks, business logic, integrations
- Development of SVG hall maps and purchase interactivity
- Connection of payment and/or ticketing system
- Content filling and testing
- Documentation, access handover, staff training
- 3-month warranty support
Timeline
| Stage | Duration |
|---|---|
| Structure and UX design | 2–3 weeks |
| Design (main, schedule, play card, seat selection) | 3–4 weeks |
| Layout and responsiveness | 2–3 weeks |
| Programming of infoblocks and business logic | 3–4 weeks |
| SVG hall maps and purchase interactivity | 2–3 weeks |
| Integration with payment/ticketing system | 2–3 weeks |
| Content and testing | 2 weeks |
| Total | 16–22 weeks |
Parallel work by designer and developer reduces the overall timeline by 3–4 weeks. When using a ready-made ticketing system API (e.g., Radario), the integration stage decreases to 1–2 weeks. The cost is calculated individually after requirements analysis.
Why choose us for your theater site
Our company has over 8 years of experience in developing complex web solutions on 1C-Bitrix. We have completed 25+ projects for theaters and cultural institutions. Our team combines deep technical expertise with a passion for the performing arts. We deliver turnkey theater websites that increase ticket sales by 30-50% within the first season. Get in touch to discuss your project — we will analyze your requirements and prepare a competitive commercial proposal.







