Розробка сайту кінотеатру на 1С-Бітрікс
Сайт кінотеатру вирішує одне завдання — продати квиток на конкретний сеанс. Все інше (гарні постери, опис фільмів, трейлери) працює на цю мету. Технічна складність — у розкладі, який оновлюється щотижня, та в схемах кількох залів з різною конфігурацією місць. На 1С-Бітрікс це збирається з модулів iblock та sale з інтеграцією зовнішніх API.
Розклад сеансів: структура даних та TMDB
Розклад кінотеатру — це тривимірна матриця: фільм × зал × час. Зберігання організується в двох інфоблоках.
Інфоблок Films. Карточка фільму:
- PROPERTY_TMDB_ID — ідентифікатор у The Movie Database
- PROPERTY_TITLE_ORIGINAL — оригінальна назва
- PROPERTY_GENRES — жанри (множинний довідник)
- PROPERTY_DURATION — хронометраж у хвилинах
- PROPERTY_AGE_RATING — віковий рейтинг (0+, 6+, 12+, 16+, 18+)
- PROPERTY_FORMAT — формати показу (2D, 3D, IMAX, Dolby Atmos — множинний)
- PROPERTY_RELEASE_DATE — дата початку прокату
- PROPERTY_TRAILER_URL — посилання на трейлер (YouTube)
- PROPERTY_POSTER — постер (файл)
- PROPERTY_BACKDROP — фонове зображення для шапки сторінки
Ключовий момент — автоматичне заповнення карточки з TMDB API. Менеджер вводить тільки TMDB_ID, агент Бітрікс (запуск через CAgent::AddAgent) при створенні елемента виконує GET-запит до api.themoviedb.org/3/movie/{id} й заповнює: опис, жанри, хронометраж, постер, backdrop, акторський склад. Постер та backdrop завантажуються з image.tmdb.org та зберігаються локально — залежність від зовнішнього CDN виключається.
Оновлення даних запускається агентом раз на добу: перевіряються зміни рейтингів, описів, додані трейлери. Запити до TMDB кешуються в Bitrix\Main\Data\Cache з TTL 86400 секунд.
Інфоблок Sessions. Кожен сеанс — окремий елемент:
| Властивість | Тип | Опис |
|---|---|---|
| PROPERTY_FILM_ID | Привязка | Фільм із Films |
| PROPERTY_HALL_ID | Привязка | Зал із Halls |
| PROPERTY_DATETIME | Дата/час | Початок сеансу |
| PROPERTY_FORMAT | Список | 2D / 3D / IMAX |
| PROPERTY_LANGUAGE | Список | Оригінал / Дубляж / Субтитри |
| PROPERTY_PRICES | JSON | Ціни по зонах: {"zone_a": 12, "zone_b": 10, "zone_c": 8} |
| PROPERTY_STATUS | Список | Продаж / Мало місць / Розпродано / Скасовано |
Розклад на тиждень завантажується пакетно. Менеджер заповнює Excel-шаблон (фільм, зал, дата, час, формат), завантажує через кастомний адміністративний інтерфейс. Парсер на PhpSpreadsheet створює елементи інфоблоку, валідуючи кожну строку: існує фільм у базі, чи не перетинаються сеанси в одному залі (перевірка за хронометражем + 30 хвилин на прибирання).
Відображення розкладу. На головній сторінці — сітка «фільми × час» на сьогодні та завтра. Компонент bitrix:news.list з групуванням за фільмами, всередину — кнопки сеансів з ціною та форматом. Фільтр за датою, жанром та форматом — через AJAX без перезавантаження сторінки.
На сторінці фільму — повний розклад на поточний та наступний тиждень у форматі таблиці за днями. На сторінці залу — розклад усіх сеансів у цьому залі.
Продаж квитків: кілька залів, різні схеми, зональні ціни
Кожен зал кінотеатру — окрема SVG-схема. Мультиплекс на 5–8 залів означає 5–8 різних SVG-файлів з різною кількістю рядів, місць та конфігурацією (звичайні крісла, VIP-дивани, місця для інвалідів, love seats).
Структура SVG. Місця групуються по зонах через атрибут data-zone:
- zone_a — центральні ряди (оптимальний огляд)
- zone_b — бічні та задні ряди
- zone_c — перші ряди (ближче до екрану)
- zone_vip — VIP-секція (збільшені крісла, столики)
Ціна прив'язана до зони, а не до місця. Це спрощує адміністрування: замість задання ціни для кожного з 200 місць — 4 зональні ціни на сеанс. Ціни зберігаються у JSON-властивості сеансу PROPERTY_PRICES.
Інтерактивна схема. Технічна реалізація аналогічна театральній, але з нюансами:
- Місця різних типів відображаються різними іконками (звичайне крісло, VIP-диван, місце для колясок)
- Екран відрисовується в SVG як орієнтир — користувач розуміє, де буде сидіти відносно екрану
- Підсвітка зон при наведенні — вся зона підсвічується при hover, показуючи ціну категорії
- Мобільна версія: схема масштабується, при тапі на область — зум на секцію з показом окремих місць
Блокування та оплата. Вибрані місця блокуються в Redis на 8 хвилин (стандарт для кінотеатрів — покупка швидше, ніж у театрі). При оформленні замовлення:
- Валідація місць (не продані, не заблоковані іншим)
- Створення замовлення в
saleз позиціями: фільм + сеанс + місце - Онлайн-оплата через ЮKassa / CloudPayments / СБП
- Генерація електронного квитка з QR-кодом
- Відправлення на email та опціонально push через Telegram Bot API
QR містить зашифровану строку з ID замовлення, номером місця та контрольною сумою. Термінал при вході в зал сканує QR та помічає квиток як використаний. При спробі повторного проходу — відмова.
Інтеграція з кінотеатральними системами
Більшість мереж кінотеатрів працюють з автоматизованими системами управління. Сайт підключається до них для синхронізації розкладу та продажів.
| Система | Протокол | Можливості |
|---|---|---|
| Киноплан | REST API | Розклад, продаж, бронь, фіскалізація |
| Vista Cinema | SOAP / REST | Сеанси, зали, ціни, статус місць, транзакції |
| КСЕА (Кінотеатральна система єдиного абонемента) | XML-RPC | Абонементи, подарункові карти, бонуси |
| Ticketon | REST API | Віджет продажу, webhook статусів |
При інтеграції з Киноплан сайт Бітрікс виступає як фронтенд, а бекенд продажу — на стороні Киноплану. Агент синхронізації запускається щораз 5 хвилин: забирає актуальний розклад, статуси місць, нові фільми. При покупці через сайт замовлення передається в API Киноплану, звідти повертається ID транзакції для фіскального чека.
Для незалежних кінотеатрів без зовнішної системи вся логіка продажу працює всередину Бітрікс. У цьому випадку фіскалізація чека виконується через модуль онлайн-каси — інтеграція з АТОЛ, OrangeData або хмарною касою платіжного провайдера.
Бар-меню з передзаказом до сеансу
Додаткова виручка кінотеатру — продаж їжі та напоїв. На етапі покупки квитка додається крок «Додати до замовлення»:
- Попкорн (малий / середній / великий)
- Напитки (кола, сік, вода)
- Комбо-набори (попкорн + напиток зі скидкою)
- Начос, гарячі доги, снеки
Позиції бар-меню зберігаються в інфоблоці BarMenu з цінами та фотографіями. При додаванні до замовлення — додаткові позиції в кошику sale. Після оплати бар отримує замовлення через внутрішній webhook: номер замовлення, склад, час сеансу. До приходу глядача замовлення зібрано.
Товарні залишки синхронізуються з 1С:Управління торгівлею через стандартний модуль обміну. Якщо попкорн закінчився — позиція деактивується на сайті автоматично.
Бонусна карта
Програма лояльності кінотеатру реалізується через внутрішні рахунки модуля sale:
- Нарахування бонусів після відвідування (5–10% від суми чека)
- Списання бонусів при наступній покупці (до 50% вартості квитка)
- День народження — подвійні бонуси на тиждень (обробник перевіряє UF-поле
UF_BIRTHDAY) - Накопичувальні рівні: Глядач → Кінолюб → Кінокритик (пороги задаються в HL-блоці
LoyaltyLevels)
Ідентифікація — за номером телефону. Фізична пластикова карта не потрібна: при покупці клієнт вводить телефон, система знаходить акаунт і показує баланс. Авторизація в особистому кабінеті — через SMS-код (модуль main з кастомним обробником авторизації через messageservice-провайдер).
Технічні графіки робіт
| Етап | Графік |
|---|---|
| Проектування та прототип | 2 тижні |
| Дизайн (адаптив, схеми залів) | 3–4 тижні |
| Верстка | 2–3 тижні |
| Розробка (інфоблоки, розклад, TMDB) | 3–4 тижні |
| SVG-схеми залів та продаж місць | 2–3 тижні |
| Інтеграція (платіжна система, каса, Киноплан) | 2–4 тижні |
| Бар-меню та бонусна система | 1–2 тижні |
| Тестування та наповнення | 2 тижні |
| Разом | 17–24 тижні |
При інтеграції з існуючою кінотеатральною системою (Киноплан, Vista) етапи розкладу та продажу місць частково перетинаються, що скорочує загальний термін на 2–3 тижні.







