Налаштування версіонування медіафайлів 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Налаштування версіонування медіафайлів 1С-Бітрікс
Проста
~1 робочий день
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Налаштування версіонування медіафайлів 1С-Бітрікс

Версіонування медіафайлів — можливість зберігати історію змін файлу, відкочуватись до попередньої версії та відстежувати, хто і коли вносив правки. У Бітрікс такий механізм не вбудований у модуль fileman за замовчуванням. З коробки при перезапису файлу стара версія безповоротно видаляється.

Як влаштоване зберігання файлів у Бітрікс

Усі файли реєструються в таблиці b_file. При «оновленні» файлу через стандартний інтерфейс Бітрікс створює новий запис у b_file з новим ID, а старий файл фізично видаляється з диска через CFile::Delete(). Посилання на старий FILE_ID в інших таблицях оновлюються по ланцюжку — цим і пояснюється відсутність історії.

Архітектура версіонування

Для версіонування потрібна додаткова таблиця історії:

CREATE TABLE bl_file_versions (
    id           INT AUTO_INCREMENT PRIMARY KEY,
    medialib_id  INT NOT NULL,          -- ID елемента b_medialib_item
    file_id      INT NOT NULL,          -- ID у b_file (стара версія)
    version      INT NOT NULL DEFAULT 1,
    created_by   INT NOT NULL,          -- b_user.ID
    created_at   DATETIME NOT NULL,
    comment      VARCHAR(500),
    INDEX idx_medialib (medialib_id, version)
);

Логіка: при кожному оновленні файлу в медіабібліотеці не видаляємо старий запис з b_file і фізичний файл, а записуємо його FILE_ID у bl_file_versions. Поточна версія залишається в b_medialib_item.FILE_ID, усі попередні — в таблиці історії.

Перехоплення події оновлення

Обробник події реєструється в init.php або в модулі:

AddEventHandler('fileman', 'OnMedialibItemUpdate', 'SaveFileVersion');

function SaveFileVersion(int $itemId, array $oldFields): void {
    if (empty($oldFields['FILE_ID'])) return;

    global $USER;
    $DB->Query("INSERT INTO bl_file_versions
        (medialib_id, file_id, version, created_by, created_at)
        SELECT " . intval($itemId) . ", " . intval($oldFields['FILE_ID']) . ",
               COALESCE(MAX(version), 0) + 1, " . (int)$USER->GetID() . ", NOW()
        FROM bl_file_versions WHERE medialib_id = " . intval($itemId));
}

Подія OnMedialibItemUpdate спрацьовує до запису нових даних, що дозволяє зберегти FILE_ID старої версії.

Зберігання фізичних файлів версій

Файли версій зберігаються в /upload/fileman/versions/{item_id}/v{N}/. При відкаті створюється новий запис у b_file, а шлях до файлу відновлюється. Фізичне видалення старих версій відбувається тільки при явному «Очистити історію» — не автоматично.

Для економії дискового простору можна зберігати лише останні N версій. Агент раз на добу перевіряє таблицю bl_file_versions і видаляє версії старші за поріг:

$maxVersions = COption::GetOptionInt('mymodule', 'max_file_versions', 10);

Інтерфейс перегляду та відкату

В адміністративному інтерфейсі медіабібліотеки додається кнопка «Історія версій», що відкриває список з датою, автором і кнопкою «Відновити». Відкат — це створення нового b_file на основі файлу версії та оновлення b_medialib_item.FILE_ID.

Операція Метод
Зберегти версію подія OnMedialibItemUpdate
Отримати історію SELECT з bl_file_versions
Відкатити версію CMedialibItem::Update() + CFile::MakeFileArray()
Видалити версію CFile::Delete() + DELETE з bl_file_versions

Що входить у налаштування

  • Створення таблиці bl_file_versions та індексів
  • Написання обробника події OnMedialibItemUpdate
  • Налаштування зберігання фізичних файлів версій
  • Адміністративний інтерфейс перегляду історії та відкату
  • Агент для очищення старих версій за налаштованим лімітом