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







