Розробка сайту аптеки на 1С-Бітрікс
Аптечний сайт — один з найбільш зарегульованих проектів у e-commerce. Дистанційна продаж рецептурних препаратів заборонена законодавством, безрецептурні можна продавати лише при наявності ліцензії на фармацевтичну діяльність і дотриманні вимог постанов уряду. Технічна реалізація повинна враховувати ці обмеження на рівні архітектури, а не просто текстових попереджень.
Каталог лікарських препаратів
Структура каталогу будується на інфоблоці з розширеним набором властивостей, адаптованих під фармацевтичну номенклатуру:
| Властивість | Тип | Призначення |
|---|---|---|
ACTIVE_SUBSTANCE |
Строка | МНН (міжнародне непатентоване найменування) |
TRADE_NAME |
Назва елемента | Торговий назва |
DOSAGE_FORM |
Список | Таблетки, капсули, розчин, мазь, супозиторії... |
DOSAGE |
Строка | 500 мг, 10 мг/мл |
PACKAGE_QTY |
Число | Кількість в упаковці |
PRESCRIPTION |
Список | Рецептурний / Безрецептурний |
ATC_CODE |
Строка | Код АТХ-класифікації (J01CA04 тощо) |
MANUFACTURER |
Прив'язка до HL | Виробник |
COUNTRY |
Прив'язка до HL | Країна виробництва |
REG_NUMBER |
Строка | Номер реєстраційного посвідчення |
STORAGE_TEMP |
Список | До 25°C / 2–8°C / Без обмежень |
MDLP_GTIN |
Строка | GTIN для маркування МДЛП |
ANALOGS |
Прив'язка до елементів (множ.) | Аналоги за МНН |
Для рецептурних препаратів кнопка «Купити» замінюється на «Забронювати» з поясненням: відпуск лише при пред'явленні рецепта в аптеці. Це обробляється на рівні шаблону компонента catalog.element — перевіряється властивість PRESCRIPTION, і залежно від значення рендериться потрібний блок дій.
Категоризація каталогу — подвійна. Основна навігація за фармакотерапевтичними групами (АТХ-класифікація), додаткова — за формами випуску та за призначенням (від головного болю, від застуди, вітаміни). Реалізація через розділи інфоблока (АТХ) та теги (призначення).
Пошук за симптомами та довідник МКБ-10
Довідник МКБ-10 (Міжнародна класифікація хвороб, 10-й перегляд) завантажується в Highload-блок hl_mkb10. Структура:
-
UF_CODE— код діагнозу (J06.9, K21.0) -
UF_NAME— назва діагнозу -
UF_PARENT_CODE— код батьківської групи (для ієрархії) -
UF_SYNONYMS— побутові назви (нежить, виразка, мігрень)
Пошукова строка з автопідказкою: користувач вводить «болить горло» — система шукає по полю UF_SYNONYMS, знаходить J02 (гострий фарингіт) і J03 (гострий тонзиліт), підставляє пов'язані препарати. Зв'язок «діагноз → препарат» зберігається в проміжному Highload-блоці hl_mkb_drugs (поля: UF_MKB_CODE, UF_PRODUCT_ID).
Пошук працює через AJAX-контролер, результати кешуються на стороні клієнта (sessionStorage) для повторних запитів. На бекенді — складній індекс по UF_SYNONYMS + UF_NAME для швидкої фільтрації.
Перевірка наявності по аптекам і пошук аналогів
Це найбільш затребувана функція аптечного сайту і основна точка технічної складності. Користувач хоче знати: є чи потрібний препарат в аптеці рядом з домом, і якщо нема — які аналоги доступні.
Архітектура перевірки наявності:
Остатки зберігаються не в Бітриксі — приходять з облікової системи аптечної мережі. Типові варіанти:
- 1С:Управління аптечною мережею — вивантаження остатків через REST-сервіс по HTTP
- Фарматика / М-Аптека плюс — обмін через файли CSV/XML на FTP
- Кастомна система обліку — REST API або SOAP
Незалежно від джерела, дані потрапляють в Highload-блок hl_pharmacy_stock:
| Поле | Тип | Призначення |
|---|---|---|
UF_PRODUCT_ID |
Число | ID товара в каталозі Бітрікса |
UF_PHARMACY_ID |
Число | ID аптеки (з інфоблока «Аптеки») |
UF_QUANTITY |
Число | Остаток (штуки/упаковки) |
UF_PRICE |
Число | Ціна в конкретній аптеці |
UF_UPDATED_AT |
Дата/час | Час останнього оновлення |
Синхронізація запускається cron-агентом CPharmacyStockAgent кожні 15–30 хвилин. Повна вивантаження — ночами, протягом дня — інкрементальна (тільки зміни). При 50 аптеках і 15 000 SKU таблиця містить до 750 000 записів — Highload-блок справляється, але потрібен індекс по (UF_PRODUCT_ID, UF_PHARMACY_ID).
Вивід на фронте:
На деталізованій сторінці препарата — блок «Наявність в аптеках». AJAX-запит з передачею ID товара повертає список аптек з остатками. Аптеки сортуються за відділеністю від користувача (геолокація через Geolocation API браузера + розрахунок відстані за формулою Haversine). Кожна строка: назва аптеки, адреса, остаток (точна кількість або «В наявності» / «Мало» / «Немає»), кнопка «Забронювати».
Точну кількість остатків показувати не рекомендується — вона застарівує за хвилини. Краще три градації: зелена (>5), жовта (1–5), сірий (0). Поріг настроюється в опціях модуля.
Пошук аналогів:
Коли препарата нема ні в одній аптеці — користувачу пропонуються аналоги. Алгоритм:
- Беруться МНН поточного препарату (
ACTIVE_SUBSTANCE). - Вибираються всі товари з тим же МНН та тією ж дозуванням — це повні аналоги (дженерики).
- Якщо збігів мало — розширюється до тієї ж АТХ-групи 4-го рівня (фармакологічні аналоги).
- Результат фільтрується за наявністю в аптеках — показуються тільки ті, які реально можна взяти.
Властивість ANALOGS (прив'язка до елементів) заповнюється автоматично cron-скриптом на основі збігу МНН. Ручне редагування — для випадків, коли фармацевт хоче додати або виключити конкретний аналог.
Онлайн-бронювання
Бронювання — не продаж. Оплата не взимається на сайті. Процес:
- Користувач вибирає препарат і аптеку, натискає «Забронювати».
- Створюється заявка в CRM Бітрікса (ліда або угода) з даними: препарат, аптека, контактний телефон.
- Паралельно — запит в облікову систему аптеки на резервування.
- Користувач отримує SMS/push з номером броні та часом, до якого потрібно взяти (зазвичай 24–48 годин).
- При закінченні терміну — автоматична відмена бронювання, повернення в вільний остаток.
Для рецептурних препаратів бронювання доступне, але при отриманні обов'язково пред'явлення рецепта — це фіксується в умовах бронювання.
Інтеграція з МДЛП
Маркування ліків через систему «Честный ЗНАК» (МДЛП — моніторинг руху лікарських препаратів) обов'язкова. На сайті це відображається:
- Кожен препарат містить GTIN (
MDLP_GTIN) — по ньому можна перевірити підлинність на сайті «Честного ЗНАКа». - На деталізованій сторінці — посилання «Перевірити підлинність» з формуванням URL на
checkmark.crpt.ru. - При бронюванні фіксується серійний номер упаковки (якщо аптека передає цю інформацію через API).
Schema.org для фармацевтики
Мікророзмітка schema.org/Drug на деталізованих сторінках:
-
nonProprietaryName— МНН -
activeIngredient— активна речовина -
dosageForm— форма випуску -
drugClass— фармакологічна група -
manufacturer— виробник -
availableStrength— дозування -
prescriptionStatus—OTCабоPrescriptionOnly -
isAvailableGenerically— наявність дженериків (true/false)
Ця розмітка допомагає пошуковим системам правильно індексувати каталог і формувати розширені сніпети.
Етапи проекту
| Етап | Роботи | Тривалість |
|---|---|---|
| Аналітика та проектування | Маппінг номенклатури, інтеграційні контракти, UX-прототипи | 2–3 тижні |
| Каталог та пошук | Інфоблоки, HL-блоки, пошук за МКБ-10, фільтри | 3–4 тижні |
| Наявність та бронювання | Інтеграція з обліковою системою, геолокація, бронювання | 4–5 тижнів |
| Аналоги та Schema.org | Алгоритм підбору аналогів, мікророзмітка, SEO | 2 тижні |
| Тестування | Перевірка обміну даними, навантаження на HL-блок остатків | 1–2 тижні |
| Запуск | Наповнення каталогу, навчання фармацевтів-редакторів | 1 тиждень |







