Как удалить проводки и движения, оставшиеся после удаления документов Ведомость на выплату зарплаты?

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

В практике работы с "1С:Бухгалтерия 3.0" иногда возникает неприятная ситуация: документы (например, Ведомость на выплату зарплаты) были удалены из информационной базы, но движения по ним в регистрах бухгалтерии или регистрах накопления остались. В интерфейсе такие записи выглядят как строки с регистратором Объект не найден (битая ссылка). Это приводит к искажению отчетности, неверным остаткам по счетам и проблемам при закрытии месяца.

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

Почему возникают "битые" ссылки в регистрах?

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

  1. Использовалось непосредственное удаление объекта (например, обработкой или кодом с параметром ОбменДанными.Загрузка = Истина), которое игнорирует проверку ссылочной целостности.
  2. Произошел критический сбой в момент транзакции удаления.
  3. Документы были некорректно удалены в другой базе (например, в ЗУП) и изменения мигрировали через синхронизацию данных.

Способ 1. Программная очистка конкретного регистра

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

Разберем по шагам код, который позволяет автоматизировать этот процесс:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ РАЗЛИЧНЫЕ
|   Хозрасчетный.Регистратор КАК БитаяСсылка
|ИЗ
|   РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
|   Хозрасчетный.Регистратор.Номер ЕСТЬ NULL
|   И НЕ Хозрасчетный.Регистратор = ЗНАЧЕНИЕ(Документ.ВедомостьНаВыплатуЗарплатыВКассу.ПустаяСсылка)
|   И НЕ Хозрасчетный.Регистратор = ЗНАЧЕНИЕ(Документ.ВедомостьНаВыплатуЗарплатыВБанк.ПустаяСсылка)";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    // Создаем набор записей для конкретного "битого" регистратора
    НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Выборка.БитаяСсылка);
    
    // Очищаем набор и записываем изменения
    НаборЗаписей.Записать(); 
    Сообщить("Очищены движения по регистратору: " + Выборка.БитаяСсылка);
КонецЦикла;

Обратите внимание на условие Регистратор.Номер ЕСТЬ NULL. Это классический способ в языке запросов 1С определить, что объект по ссылке отсутствует в базе. Если ссылка "битая", обращение к любому реквизиту (например, Номер или Дата) вернет NULL.

Способ 2. Универсальная очистка по всем регистрам

Документы по зарплате (ведомости) часто не делают проводок по счету 70 напрямую, но всегда оставляют записи в регистрах накопления, таких как Взаиморасчеты с сотрудниками или Зарплата к выплате. Если очистить только Хозрасчетный, проблема в зарплатных отчетах останется.

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


// Пример логики для обхода всех регистров документа
МетаданныеДокумента = Метаданные.Документы.ВедомостьНаВыплатуЗарплатыВКассу;

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

Важно: Такой подход требует осторожности. Перед запуском любых обработок по очистке обязательно создайте резервную копию базы.

Способ 3. Использование штатного механизма "Тестирование и исправление"

Если вы не хотите писать код, можно воспользоваться встроенной утилитой платформы. Посмотрим, как настроить Тестирование и исправление (ТИИ) для решения нашей задачи:

  1. Запустите информационную базу в режиме Конфигуратор.
  2. Перейдите в меню Администрирование — Тестирование и исправление.
  3. Выберите пункт Проверка ссылочной целостности информационной базы.
  4. В поле При наличии ссылок на несуществующие объекты выберите вариант Очищать ссылки или Удалять объект.

Проанализируем разницу: если выбрать "Очищать ссылки", платформа сотрет битую ссылку в поле Регистратор, но сама запись в регистре может остаться с пустым регистратором. Для удаления именно движений лучше использовать вариант Удалять объект (в контексте записей регистров это приведет к их удалению).

Завершающий этап: Пересчет итогов

После того как мы очистили регистры от лишних записей, необходимо убедиться, что система правильно видит актуальные остатки. В 1С данные хранятся в двух видах таблиц: таблицы движений и таблицы итогов (агрегированные данные по месяцам).

Выясним, как обновить эти данные:

  1. В режиме "1С:Предприятие" перейдите в раздел Администрирование — Обслуживание — Регламентные операции.
  2. Выберите Управление итогами и агрегатами.
  3. Выполните операцию Пересчет итогов для всех регистров, в которых производилась очистка.

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

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

← На главную