В практике работы с "1С:Бухгалтерия 3.0" иногда возникает неприятная ситуация: документы (например, Ведомость на выплату зарплаты) были удалены из информационной базы, но движения по ним в регистрах бухгалтерии или регистрах накопления остались. В интерфейсе такие записи выглядят как строки с регистратором Объект не найден (битая ссылка). Это приводит к искажению отчетности, неверным остаткам по счетам и проблемам при закрытии месяца.
Рассмотрим подробно, почему это происходит и как правильно очистить базу от таких "фантомных" записей, используя программные методы и штатные средства платформы.
Прежде чем переходить к решению, проанализируем причины возникновения проблемы. В норме при удалении документа платформа 1С автоматически удаляет все его движения. Однако механизм может дать сбой, если:
ОбменДанными.Загрузка = Истина), которое игнорирует проверку ссылочной целостности.Если мы точно знаем, что лишние записи остались в регистре бухгалтерии Хозрасчетный, мы можем воспользоваться программным методом очистки. Основная идея заключается в том, чтобы найти все записи, у которых поле Регистратор ссылается на несуществующий объект, и очистить набор записей по этому регистратору.
Разберем по шагам код, который позволяет автоматизировать этот процесс:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Хозрасчетный.Регистратор КАК БитаяСсылка
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Регистратор.Номер ЕСТЬ NULL
| И НЕ Хозрасчетный.Регистратор = ЗНАЧЕНИЕ(Документ.ВедомостьНаВыплатуЗарплатыВКассу.ПустаяСсылка)
| И НЕ Хозрасчетный.Регистратор = ЗНАЧЕНИЕ(Документ.ВедомостьНаВыплатуЗарплатыВБанк.ПустаяСсылка)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Создаем набор записей для конкретного "битого" регистратора
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Выборка.БитаяСсылка);
// Очищаем набор и записываем изменения
НаборЗаписей.Записать();
Сообщить("Очищены движения по регистратору: " + Выборка.БитаяСсылка);
КонецЦикла;
Обратите внимание на условие Регистратор.Номер ЕСТЬ NULL. Это классический способ в языке запросов 1С определить, что объект по ссылке отсутствует в базе. Если ссылка "битая", обращение к любому реквизиту (например, Номер или Дата) вернет NULL.
Документы по зарплате (ведомости) часто не делают проводок по счету 70 напрямую, но всегда оставляют записи в регистрах накопления, таких как Взаиморасчеты с сотрудниками или Зарплата к выплате. Если очистить только Хозрасчетный, проблема в зарплатных отчетах останется.
Разберем, как проанализировать метаданные и очистить все возможные движения документа. Мы можем программно обойти все регистры, в которых документ может выступать регистратором:
// Пример логики для обхода всех регистров документа
МетаданныеДокумента = Метаданные.Документы.ВедомостьНаВыплатуЗарплатыВКассу;
// Проходим по всем регистрам накопления, где документ является регистратором
Для Каждого Рег Из Метаданные.РегистрыНакопления Цикл
Если Рег.Регистраторы.Содержит(МетаданныеДокумента) Тогда
// Здесь можно применить аналогичную логику с созданием набора записей
// РегистрыНакопления[Рег.Имя].СоздатьНаборЗаписей()...
КонецЕсли;
КонецЦикла;
Важно: Такой подход требует осторожности. Перед запуском любых обработок по очистке обязательно создайте резервную копию базы.
Если вы не хотите писать код, можно воспользоваться встроенной утилитой платформы. Посмотрим, как настроить Тестирование и исправление (ТИИ) для решения нашей задачи:
Проанализируем разницу: если выбрать "Очищать ссылки", платформа сотрет битую ссылку в поле Регистратор, но сама запись в регистре может остаться с пустым регистратором. Для удаления именно движений лучше использовать вариант Удалять объект (в контексте записей регистров это приведет к их удалению).
После того как мы очистили регистры от лишних записей, необходимо убедиться, что система правильно видит актуальные остатки. В 1С данные хранятся в двух видах таблиц: таблицы движений и таблицы итогов (агрегированные данные по месяцам).
Выясним, как обновить эти данные:
Этот шаг критически важен. Без пересчета итогов отчеты могут продолжать показывать старые (неверные) суммы, так как они берут данные из итоговых таблиц, которые не обновились автоматически при ручной манипуляции с наборами записей.
Таким образом, мы рассмотрели комплексный подход к решению проблемы: от точечного исправления конкретного регистра с помощью программного кода до системного исправления через механизмы платформы. Всегда начинайте с анализа объема проблемы и помните про важность работы с регистрами накопления для документов выплаты зарплаты.