Розробка адміністративного інтерфейсу управління парсером 1С-Бітрікс
Парсер без адмінки — це bash-скрипт на cron, який розуміє тільки розробник, що його написав. Стоїть йому піти у відпустку — і ніхто не може ні зупинити імпорт, ні змінити джерело, ні зрозуміти, чому каталог наповняється сміттям. Повнофункціональний інтерфейс управління парсером — це інвестиція в керованість системи. Розберемо архітектуру, ключові екрани та інтеграцію з механізмами Бітрікс.
Архітектура: модуль або сторінка admin
У 1С-Бітрікс є два шляхи створення адміністративного інтерфейсу:
-
Кастомний модуль (
/local/modules/yourcompany.parser/) — повнофункціональна структура зinstall/,admin/,lib/, реєстрацією в системі модулів, пунктами меню в лівій панелі. Правильний шлях для довгоживучих проектів. -
Адміністративні сторінки (
/local/admin/parser_*.php) — швидше у реалізації, але гірше масштабується. Підходить для MVP.
Для інтерфейсу управління парсером рекомендую повнофункціональний модуль. Причина — парсер звичайно обростає сутностями: джерела, правила маппінгу, розписання, логи. Усе це зручно групувати в рамках одного модуля з ORM-сутностями.
Структура модуля
/local/modules/yourcompany.parser/
├── install/
│ ├── db/ — SQL міграції
│ └── index.php — установка/видалення
├── admin/
│ ├── parser_source_list.php
│ ├── parser_source_edit.php
│ ├── parser_task_list.php
│ ├── parser_log_list.php
│ └── menu.php
├── lib/
│ ├── Source.php — ORM-таблиця джерел
│ ├── Task.php — ORM-таблиця задач
│ ├── TaskLog.php — ORM-таблиця логів
│ ├── MappingRule.php — правила маппінгу полів
│ └── Engine/
│ ├── AbstractParser.php
│ ├── HttpClient.php
│ └── DomExtractor.php
└── lang/
Реєстрація модуля стандартна — include.php в корені, Module::register() при установці, пункти меню через admin/menu.php з використанням $aMenuLinks[].
Екран 1: Управління джерелами
Головний екран. Список джерел парсингу у стандартному CAdminList з колонками:
| Колонка | Тип | Призначення |
|---|---|---|
| ID | int | Первинний ключ |
| NAME | string | Людочитаема назва джерела |
| BASE_URL | string | Кореневий URL |
| STATUS | enum | active / paused / error |
| LAST_RUN | datetime | Останній запуск |
| LAST_RESULT | string | ok / error: опис |
| ELEMENTS_COUNT | int | Обработано елементів за останній запуск |
| SCHEDULE | string | Cron-вираження |
Форма редагування джерела (CAdminForm / CAdminTabControl) містить вкладки:
-
Основне — імя, URL, статус, привязка до інфоблоку каталогу (
IBLOCK_ID). -
Правила парсингу — CSS-селектори або XPath для полів: назва, ціна, артикул, опис, зображення. Кожне правило — рядок з полями
field_code,selector,type(text/html/attr/regex),transform(trim/number/replace). - Розписання — cron-вираження або вибір з пресетів (кожну годину, кожні 6 годин, щодня). Зберігається у таблиці джерела, агент читає та запускає.
- HTTP-налаштування — User-Agent, таймаут, прокси, затримка між запитами, лімит сторінок.
Екран 2: Задачи парсингу
Кожен запуск парсера створює запис у таблиці parser_task:
CREATE TABLE parser_task (
id SERIAL PRIMARY KEY,
source_id INT REFERENCES parser_source(id),
status VARCHAR(20) DEFAULT 'pending', -- pending, running, completed, failed
started_at TIMESTAMP,
finished_at TIMESTAMP,
total_items INT DEFAULT 0,
created_items INT DEFAULT 0,
updated_items INT DEFAULT 0,
skipped_items INT DEFAULT 0,
error_items INT DEFAULT 0,
error_message TEXT
);
У списку задач — фільтр по джерелу та статусу, кольорова індикація (зелений — completed, червоний — failed, жовтий — running). Кнопки дій: Запустити заново, Зупинити (встановлює флаг status=cancelling, парсер перевіряє флаг перед кожною ітерацією).
Екран 3: Журнал ошибок
Побудований поверх ORM-таблиці parser_task_log. Колонки: час, джерело, рівень (info/warning/error), URL елемента, повідомлення, контекст (JSON). Фільтрація по рівню та джерелу обов'язкова — без неї лог нечитаний.
Для кожної записи ERROR рівня додаємо посилання «Відкрити елемент» — прямий URL на сторінку товара в адміністравці інфоблоку (/bitrix/admin/iblock_element_edit.php?IBLOCK_ID=X&ID=Y).
Екран 4: Правила маппінгу
Окрема сторінка для візуального редагування маппінгу полів джерела → властивості інфоблоку. Таблиця:
| Поле джерела | Селектор | Властивість інфоблоку | Трансформація |
|---|---|---|---|
| Назва | h1.product-title | NAME | trim |
| Ціна | .price-current span | PROPERTY_PRICE | extractNumber |
| Артикул | [data-sku] | PROPERTY_ARTICLE | — |
| Картинка | .gallery img[0]@src | DETAIL_PICTURE | downloadImage |
Маппінг зберігається в JSON-полі джерела або в окремій таблиці parser_mapping. Другий варіант зручніше для версіонування — можна відкатити до попередніх правил.
Кнопка «Тестовий парсинг»
Критично важлива функція. Кнопка в формі редагування джерела запускає парсинг одного елемента по указаному URL та показує результат прямо в інтерфейсі: які поля видобуті, які значення отримані, які помилки. Це дозволяє менеджеру перевірити селектори без запуску повного циклу.
Реалізація — AJAX-обработник, що приймає source_id та test_url, викликає парсер в режимі dry_run=true (без запису в інфоблок) та повертає JSON з результатами.
Безпека та права
Доступ до інтерфейсу парсера — через перевірку $APPLICATION->GetGroupRight('yourcompany.parser'). Назначайте права через стандартний механізм модулів: Налаштування → Користувачі → Групи → Доступ до модулів. Мінімум дві ролі: перегляд (логи, статуси) та управління (створення/редагування джерел, запуск).
Терміни по масштабу
| Компонент | Час |
|---|---|
| Модуль + ORM-сутності + міграції | 2-3 дні |
| Список/редагування джерел | 2 дні |
| Список задач + управління | 1-2 дні |
| Журнал ошибок | 1 день |
| Маппінг полів + тестовий парсинг | 2-3 дні |
| Тестування, відладка | 1-2 дні |
| Всього | 1-2 тижні |







