Исходная ситуация
Операционная база крупной сети ломбардов накопила ~10 лет истории: 46+ млн документов, крупнейшие таблицы по 300-430 млн строк, файл данных 2,3 ТБ на MS SQL Server 2019 Enterprise. Бэкап и восстановление занимали часы, тестовые контуры стало практически невозможно разворачивать, обслуживание перестало помещаться в технологические окна, а дисковые ресурсы подошли к пределу - дальше только закупка СХД.
Ключевое ограничение, из-за которого типовая свертка не подходила: договор залога живёт годами. Договор, открытый много лет назад и до сих пор действующий, обязан сохраниться полностью - сам документ, пролонгации, частичные гашения, начисления процентов, кассовые документы и вся история движений. При этом прямого признака “активности” договора в данных нет - его пришлось конструировать.
Почему это нетривиально
- Масштаб. Контрольный замер удаления штатными средствами показал: только каскад занял бы месяцы.
- Критерий активности. Признак “действующий договор” собирался из трёх независимых источников (остатки задолженности, операционные регистры, срез состояний) - вышло ~296 тыс. защищаемых договоров из 46 млн документов. Ошибка в любую сторону недопустима.
- Ссылочная целостность. 8 500+ ссылочных колонок в схеме: наивное удаление гарантированно оставляет битые ссылки, которые всплывают в отчётах месяцами.
- Живой контур. Интеграции, отложенное проведение и обмены во время свертки способны “дописать” данные и развалить сверку - контур замораживался на окно.
Решение: гибрид “логика в 1С - массовые операции в SQL”
Бизнес-логика (расчёт защищаемого множества, генерация документов ввода остатков, бухгалтерская свертка) выполнялась кодом 1С - корректно с точки зрения платформы. Массовые операции (удаление сотен миллионов строк, пересчёт итогов) - оптимизированным T-SQL с верификацией против эталонных механизмов 1С.
Основные этапы:
- Аудит: классификация всех регистров, разбор аномалий (найдены “фантомные” договоры - след давнего бага проведения), автоматическая валидация бухучёта по 78 тыс. проблемных договоров - баланс сошёлся в ноль у 100 %.
- Расчёт защиты: ~1,5 млн “меток защиты” - активные договоры плюс все связанные документы транзитивно, включая цепочки перезалогов.
- Срез остатков: идемпотентный генератор документов-носителей по всем регистрам - повторный запуск не задваивает срез.
- Жёсткие пред-чеки: автоматика сверяет срез с остатками учёта по каждому регистру; расхождение - стоп.
- Массовый каскад: 4 параллельных потока; ключевая техника - table swap (выжившие данные переносятся в новую таблицу с пересозданием индексов - в 5-9 раз быстрее DELETE). Итог: ~1,4 млрд строк за ~2 часа.
- Пересчёт итогов напрямую в SQL - в 5 раз быстрее платформенного, с побитовой сверкой против эталона.
- Онлайн-хвост: некритичные зачистки выполнялись уже на работающей базе - чанками с автотроттлингом (контроль журнала транзакций, блокировок и места; при превышении порогов процесс сам приостанавливается).
Контроль качества: три гейта приёмки
| Гейт | Что проверяет |
|---|---|
| Гейт 1 | Остатки на дату среза “до” == “после” бит-в-бит: операционные регистры + бухгалтерия + бизнес-метрики |
| Гейт 2 | Целостность цепочек перезалогов: ни одна ссылка истории не потеряна |
| Гейт 3 | Полный скан базы на битые ссылки: 0 нарушений |
Все три гейта на продуктиве - зелёные с первого прогона.
Надёжность исполнения
- 7+ полных репетиций на копии продуктива; каждая ускоряла пайплайн (каскад: 10 ч → 2 ч; пересчёт итогов: 112 → 21 мин).
- Отказоустойчивый оркестратор собственной разработки: 22 фазы по графу зависимостей, heartbeat-контроль, возобновление с любой точки. Финальные прогоны - без единого аварийного рестарта.
- Идемпотентность каждого шага и числовые гейты перед необратимыми фазами.
- Точки отката перед каждой деструктивной фазой; аудит потребителей данных - включая автоматический разбор кода всех 204 внешних обработок заказчика.
Итог
Одно ночное окно (~5 часов простоя), учёт сошёлся копейка в копейку, все активные договоры сохранены с полной историей. Восстановление тестовых контуров теперь занимает минуты вместо часов. Сотрудничество с заказчиком продолжается и после проекта.
Методика тиражируема: она применима к базам 1С любых конфигураций объёмом от сотен гигабайт - там, где типовые механизмы свертки не укладываются в окна простоя или не дают требуемых гарантий сохранности. Прикинуть эффект на своей базе можно до разговора с подрядчиком: Калькулятор свёртки базы 1С за 15-45 минут считает по статистике СУБД, сколько занимают старые периоды и что ещё раздувает базу. А если в вашей базе нет долгоживущих объектов вроде договоров залога и граница честно проходит по дате, проект может оказаться лишним: где справляется купленная обработка свертки 1С, разобрали отдельно.
Полный технический разбор методики - с псевдокодом критерия активности, схемой table swap и деталями всех трёх гейтов приёмки - опубликован в нашей статье на Инфостарте: “Свертка базы 2,3 ТБ за одно ночное окно: методика, когда типовая обработка бессильна”.