В процессе администрирования и поддержки баз данных на платформе 1С предприятия специалисты часто сталкиваются со следующей проблемой: документ визуально помечен на удаление или не проведен, однако его движения по регистрам накопления, сведений или бухгалтерии продолжают оставаться активными. В результате эти «зависшие» проводки искажают отчетность, влияют на расчеты остатков, себестоимости и взаиморасчетов, создавая серьезный хаос в учете.
Особенно остро эта проблема встает, когда таких документов накапливается несколько десятков тысяч, и ручное перепроведение каждого из них физически невозможно. В этой статье мы подробно разберем, почему возникает подобный сбой, проанализируем механизмы работы платформы 1С и рассмотрим несколько эффективных способов решения проблемы — от встроенных интерактивных инструментов до программного кода.
В штатном режиме работы платформы 1С при установке пометки удаления или отмене проведения документа система автоматически очищает все связанные с ним записи в регистрах. Однако в реальной практике этот механизм может дать сбой по нескольким техническим причинам:
ОбменДанными.Загрузка = Истина. В этом режиме платформа отключает стандартные проверки и обработчики событий (такие как ПередЗаписью или ПриЗаписи), чтобы ускорить процесс интеграции. В результате признак ПометкаУдаления записывается напрямую в СУБД, а связанные движения в таблицах регистров остаются нетронутыми.<Объект не найден>.Давайте пошагово разберем, как исправить эту ситуацию различными методами.
Если в вашей конфигурации используется библиотека стандартных подсистем (БСП), вам доступен мощный инструмент для исправления подобных массовых ошибок без написания кода. Нам потребуется запустить обработку ГрупповоеИзменениеРеквизитов.
Рассмотрим этот процесс по шагам:
ПометкаУдаления Равно ДаПроведен Равно Да (или проверим наличие движений по регистру)Если стандартная групповая обработка по каким-то причинам не справляется или вам требуется автоматизировать этот процесс, лучшим решением будет написание небольшой обработки. Логика работы платформы 1С такова: чтобы удалить движения документа по регистру, необходимо записать по этому регистратору пустой набор записей.
Рассмотрим подробнее программный код, который решает эту задачу. Мы можем написать универсальный алгоритм, который будет обходить метаданные и очищать проводки по всем регистрам для переданного документа:
Процедура ОчиститьДвиженияДокумента(ДокументСсылка) Экспорт
// Проверяем, что документ действительно помечен на удаление
Если Не ДокументСсылка.ПометкаУдаления Тогда
Возврат;
КонецЕсли;
// 1. Очищаем движения в регистрах накопления
Для Каждого Регистр Из Метаданные.РегистрыНакопления Цикл
Набор = Регистры[Регистр.Имя].СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Если Набор.Выбрать().Количество() > 0 Тогда
Набор.Записать(); // Запись пустого набора удаляет движения из СУБД
КонецЕсли;
КонецЦикла;
// 2. Очищаем движения в регистрах бухгалтерии (проводки)
Для Каждого Регистр Из Метаданные.РегистрыБухгалтерии Цикл
Набор = Регистры[Регистр.Имя].СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Если Набор.Выбрать().Количество() > 0 Тогда
Набор.Записать();
КонецЕсли;
КонецЦикла;
// 3. Очищаем движения в регистрах сведений (подчиненных регистратору)
Для Каждого Регистр Из Метаданные.РегистрыСведений Цикл
Если Регистр.РежимЗаписи = Метаданные.СвойстваОбъектов.РежимЗаписиРегистраСведений.ПодчиненРегистратору Тогда
Набор = Регистры[Регистр.Имя].СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Если Набор.Выбрать().Количество() > 0 Тогда
Набор.Записать();
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если в вашей конфигурации внедрена БСП, задача упрощается еще сильнее. Разработчики библиотеки уже предусмотрели готовые процедуры оптимизации. Мы можем использовать стандартный метод из общего модуля:
ОбменДаннымиСервер.УдалитьДвиженияУДокумента(ДокументСсылка)
Эта функция самостоятельно определит структуру метаданных документа, найдет все его движения и корректно запишет пустые наборы данных без необходимости перебирать все регистры вручную в цикле.
Иногда возникает ситуация, когда сам документ-регистратор был физически удален из базы данных (например, при непосредственном удалении без контроля ссылочной целостности), а записи в таблицах регистров остались. В таком случае в полях регистратор отображается битая ссылка вида <Объект не найден>.... Программные методы выше не сработают, так как у нас нет валидной объектной ссылки для передачи в отбор.
Для исправления этой проблемы проанализируем возможности утилиты «Тестирование и исправление информационной базы»:
Проверка логической целостностиПроверка ссылочной целостностиИспользуя предложенные методы, мы можем гарантировать полную чистоту регистров информационной базы и корректность отображения данных в любых аналитических и финансовых отчетах программы 1С.