1. Назначение и модель работы
Модуль BUSSOL DataBridge: импорт, экспорт и автоматизация каталога организует повторяемый обмен данными между 1С-Битрикс и файлами XLSX/XLSM/XLS/CSV, Google Sheets и внешними источниками. Версия 1.6.0 работает не только с элементами инфоблоков, но и с разделами/SEO, Highload-блоками, скидками/правилами корзины и наборами/комплектами.
| Компонент | Назначение |
|---|---|
| Профиль | Хранит тип сущности, источник, формат, направление, столбцы, фильтр, правила импорта, доставку результата и расписание. |
| Задание | Фиксирует один запуск экспорта, импорта или отката: файл, статус, прогресс, счётчики и состояние. |
| Журнал | Содержит построчные сообщения, предупреждения и ошибки с номером строки и ID сущности. |
| Агент и планировщик | Разбирают очередь, ставят задания по расписанию, восстанавливают зависшие операции и очищают старые задания. |
| Rollback-журнал | Сохраняет обратные действия до изменений и позволяет отдельным заданием откатить поддерживаемые изменения импорта. |
| Доставка | После успешного экспорта может передать файл по FTP/FTPS, HTTP(S), Google Drive, Google Sheets или email. |
Рекомендуемая модель эксплуатации: создать профиль, выполнить контрольный экспорт или dry-run импорта, проверить журнал, сделать резервную копию, запустить реальный обмен, а автоматизацию и расписание включать после успешной приёмки сценария на копии сайта.
2. Возможности версии 1.6.0
- Неограниченное число профилей; направления «Экспорт», «Импорт» и «Импорт и экспорт».
- Типы профилей: элементы/товары, разделы и SEO, Highload-блоки, скидки/правила корзины, наборы и комплекты.
- Форматы XLSX, XLSM, XLS и CSV; многолистовой импорт и экспорт.
- Импорт из ручного файла, HTTP/HTTPS/FTP/FTPS, email-вложений по IMAP и Google Sheets.
- Экспорт с автоматической доставкой на FTP/FTPS, HTTP(S), Google Drive, Google Sheets и по email.
- Элементы и свойства инфоблоков, разделы, SEO, файлы, изображения, цены, валюты, товарные параметры и остатки отдельных складов.
- Создание и обновление SKU прямо из строк товарного профиля, включая свойства, цены и складские остатки.
- Составные ключи, стратегии найден/не найден, дубликаты, деактивация или удаление отсутствующих объектов там, где это поддерживает тип профиля.
- Highload-профили с UF-полями, составными ключами, dry-run и удалением отсутствующих записей.
- Создание свойств инфоблока, свойств SKU и UF-полей по явно размеченным заголовкам файла.
- Безопасные цепочки преобразований колонок без eval и произвольного PHP-кода.
- Внешние JPEG/PNG/GIF/WebP с SSRF-защитой, проверкой MIME, размера и геометрии.
- XLSX/XLSM-шаблоны с сохранением стилей, формул и VBA-пакета XLSM.
- Расписание: интервал, ежедневно или по дням недели.
- Dry-run и журналируемый откат выполненного импорта.
- Очередь, прогресс, статистика, журнал, групповые права D/R/W и защищённая выдача файлов.
| Тип профиля | Основные сценарии |
|---|---|
| Элементы / товары | Инфоблоки, свойства, разделы, файлы, каталог, цены, склады и генерация SKU. |
| Разделы и SEO | Поля разделов, родительская иерархия, UF и SEO-шаблоны IProperty. |
| Highload-блок | UF-поля существующего HL-блока; импорт, экспорт, ключи и удаление отсутствующих записей. |
| Скидки / правила корзины | Безопасно ограниченный набор полей CSaleDiscount: группы, сроки, процент/фиксированная скидка, валюта, товары. |
| Наборы и комплекты | Штатные CCatalogProductSet: SET/GROUP, владелец, состав, количества и сортировка. |
3. Системные требования
| Компонент | Требование |
|---|---|
| 1С-Битрикс | Актуальное ядро «1С-Битрикс: Управление сайтом» с D7 ORM. Модуль iblock обязателен. |
| PHP | PHP 8.1 или новее. |
| Базовые расширения PHP | mbstring, zip, XMLReader и SimpleXML для XLSX/XLSM. |
| Дополнительные расширения | imap — для email-источника; ftp — для FTP/FTPS. |
| Модули Битрикс | catalog — для цен, складов, SKU и наборов/комплектов; sale — для скидок; highloadblock — для HL-профилей. |
| База данных | MySQL или MariaDB. |
| Файловая система | Права веб-процесса на запись в /upload/bussol.iblockexcel/ и системный временный каталог. |
| LibreOffice / soffice | Нужен только для импорта старого бинарного BIFF .xls. XML Spreadsheet 2003 .xls читается без конвертации. |
| Сеть | Исходящий доступ к настроенным HTTP(S), FTP/FTPS, IMAP и Google API, если соответствующие функции используются. |
| OAuth Client ID, Client Secret и Refresh Token для Google Sheets/Drive. | |
| Фоновые задачи | Агент модуля должен выполняться примерно раз в минуту; на production рекомендуется штатный перевод агентов Битрикс на cron. |
4. Установка обновление и удаление
Чистая установка
- Распакуйте каталог bussol.iblockexcel в /local/modules/ сайта либо установите решение штатным механизмом Marketplace.
- Откройте «Marketplace → Установленные решения», найдите BUSSOL DataBridge и нажмите «Установить».
- Установщик создаст таблицы модуля, административные прокси и тему, зарегистрирует меню и агент \Bussol\IblockExcel\Service\Agent::run(); с интервалом 60 секунд.
- Откройте настройки модуля и назначьте групповые права, а также глобально разрешите/запретите HTTP/FTP- и email-источники.
- Перейдите в «BUSSOL → BUSSOL DataBridge → Профили обмена» и создайте тестовый профиль.
Обновление с 1.2.4–1.5.x до 1.6.0
- Сделайте резервную копию каталога модуля и базы данных.
- При штатном обновлении Marketplace используйте механизм обновлений решения.
- При ручном обновлении замените каталог /local/modules/bussol.iblockexcel новой версией, не удаляя решение и его таблицы.
- Схема таблиц в 1.6.0 не меняется: новые параметры хранятся в SETTINGS_JSON, rollback-журналы — в файловой системе.
- Убедитесь, что административные прокси и тема обновлены. При контролируемой переустановке обязательно выберите сохранение данных.
- Очистите управляемый кеш Битрикс и кеш браузера, затем проверьте меню, права, один экспорт и dry-run одного импорта.
Удаление
Деинсталлятор удаляет агент, обработчик меню, административные прокси и тему модуля. В диалоге удаления можно сохранить таблицы профилей, заданий и журнала. Если данные не сохраняются, таблицы b_bussol_ibx_profile, b_bussol_ibx_job и b_bussol_ibx_log удаляются.
5. Права настройки и навигация
Права групп
| Право | Возможности |
|---|---|
| D | Доступ к административным страницам модуля запрещён. |
| R | Просмотр профилей, заданий, статистики, файлов и журнала. |
| W | Создание и изменение профилей, запуск/отмена заданий, ручной запуск источников, удаление заданий и запуск rollback. |
Настройки модуля
| Параметр | По умолчанию | Диапазон / смысл |
|---|---|---|
| Хранить завершённые задания, дней | 30 | 1–3650 дней. Вместе с заданием очищаются файл, журнал и rollback-журнал. |
| Остановить импорт после числа ошибок | 1000 | 1–100000 ошибок. |
| Разрешить импорт из HTTP/FTP URI | Включено | Глобальный предохранитель для REMOTE-источников. |
| Разрешить импорт вложений из email (IMAP) | Включено | Глобальный предохранитель для EMAIL-источников. |
Путь к интерфейсу: BUSSOL → BUSSOL DataBridge. Внутри доступны «Профили обмена» и «Задания и журнал». Администратор сайта получает полный доступ независимо от группового права.
6. Создание и параметры профиля
Профиль описывает устойчивый сценарий обмена. Интерфейс разделён на три шага: «Профиль» (сущность, источник и формат), «Столбцы» (состав данных) и «Логика» (фильтр, импорт, формат, доставка и расписание).
| Параметр | Описание |
|---|---|
| Название профиля | Понятное назначение сценария, например «Прайс поставщика — ночь» или «B2B XLSM для дилеров». |
| Тип данных | Элементы/товары, разделы и SEO, Highload-блок, скидки/правила корзины, наборы и комплекты. |
| Целевая сущность | Для элементов/разделов/наборов выбирается инфоблок; для HL — существующий Highload-блок; скидки работают по правилам корзины. |
| Направление | Экспорт, импорт или оба направления. |
| Формат | XLSX, XLSM, XLS или CSV UTF-8. Импортируемый файл должен соответствовать формату профиля. |
| Источник импорта | Ручной файл, REMOTE URI, Email (IMAP) или Google Sheets. |
| Состояние | Только активный профиль можно запускать вручную и по расписанию. |
Рекомендуемый порядок настройки
- Создайте профиль, выберите тип сущности и целевой объект.
- Выберите направление и формат.
- Для автоматического импорта настройте источник и его учётные данные.
- Настройте выбранные столбцы, заголовки, порядок и преобразования.
- Настройте ключи и стратегии импорта; для товарного профиля при необходимости — отдельные правила SKU.
- Настройте листы, внешние изображения, создание схемы и rollback.
- Для экспорта при необходимости настройте шаблон и каналы доставки.
- Выполните ручную приёмку, после чего включите расписание.
7. Конструктор столбцов
| Группа | Примеры |
|---|---|
| Поля элемента | ID, XML_ID, CODE, NAME, ACTIVE, SORT, даты, тексты, картинки, теги. |
| Свойства | PROPERTY:CODE/ID, включая множественные значения и поддерживаемые типы. |
| Разделы элемента | SECTION_IDS и SECTION_PATHS. Пути могут создавать отсутствующую иерархию при включённой опции. |
| Торговый каталог | Количество, вес, размеры, закупочная цена/валюта. |
| Цены | PRICE:<ID> и валюта каждого типа цен. |
| Склады | STORE:<ID> для каждого активного склада. |
| SKU | SKU:поля, SKU:PROPERTY:*, SKU:CATALOG:*, SKU:PRICE:* и SKU:STORE:*; для инфоблока предложений — связь с родительским товаром. |
| Разделы и SEO | Поля раздела, родитель, SEO:* и UF-поля разделов. |
| Highload | ID и существующие UF_* выбранного Highload-блока. |
| Скидки | Поля скидки, группы пользователей, тип/размер скидки и PRODUCT_IDS. |
| Наборы/комплекты | SET_ID, TYPE, OWNER_ID, ITEM_IDS, QUANTITIES, SORTS. |
Для каждой колонки задаются пользовательский заголовок, порядок, разрешение экспорта/импорта, базовое преобразование и дополнительная цепочка правил. Заголовки выбранных колонок должны быть уникальны без учёта регистра. Порядок меняется drag-and-drop или кнопками вверх/вниз.
Базовые преобразования
| Экспорт | Импорт |
|---|---|
| RAW — без изменений | RAW — без изменений |
| TEXT — только текст без HTML | TRIM — убрать пробелы |
| YES_NO — Да / Нет | UPPER — верхний регистр |
| DATE — дата ДД.ММ.ГГГГ | LOWER — нижний регистр |
| YES_NO — Да/Нет → Y/N |
Цепочки правил
Дополнительные правила выполняются сверху вниз, по одному правилу на строку. Строки, начинающиеся с #, считаются комментариями. Поддерживаются следующие команды:
| Правило | Пример / смысл |
|---|---|
| trim / ltrim / rtrim / upper / lower | Текстовая нормализация. |
| strip_tags / html_decode / spaces | Очистка HTML и нормализация пробелов. |
| yes_no|Y|N | Преобразование логического значения. |
| default|значение | Подставить значение, если ячейка пуста. |
| prefix|... / suffix|... | Добавить префикс или суффикс. |
| replace|старое|новое | Простая замена. |
| map|A=Активен;N=Архив | Сопоставление точных значений. |
| template|{BRAND} {MODEL} — {value} | Шаблон с текущим значением и другими колонками строки. |
| coalesce|COL1|COL2 | Если текущая ячейка пуста, взять первое непустое значение из перечисленных ключей. |
| substr|0|100 | Подстрока. |
| round|2 / multiply|1.2 / divide|100 / number|2|.| | Числовые операции и форматирование. |
| date|Y-m-d | Форматирование даты через strtotime. |
| translit / slug | Транслитерация или URL-подобный slug. |
| split_join|,|||Y | Разбить строку и собрать другим разделителем; Y — удалить дубли. |
8. Экспорт и фильтрация
| Фильтр | Назначение |
|---|---|
| Активность | Для поддерживающих активность сущностей: все, только активные или только неактивные. |
| ID раздела | Для элементов: ограничение одним разделом; можно включить подразделы. |
| ID от / до | Ограничение диапазоном идентификаторов, если применимо к типу профиля. |
| Лимит строк | До 1 000 000 строк; 0 означает отсутствие лимита. |
Запуск экспорта
- Откройте активный профиль с направлением EXPORT или BOTH.
- Настройте экспортируемые колонки, фильтр и формат.
- При необходимости настройте многолистовой режим, XLSX/XLSM-шаблон и каналы доставки.
- Нажмите «Сохранить и запустить экспорт» либо дождитесь расписания.
- После статуса «Готово» скачайте файл в карточке задания и проверьте записи доставки в журнале.
Многолистовой экспорт
| Режим | Поведение |
|---|---|
| Один лист | Обычная книга с одним целевым листом. |
| Разбивать по N строк | Новый лист создаётся после заданного числа строк; предел настройки — 1 000 000 строк на лист. |
| Группировать по колонке | Отдельный лист для каждого значения выбранной экспортной колонки. |
Шаблон XLSX / XLSM
Для XLSX/XLSM можно загрузить существующий шаблон, выбрать лист по номеру или имени, строку заголовков и первую строку данных. Модуль копирует книгу, заполняет выбранный лист, переносит стили и формулы строки-шаблона. Относительные ссылки формул сдвигаются, абсолютные ссылки с $ сохраняются. Формулы ниже расширяемого блока также сдвигаются. Для XLSM нужен именно .xlsm-шаблон, чтобы сохранить VBA-пакет.
Автоматическая доставка
| Канал | Особенности |
|---|---|
| FTP / FTPS | URI назначения + отдельные логин/пароль; поддерживаются ftp:// и ftps://. |
| HTTP / HTTPS | POST multipart или PUT body; Bearer token разрешён только для HTTPS. |
| Google Drive | OAuth refresh token и загрузка в указанную папку. |
| Google Sheets | Создать новую таблицу или обновить существующий Spreadsheet с сохранением его ID. |
| Один или несколько получателей, тема и текст; доступны #PROFILE_NAME#, #PROFILE_ID#, #FILE_NAME#. |
Для основного элементного экспорта перед записью строки вызывается событие OnBeforeExportRow; обработчик может изменить строку или вернуть false, чтобы её исключить.
9. Импорт и стратегии обработки
Входные столбцы сопоставляются по заголовкам профиля. Порядок колонок в файле не важен, лишние колонки игнорируются, а при включённом создании схемы явно размеченные неизвестные заголовки могут создать новое свойство/UF.
Ключ поиска
Ключ может состоять из одной или нескольких импортируемых keyable-колонок. Для элементов это ID/XML_ID/CODE/NAME и одиночные нефайловые свойства; для других типов доступность ключей определяется каталогом колонок. Все части составного ключа должны быть заполнены.
| Ситуация | Варианты |
|---|---|
| Объект найден | Обновить, пропустить или ошибка. |
| Объект не найден | Создать, пропустить или ошибка. |
| Ключ повторяется в файле | Ошибка, первая строка или последняя строка. |
| Объект отсутствует в файле | KEEP; для элементов/разделов — DEACTIVATE или DELETE; для HL — DELETE; для скидок и наборов массовое действие отсутствующих отключено. |
Торговые предложения SKU
Если выбран инфоблок товаров с настроенным инфоблоком предложений, одна строка может одновременно создать/обновить товар и одно SKU. Для SKU выбирается собственный составной ключ и отдельные стратегии «найден / не найден». Поддерживаются поля, свойства, каталог, цены, валюты и остатки складов. Для нескольких предложений одного товара используйте отдельную строку на каждое предложение. Скрытая перепривязка существующего SKU к другому товару блокируется.
Разделы и списки
- SECTION_PATHS может разрешать путь и при включённой опции создавать отсутствующую иерархию разделов.
- В самостоятельном профиле разделов PARENT_PATH может создать отсутствующий родительский путь.
- Для элементного профиля можно автоматически создавать новые значения существующих свойств типа «Список».
Создание свойств и UF из заголовков
Включите «Создавать свойства / UF из заголовков». Обычный неизвестный заголовок не меняет схему — новое поле создаётся только по явному префиксу.
PROPERTY:BRAND
PROPERTY:COLOR{type=L;name=Цвет;multiple=N;sort=500;values=Красный|Синий|Белый}
SKU:PROPERTY:SIZE{type=L;name=Размер;values=S|M|L|XL}
UF_VENDOR{type=string;name=Поставщик;multiple=N;required=N}
UF_STATUS{type=enumeration;name=Статус;values=Новый|Активный|Архив}Для свойств инфоблока поддерживаются типы S, N, L, F, E, G. Для UF: string, integer, double, boolean, date, datetime, enumeration, file. Созданные свойства, UF и значения списков записываются в rollback-журнал, если он включён.
Безопасный запуск
- Создайте резервную копию базы данных.
- Включите «Тестовый импорт — без записи изменений».
- Запустите файл или источник и проверьте счётчики/журнал.
- Исправьте данные, преобразования, ключи и стратегии.
- Отключите dry-run; оставьте включённым rollback-журнал.
- Запустите реальный импорт и проверьте результат до включения расписания.
10. Форматы значения файлов и изображений
| Формат | Особенности |
|---|---|
| XLSX | OOXML ZIP; многолистовой импорт/экспорт; чтение через потоковый механизм. |
| XLSM | Импортируется как OOXML. Экспорт требует .xlsm-шаблон и сохраняет VBA-пакет шаблона. |
| XLS | XML Spreadsheet 2003 читается напрямую; старый бинарный BIFF при импорте конвертируется локальным LibreOffice/soffice. Экспорт создаётся как Excel 2003 XML SpreadsheetML с расширением .xls. |
| CSV | UTF-8; разделитель: точка с запятой, запятая или табуляция. |
| Google Sheets | Источник выгружается Google Drive API в XLSX и проходит тот же многолистовой движок; назначение формируется как нативный Spreadsheet. |
Листы и строки
Для XLSX/XLSM/XLS-импорта можно указать * (все листы), список 1,3,5 или диапазоны 1-3,5-7. Заголовок определяется заново на каждом выбранном листе. Также задаются явная строка заголовков и первая строка данных; значение 0 включает автоматический режим.
Источники импорта
| Источник | Настройки и поведение |
|---|---|
| UPLOAD | Ручная загрузка файла в карточке профиля. |
| REMOTE | HTTP/HTTPS/FTP/FTPS URI, отдельные логин/пароль, лимит файла до 2048 МБ (по умолчанию 200 МБ). Credentials в URI запрещены. |
| IMAP host/port, SSL или STARTTLS, папка, логин/пароль, фильтр отправителя/темы, только непрочитанные, лимит вложения до 2048 МБ (по умолчанию 100 МБ). Выбирается подходящее вложение с расширением формата профиля. | |
| GOOGLE_SHEETS | Spreadsheet ID + OAuth Client ID/Secret/Refresh Token; вся книга импортируется через XLSX. |
Множественные значения
Множественные значения объединяются и разбираются по разделителю профиля, по умолчанию |. Выберите символ, который не встречается внутри отдельных значений. Для наборов/комплектов тот же разделитель используется для ITEM_IDS, QUANTITIES и SORTS.
Файлы и изображения
- При импорте файловых значений принимается существующий ID файла Битрикс или локальный путь внутри /upload/.
- HTTP(S)-URL изображения разрешён только при включённой опции «Разрешить внешние изображения».
- Допустимы JPEG, PNG, GIF и WebP; SVG из внешнего источника не принимается.
- По умолчанию максимальный размер внешнего изображения — 10 МБ, лимит пикселей — 40 000 000; значения настраиваются в профиле.
- Можно задать allowlist хостов. Пустой список разрешает любой публичный HTTP(S)-хост, прошедший SSRF-проверки.
- Пустая ячейка для файлового поля удаляет текущее файловое значение там, где сущность поддерживает такую операцию.
11. Задания прогресс и журнал
| Статус | Смысл |
|---|---|
| В очереди | Задание создано и ожидает агента или ручного запуска. |
| Выполняется | Импорт, экспорт или rollback обрабатывается. |
| Готово | Операция завершена; для экспорта доступен файл результата. |
| Ошибка | Выполнение остановлено из-за исключения, ошибки источника/доставки или ограничения. |
| Отменено | Пользователь отменил ещё не начавшееся задание. |
Карточка задания показывает обработанные, созданные, обновлённые, пропущенные записи и ошибки. Журнал выводит до 500 последних событий в обратном порядке с уровнем, номером строки, ID сущности и сообщением.
- Задание в очереди можно выполнить немедленно или отменить.
- Экспортный файл и исходный импортный файл скачиваются через административную страницу после проверки прав.
- После экспорта в журнал попадают успешные каналы автоматической доставки.
- Для импорта с включённым rollback создаётся серверный журнал обратных действий.
Откат импорта
Если в профиле включено «Записывать журнал отката импорта» и импорт выполнялся не в dry-run, для завершённого задания со статусом «Готово» или «Ошибка» может быть доступна команда «Откатить импорт». Откат ставится в очередь как отдельное задание типа ROLLBACK.
- Откат покрывает поддерживаемые изменения элементов, свойств, привязок разделов, каталога, цен и складов.
- Поддерживается откат созданных элементов/SKU, разделов/SEO, Highload-записей, созданных свойств/UF/значений списков, скидок и наборов/комплектов.
- Два одновременных rollback-задания для одного импорта блокируются.
- После полностью успешного rollback его журнал удаляется; повторно применить тот же откат нельзя.
12. Очередь агент и хранение
При установке регистрируется агент \Bussol\IblockExcel\Service\Agent::run(); с интервалом 60 секунд. За один проход агент восстанавливает зависшие задания, проверяет расписание, выполняет самое раннее задание очереди и очищает часть старых записей.
- Задания RUNNING старше двух часов помечаются ошибкой «Выполнение прервано или превысило 2 часа».
- Планировщик использует lock-файл и не ставит один и тот же профиль/операцию повторно, если уже есть QUEUED/RUNNING задание.
- За один проход ScheduleService ставит не более 5 плановых заданий.
- Агент выполняет одно самое раннее задание очереди за проход.
- За один проход очищается до 20 старых DONE/ERROR/CANCELLED заданий вместе с файлом, журналом и rollback-журналом.
Режимы расписания
| Режим | Настройка |
|---|---|
| Интервал | Каждые 5–10080 минут. |
| Ежедневно | Один запуск после указанного времени в каждый календарный день. |
| По дням недели | Выбранные дни недели + время запуска. |
Плановый импорт использует REMOTE, EMAIL или GOOGLE_SHEETS, выбранный в профиле. Плановый экспорт может после создания файла выполнить все включённые каналы доставки.
Файловое хранение
| Путь | Назначение |
|---|---|
| /upload/bussol.iblockexcel/jobs | Файлы заданий импорта/экспорта. |
| /upload/bussol.iblockexcel/templates | Загруженные XLSX/XLSM-шаблоны профилей. |
| /upload/bussol.iblockexcel/rollback | Rollback-журналы импорта. |
| /upload/bussol.iblockexcel/schedule.lock | Локальная блокировка прохода планировщика. |
13. Безопасность
| Контроль | Реализация |
|---|---|
| Права | Административные страницы проверяют R/W; администратор получает W. |
| CSRF | Изменение профилей, запуск, отмена, удаление и rollback защищаются bitrix_sessid. |
| Пути файлов задания | Нормализуются, обязаны находиться внутри /upload/bussol.iblockexcel/jobs и не могут содержать последовательность .. |
| Транзакции | Изменение одной строки импорта выполняется транзакционно там, где это поддерживает обработчик. |
| REMOTE HTTP(S) | Проверка схемы, DNS/IP, запрет private/reserved/loopback/link-local, повторная проверка редиректов, блокировка HTTPS→HTTP downgrade и ограничение размера. |
| REMOTE FTP/FTPS | Логин/пароль задаются отдельно; FTPS не должен незаметно переходить на незашифрованный FTP. |
| HTTP-доставка | Bearer token разрешён только для HTTPS и не должен передаваться на другой host при redirect. |
| Email source | Host проходит DNS/IP-проверку; private/reserved адреса блокируются. |
| Внешние изображения | SSRF-проверки + allowlist, MIME, геометрия, размер; только JPEG/PNG/GIF/WebP. |
| Преобразования | Белый список встроенных команд; eval и произвольный PHP отсутствуют. |
| Создание схемы | Только по явным PROPERTY:/SKU:PROPERTY:/UF_ заголовкам; неизвестный обычный заголовок сам ничего не создаёт. |
| Ошибки | Импорт останавливается после глобально настроенного числа ошибок. |
- Выдавайте W только доверенным администраторам и контент-менеджерам.
- При необходимости глобально отключайте REMOTE и EMAIL источники в настройках модуля.
- Для поставщиков с изображениями используйте allowlist доменов.
- Не помещайте пароли в HTTP/FTP URI; используйте отдельные поля профиля.
- Перед включением DELETE/DEACTIVATE, автосоздания схемы и расписания выполните dry-run и backup.
14. Расширение разработчиком
Модуль использует стандартный механизм событий Битрикс для module ID bussol.iblockexcel. В версии 1.6.0 публичные события сохранили сигнатуры предыдущих версий.
Перед экспортом строки элемента/товара
OnBeforeExportRow(array &$row, array $elementFields, array $profile): bool|nullСобытие вызывается основным ExportService для профиля элементов/товаров. Обработчик может изменить row по ссылке. Возврат false исключает строку из файла.
Перед импортом строки
OnBeforeImportRow(array &$valuesByKey, int $rowNumber, array $profile): bool|nullСобытие вызывается при импорте элементов/товаров, разделов и Highload-блоков. Обработчик может нормализовать значения по ссылке; false пропускает строку. Профили скидок и наборов/комплектов используют отдельные сервисы и это событие не вызывают.
15. Хранение данных и структура модуля
| Таблица | Содержимое |
|---|---|
| b_bussol_ibx_profile | Профиль: тип сущности, направление, формат, JSON столбцов, фильтра и SETTINGS_JSON. |
| b_bussol_ibx_job | Тип (IMPORT/EXPORT/ROLLBACK), статус, файл, прогресс, счётчики, STATE_JSON и время выполнения. |
| b_bussol_ibx_log | Построчный журнал; поле ROW_INDEX совместимо с MySQL 8. |
В 1.6.0 схема таблиц не меняется по сравнению с предыдущими версиями: новые функции сохраняют параметры внутри существующего SETTINGS_JSON.
| Каталог / файл | Назначение |
|---|---|
| admin/ | Профили, задания, карточка задания, UI и административные ресурсы. |
| lib/Service/ImportService.php / ExportService.php | Основной элементный обмен и генерация SKU. |
| lib/Service/Section* | Разделы, иерархия и SEO. |
| lib/Service/Highload* | Highload-профили. |
| lib/Service/Discount* | Скидки / правила корзины. |
| lib/Service/ProductSet* | Наборы и комплекты. |
| lib/Service/RemoteSourceService.php / EmailSourceService.php / GoogleApiService.php | Удалённые и облачные источники. |
| lib/Service/DeliveryService.php | FTP/HTTP/Google/email доставка результата экспорта. |
| lib/Service/ScheduleService.php | Расписание и защита от дублирующих плановых запусков. |
| lib/Service/RollbackService.php | Файловый журнал обратных действий и откат импорта. |
| lib/Service/SchemaProvisionService.php | Создание свойств и UF по заголовкам файла. |
| lib/Service/ColumnTransformService.php | Цепочки безопасных преобразований. |
| lib/Spreadsheet/ | Чтение/запись CSV, XLS, XLSX/XLSM и шаблонный writer. |
| lib/Model/ | D7 ORM-модели таблиц. |
| install/ | Установщик, SQL, admin proxy, тема и иконки. |
16. Ограничения и совместимость
- DataBridge не создаёт сами инфоблоки и Highload-блоки; создание схемы ограничено свойствами инфоблока, свойствами SKU и UF-полями существующих сущностей.
- Автосоздание свойств инфоблока поддерживает типы S/N/L/F/E/G; UF — string/integer/double/boolean/date/datetime/enumeration/file.
- Профиль скидок поддерживает безопасно ограниченный набор правил; произвольные сложные деревья условий/действий Битрикс из строкового кода не генерируются.
- Для набора/комплекта, если у владельца есть несколько наборов одного типа, для однозначного обновления нужен SET_ID.
- Экспорт XLSM требует существующего .xlsm-шаблона; без него профиль с экспортом XLSM не сохраняется.
- Шаблонизированный XLSX/XLSM заполняет один целевой лист; многолистовое разбиение применяется обычному экспорту.
- Импорт бинарного BIFF .xls требует локального LibreOffice/soffice; SpreadsheetML 2003 .xls читается напрямую.
- Google Sheets/Drive требуют OAuth Client ID, Client Secret, Refresh Token и исходящий доступ к Google API.
- Email-источник требует PHP imap, FTP/FTPS — PHP ftp.
- Внешние URL принимаются только для растровых изображений JPEG/PNG/GIF/WebP и только при включённой опции; SVG запрещён.
- Формулы при обычном импорте не пересчитываются модулем как Excel-приложением; шаблонный экспорт переносит формулы и включает полный пересчёт книги при открытии.
- Rollback восстанавливает только изменения, которые записал DataBridge; это не транзакция всей базы и не замена backup.
- Стратегия «Последняя строка» и массовая обработка отсутствующих объектов требуют памяти пропорционально числу уникальных ключей.
- Очень большие обмены необходимо тестировать с реальными лимитами PHP, базы, диска, почты и внешних API.
Для пользовательских типов свойств, нестандартных обработчиков, сложных скидок, больших файлов поставщиков и нестандартной складской логики проводите отдельную приёмку на копии проекта.
17. Диагностика
| Симптом | Что проверить |
|---|---|
| Модуль не виден в меню | Модуль зарегистрирован, обработчик OnBuildGlobalMenu активен, admin/theme-файлы обновлены, кеш Битрикс очищен. |
| Профиль не запускается | Профиль активен, направление разрешает операцию, у пользователя право W, выбран хотя бы один столбец нужного направления. |
| Импорт файла отклонён | Расширение совпадает с FORMAT профиля, файл не пуст, структура XLSX/XLSM/XLS валидна. |
| REMOTE импорт отключён | Проверьте глобальную настройку «Разрешить импорт из HTTP/FTP URI», публичность DNS/IP, схему URI, лимит размера и credentials. |
| Email-источник не находит вложение | Установлен php-imap; host/port/security, папка, логин/пароль, FROM/SUBJECT/UNSEEN фильтры; расширение вложения совпадает с форматом профиля. |
| Google Sheets не работает | Проверьте Client ID/Secret/Refresh Token, Spreadsheet ID, сетевой доступ к Google API и права OAuth. |
| Бинарный XLS не импортируется | LibreOffice/soffice установлен и доступен веб-процессу; либо используйте XLSX/SpreadsheetML. |
| XLSM не экспортируется | Загружен .xlsm-шаблон и выбран режим экспорта «Один лист». |
| Свойство/UF не создаётся | Включено автосоздание схемы; заголовок явно начинается с PROPERTY:, SKU:PROPERTY: или UF_; тип поддерживается. |
| SKU не создаётся | Установлен catalog, инфоблок товаров связан с инфоблоком предложений, SKU-колонки включены в импорт, выбран непустой SKU-ключ. |
| Внешнее изображение отклонено | Опция включена; host попадает в allowlist (если задан); адрес публичный; MIME JPEG/PNG/GIF/WebP; соблюдены лимиты размера и пикселей. |
| Доставка экспорта завершилась ошибкой | Проверьте URI/URL, credentials, Bearer только с HTTPS, OAuth Google, email получателей и доступ внешней системы. |
| Rollback недоступен | Он был включён до реального импорта, dry-run был выключен, журнал ещё не очищен и не был успешно применён ранее. |
| Задание остаётся в очереди | Работают агенты/cron; для проверки используйте «Выполнить сейчас». |
| Слишком много ошибок | Откройте построчный журнал; проверьте ключи, заголовки, преобразования, обязательные поля и MAX_ERRORS. |
18. Чек-лист приёмки
- Есть актуальная резервная копия файлов и базы данных.
- Проверены PHP 8.1+, mbstring/zip/XMLReader/SimpleXML и дополнительные imap/ftp/LibreOffice по используемым сценариям.
- Проверены iblock и необходимые catalog/sale/highloadblock.
- Веб-процесс может записывать /upload/bussol.iblockexcel и системный temp.
- Модуль отображается в меню BUSSOL; права D/R/W проверены на тестовых группах.
- Глобальные REMOTE/EMAIL-переключатели соответствуют политике проекта.
- Создан тестовый профиль нужного типа; заголовки уникальны, выбранные колонки и порядок корректны.
- Экспорт выбранных XLSX/XLSM/XLS/CSV открывается ожидаемым приложением; многолистовой режим проверен при использовании.
- Если используется XLSX/XLSM-шаблон — проверены стили, формулы, целевой лист и сохранение макросов XLSM.
- Dry-run формирует ожидаемые счётчики и журнал без изменения данных.
- Реальный импорт проверен на создании, обновлении, пропуске и ошибке.
- Составные ключи и стратегия дублей проверены отдельными тестовыми строками.
- SKU проверены на создании/обновлении, ценах и остатках складов.
- Разделы/SEO и HL-профили проверены, если используются.
- Создание PROPERTY:/SKU:PROPERTY:/UF_ проверено на тестовой схеме.
- Удаление/деактивация отсутствующих объектов проверены только в ограниченной тестовой области.
- Внешние изображения проверены на допустимом и запрещённом host/MIME/размере.
- REMOTE/IMAP/Google Sheets источники проверены вручную до включения расписания.
- FTP/HTTP/Google/email доставка экспорта проверена для каждого включённого назначения.
- Планировщик проверен в выбранном режиме; нет дублирующих QUEUED/RUNNING заданий.
- Rollback проверен на тестовом реальном импорте; команда создаёт отдельное задание и восстанавливает ожидаемые изменения.
- Агент обрабатывает очередь, помечает зависшие задания и очищает старые данные в соответствии с retention.
- Сценарии аварийного восстановления, backup и ответственность за внешние интеграции задокументированы для проекта.