Разработка сайта аптеки на 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 неделя |







