Перейти к содержимому
N1
CRM / Bitrix24 · Диск · восстановление данных

Восстановление документов дел: «в сделках пропадают файлы»

Клиент: Юридическая компания, NDA Категория: CRM / Bitrix24 Стек: PHP 8, Bitrix24 D7 (Disk, CRM Factory), CLI, Bash-пайплайн, cron Срок: около недели
Проблема

Юристы жаловались, что из дел пропадают документы. Причина нашлась в роботах трёх смарт-процессов: каждый называл папку дела на Общем диске по-своему, а при переименовании дела создавал новую — старая папка с документами оставалась без ссылки из карточки.

Ограничения

Удалять нельзя ничего: это рабочие документы по судебным делам. Часть ссылок шла через внешний сокращатель или вела на старый портал, у части дел свои контейнеры папок, а спорные совпадения можно решать только вместе с юристами.

Что сделал
  • Разведка только на чтение: пул папок, классификация каждой ссылки из карточек (рабочая, через сокращатель, старый портал, пустая, мусор), папки-сироты
  • Слияние папок-дубликатов с приоритетом корневого дела: содержимое переносится в каноническую папку, источники не удаляются, подозрительные группы — на ручной разбор
  • Синхронизация файлов из файловых полей карточки в папку дела без дублей по имени и размеру, починка ссылок и дозаполнение служебного поля с id папки
  • Пересоздание недостающих папок для дел, у которых рабочей папки на диске не было вообще
  • Итоговый пайплайн одной командой: по умолчанию три dry-run, боевой прогон — только с подтверждением, остановка на первой ошибке; ночной синк по cron
Архитектура
Разведка (read-only) → Слияние дубликатов → Пересоздание папок → Синк файлов и ссылок → Ночной cron
Результат

Разведка нашла 334 папки, 16 групп дубликатов и 298 исправимых ссылок через сокращатель. Боевой прогон обработал 750 элементов: скопировано 2544 файла, починено 302 ссылки, заполнено 250 id папок — 0 ошибок; повторная проверка подтвердила 7182 файла на своих местах по 780 элементам.

Что можно переиспользовать
Разведка «только чтение» с классификацией ссылок перед любыми правками Слияние папок-дубликатов без удаления источников Пайплайн dry-run → подтверждение → боевой прогон