Как удалить сотни тысяч документов в 1С:Бухгалтерия 3.0 после свертки базы

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

Свёртка информационной базы — трудоемкая процедура, которая при многократном повторении способна создать больше проблем, чем решить. Типичная ситуация: после последовательных ежегодных свёрток в конфигурации 1С:Бухгалтерия предприятия 3.0 накапливаются сотни тысяч помеченных на удаление документов (реализации, счета-фактуры и др.). При попытке очистить базу типовая обработка Удаление помеченных объектов намертво зависает, либо выдает ошибки ссылочной целостности, указывая на документы ввода остатков и служебные регистры.

Разберем подробно, почему возникает эта проблема, на что влияет регистр сведений ЖурналУчетаСчетовФактур и какими способами можно безопасно и быстро очистить информационную базу.

Почему зависает стандартное удаление помеченных объектов

Выясним причину технического сбоя. Когда типовой механизм пытается удалить массив из 100 000 – 200 000 объектов, происходят следующие процессы:

  1. Поиск ссылок по всей базе: Платформа 1С выполняет полное сканирование всех метаданных в поисках ссылок на удаляемые документы. Построение дерева связей для сотен тысяч объектов в оперативной памяти приводит к критическому переполнению памяти рабочего процесса rphost или системного пространства tempdb на стороне СУБД.
  2. Транзакционные ограничения: Удаление такого объема данных в рамках одной общей транзакции мгновенно переполняет журнал транзакций СУБД (LDF в MS SQL Server или WAL в PostgreSQL), приводя к блокировкам таблиц и аварийному откату изменений по таймауту.
  3. Перекрестные ссылки прошлых свёрток: Документы ОперацияБух, созданные при предыдущих свёртках, содержат ссылки на старые счета-фактуры в регистрах или табличных частях, блокируя стандартное удаление.

На что влияет регистр сведений «Журнал учета счетов-фактур»

Проанализируем второй ключевой вопрос: можно ли безболезненно удалять движения по регистру ЖурналУчетаСчетовФактур и сами документы-регистраторы.

Записи этого регистра предназначены для формирования регламентированного отчета «Журнал учета полученных и выставленных счетов-фактур». Рассмотрим влияние регистра на учет:

  1. Для обычных организаций (купля-продажа): С 2015 года плательщики НДС, не являющиеся посредниками, не обязаны вести журнал счетов-фактур. Формирование книг покупок, книг продаж и расчет налога осуществляются по специализированным регистрам накопления (НДС Покупки, НДС Продажи, НДС Раздельный учет) и регистру бухгалтерии (счета 19, 68.02, 76.АВ, 76.ВА). Ввод остатков по регистру ЖурналУчетаСчетовФактур для таких организаций не имеет практического смысла.
  2. Для комиссионеров, агентов и экспедиторов: Если организация ведет посредническую деятельность или функции застройщика, данные регистра напрямую выгружаются в разделы 10–12 декларации по НДС. Удаление записей приведет к искажению отчетности.
  3. Переходящий НДС: Если на дату свёртки есть остаток непредъявленного НДС по счету-фактуре прошлых лет (например, на 19 счете), и вычет переносится на текущий налоговый период, документ-основание и счет-фактура должны оставаться в базе для корректного отражения в книге покупок.

Способ 1. Пакетное (порционное) программное удаление

Если требуется очистить рабочую базу штатным контролем целостности, разработаем алгоритм порционного удаления. Разбиение общего массива на небольшие пакеты (по 500–1000 документов) снимает пиковую нагрузку на оперативную память и СУБД.

Посмотрим на пример программной обработки для пакетного удаления:


МассивДляУдаления = Новый Массив;
РазмерПакета = 500;

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 500
    |   Док.Ссылка КАК Ссылка
    |ИЗ
    |   Документ.РеализацияТоваровУслуг КАК Док
    |ГДЕ
    |   Док.ПометкаУдаления = ИСТИНА";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    МассивДляУдаления.Добавить(Выборка.Ссылка);
КонецЦикла;

Если МассивДляУдаления.Количество() > 0 Тогда
    // Выполняем поиск ссылок и удаление только для текущего пакета
    НайденныеСсылки = НайтиПоСсылкам(МассивДляУдаления);
    
    // Если на объекты нет ссылок, выполняем удаление
    Если НайденныеСсылки.Количество() = 0 Тогда
        УдалитьОбъекты(МассивДляУдаления, Истина);
    КонецЕсли;
КонецЕсли;

Способ 2. Очистка ссылок в документах «ОперацияБух»

Когда документы не удаляются из-за того, что они зафиксированы в регистрах документа Операция, выполним предварительную очистку наборов записей.

Разберем по шагам, как очистить движения в конкретном регистре:


// Очистка набора записей регистра сведений по регистратору
НаборЗаписей = РегистрыСведений.ЖурналУчетаСчетовФактур.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаОперацию);
// Записываем пустой набор (очищаем записи)
НаборЗаписей.Записать(Истина);

После очистки движений ручных операций по регистру сведений счета-фактуры освобождаются от ссылок и могут быть удалены выборочным удалением.

Способ 3. Прямое удаление и тестирование базы на копии

В исключительных случаях, когда ссылки на старые документы находятся исключительно в исторических регистрах сведений, программисты используют прямое удаление через метод Удалить() у объекта ДокументОбъект без контроля ссылочной целостности с последующим запуском Тестирования и исправления (ТиИ).

Важное предупреждение: категорически не рекомендуется выполнять этот способ сразу на рабочей базе. При очистке ссылок через ТиИ бухгалтеры могут не заметить расхождений в специализированных регистрах НДС и НДФЛ при проверке стандартных отчетов (ОСВ, Карточка счета). Выполняйте данную процедуру исключительно на резервной копии с обязательной сдачей контрольного квартала отчетности.

Способ 4. Перенос остатков в чистую базу (рекомендуемый)

Когда база пережила 4–5 последовательных свёрток, ее структура перегружена сотнями тысяч перекрестных ссылок, а таблицы сильно фрагментированы. В таких условиях наиболее надежным и чистым решением является перенос актуальных данных в новую конфигурацию:

  1. Разворачиваем пустую типовую конфигурацию 1С:Бухгалтерия предприятия 3.0 текущего релиза.
  2. С помощью типовой обработки Выгрузка и загрузка данных XML или универсального обмена переносим справочники, учетную политику и актуальные документы ввода остатков на выбранную дату.
  3. Старую базу архивируем и оставляем бухгалтерии в режиме «только для чтения» как исторический архив.

Этот подход гарантирует отсутствие «мусорных» ссылок, битых индексов и обеспечивает максимальную производительность системы.

Обязательные действия после удаления (сжатие базы)

После удаления 230 000 документов физический размер базы автоматически не уменьшится. Чтобы освободить место на диске и восстановить скорость работы, выполним регламентные процедуры:

  1. Для файловой базы: Запускаем конфигуратор и выполняем Администрирование -> Тестирование и исправление с обязательным выбором пункта «Сжатие таблиц информационной базы», либо запускаем утилиту chdbfl.exe.
  2. Для клиент-серверной базы (SQL): Выполняем операцию сжатия базы данных (Shrink Database), усекаем журнал транзакций (LDF), а также запускаем регламентные задания по реиндексации таблиц и обновлению статистик.
← На главную