Как очистить зависшие проводки и движения у документов, помеченных на удаление в 1С

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

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

Особенно остро эта проблема встает, когда таких документов накапливается несколько десятков тысяч, и ручное перепроведение каждого из них физически невозможно. В этой статье мы подробно разберем, почему возникает подобный сбой, проанализируем механизмы работы платформы 1С и рассмотрим несколько эффективных способов решения проблемы — от встроенных интерактивных инструментов до программного кода.

Выясняем причины: почему движения остаются активными?

В штатном режиме работы платформы 1С при установке пометки удаления или отмене проведения документа система автоматически очищает все связанные с ним записи в регистрах. Однако в реальной практике этот механизм может дать сбой по нескольким техническим причинам:

  1. Использование режима загрузки данных при обменах. При синхронизации баз (например, через распределенные информационные базы (РИБ) или сторонние правила конвертации) объектам часто присваивается свойство ОбменДанными.Загрузка = Истина. В этом режиме платформа отключает стандартные проверки и обработчики событий (такие как ПередЗаписью или ПриЗаписи), чтобы ускорить процесс интеграции. В результате признак ПометкаУдаления записывается напрямую в СУБД, а связанные движения в таблицах регистров остаются нетронутыми.
  2. Особенности настройки метаданных в конфигураторе. У некоторых документов свойство «Удаление движений» может иметь значение «Не удалять автоматически» или «Изменять при проведении». Если при этом разработчик конфигурации не предусмотрел жесткую очистку движений при отмене проведения в модуле документа, «хвосты» в регистрах гарантированно останутся.
  3. Документы прямого заполнения движений. К таким документам относятся, например, «ОперацияБух» в 1С:Бухгалтерии или «Перенос данных» в 1С:ЗУП. Они записывают данные непосредственно в таблицы регистров, минуя стандартные цепочки проведения, поэтому простая пометка на удаление без перезаписи наборов данных не всегда приводит к автоматическому очищению проводок.
  4. Битые ссылки в регистраторах. После некорректного удаления документов напрямую из базы (например, сторонними обработками) в регистрах могут остаться записи, ссылающиеся на несуществующие документы с представлением <Объект не найден>.

Давайте пошагово разберем, как исправить эту ситуацию различными методами.

Способ 1. Использование встроенного инструмента «Групповое изменение реквизитов»

Если в вашей конфигурации используется библиотека стандартных подсистем (БСП), вам доступен мощный инструмент для исправления подобных массовых ошибок без написания кода. Нам потребуется запустить обработку ГрупповоеИзменениеРеквизитов.

Рассмотрим этот процесс по шагам:

  1. Перейдем в раздел Администрирование, далее выберем пункт Обслуживание и найдем ссылку Групповое изменение реквизитов (в некоторых конфигурациях доступ к ней можно получить через функции для технического специалиста).
  2. В поле «Выбирать элементы» укажем интересующий нас тип документа, у которого зависли движения.
  3. Нажмем на ссылку «Все элементы» для настройки отбора. Добавим два важных условия:
    • ПометкаУдаления Равно Да
    • Проведен Равно Да (или проверим наличие движений по регистру)
  4. После настройки фильтра нажмем кнопку «ОК», чтобы система отобразила количество найденных документов.
  5. Откроем дополнительные параметры обработки (синяя шестеренка внизу формы) и установим флажок «Выполнять в режиме загрузки данных» (это позволит обойти жесткие контроли, если документы принадлежат закрытым периодам) и убедимся, что активен режим работы с транзакциями.
  6. В списке доступных реквизитов найдем специальное системное действие «Отменить проведение».
  7. Нажмем кнопку «Изменить параметры». Платформа запустит фоновое задание, которое массово отменит проведение у выбранных помеченных документов, корректно очистив все связанные с ними регистры.

Способ 2. Программный метод очистки движений (для разработчиков)

Если стандартная групповая обработка по каким-то причинам не справляется или вам требуется автоматизировать этот процесс, лучшим решением будет написание небольшой обработки. Логика работы платформы 1С такова: чтобы удалить движения документа по регистру, необходимо записать по этому регистратору пустой набор записей.

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


Процедура ОчиститьДвиженияДокумента(ДокументСсылка) Экспорт

    // Проверяем, что документ действительно помечен на удаление
    Если Не ДокументСсылка.ПометкаУдаления Тогда
        Возврат;
    КонецЕсли;

    // 1. Очищаем движения в регистрах накопления
    Для Каждого Регистр Из Метаданные.РегистрыНакопления Цикл
        Набор = Регистры[Регистр.Имя].СоздатьНаборЗаписей();
        Набор.Отбор.Регистратор.Установить(ДокументСсылка);
        Если Набор.Выбрать().Количество() > 0 Тогда
            Набор.Записать(); // Запись пустого набора удаляет движения из СУБД
        КонецЕсли;
    КонецЦикла;

    // 2. Очищаем движения в регистрах бухгалтерии (проводки)
    Для Каждого Регистр Из Метаданные.РегистрыБухгалтерии Цикл
        Набор = Регистры[Регистр.Имя].СоздатьНаборЗаписей();
        Набор.Отбор.Регистратор.Установить(ДокументСсылка);
        Если Набор.Выбрать().Количество() > 0 Тогда
            Набор.Записать();
        КонецЕсли;
    КонецЦикла;

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

КонецПроцедуры

Если в вашей конфигурации внедрена БСП, задача упрощается еще сильнее. Разработчики библиотеки уже предусмотрели готовые процедуры оптимизации. Мы можем использовать стандартный метод из общего модуля:

ОбменДаннымиСервер.УдалитьДвиженияУДокумента(ДокументСсылка)

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

Способ 3. Тестирование и исправление (ТиИ) при физическом отсутствии документов

Иногда возникает ситуация, когда сам документ-регистратор был физически удален из базы данных (например, при непосредственном удалении без контроля ссылочной целостности), а записи в таблицах регистров остались. В таком случае в полях регистратор отображается битая ссылка вида <Объект не найден>.... Программные методы выше не сработают, так как у нас нет валидной объектной ссылки для передачи в отбор.

Для исправления этой проблемы проанализируем возможности утилиты «Тестирование и исправление информационной базы»:

  1. Перед началом любых работ в конфигураторе обязательно создайте резервную копию (бэкап) вашей базы данных!
  2. Запустите базу данных в режиме Конфигуратор.
  3. Откройте меню Администрирование и выберите пункт Тестирование и исправление....
  4. В открывшемся окне настроек отметьте флажками следующие обязательные проверки:
    • Проверка логической целостности
    • Проверка ссылочной целостности
  5. В нижней части окна в группе переключателей «При наличии ссылок на несуществующие объекты» выберите вариант «Очищать ссылки» или «Удалять объект» (для записей регистров это приведет к полному удалению записей, ссылающихся на несуществующие документы).
  6. Нажмите кнопку «Выполнить» и дождитесь окончания процесса. Платформа просканирует все таблицы базы данных и полностью вычистит любые записи регистров, потерявшие своего родителя-регистратора.

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

← На главную