Как удалить «битые» документы, если Тестирование и исправление (ТиИ) завершается ошибкой?

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

Часто в работе с базами данных 1С возникает ситуация, когда при проверке ссылочной целостности мы обнаруживаем «битые» документы, которые отображаются как Объект не найден. Если стандартная процедура Тестирование и исправление (ТиИ) завершается аварийным закрытием платформы или «молчаливым» вылетом, это говорит о глубоком повреждении логической связи между таблицами данных. В этой статье мы разберем, как принудительно удалить такие «фантомные» объекты программным способом.

Почему стандартное ТиИ не помогает?

Ситуация, когда платформа «вылетает», обычно связана с тем, что в таблице движений (регистре) остались записи, ссылающиеся на Регистратор, который физически отсутствует или поврежден в таблице документов. При попытке автоматического исправления платформа пытается обратиться к этому объекту, не может его прочитать и вызывает критическую ошибку доступа к памяти. Чтобы исправить это, мы пойдем другим путем — очистим записи в регистрах, минуя обращение к самому «битому» документу.

Решение через программную очистку набора записей

Самый надежный способ устранить проблему — найти все записи в регистрах накопления или бухгалтерии, у которых Регистратор является «битым», и удалить их. Для этого мы будем использовать Запрос к данным регистра, чтобы выявить записи, в которых Регистратор фактически отсутствует (значение NULL при обращении через точку).

Рассмотрим алгоритм действий по шагам:

  1. Создадим Запрос, который выберет все уникальные ссылки на регистраторы, не имеющие физического воплощения в базе.
  2. Используем метод СоздатьНаборЗаписей() для соответствующего регистра.
  3. Установим отбор по найденному «битому» регистратору.
  4. Выполним запись пустого набора, чтобы физически удалить эти записи из таблицы СУБД.

Пример программного кода для очистки регистра

Давайте проанализируем реализацию данного метода на примере регистра накопления (логика применима и для регистра бухгалтерии):


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

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

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

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

Важные рекомендации при выполнении работ

Перед тем как приступать к манипуляциям с данными, обязательно учитывайте следующие аспекты:

Если после выполнения данной процедуры в списке документов все еще отображаются «фантомы», проверьте, нет ли у вас специфических настроек RLS или расширений конфигурации, которые могут искажать представление данных. В 90% случаев данный программный метод позволяет полностью очистить базу от поврежденных ссылок и подготовить её к обновлению или дальнейшей работе.

← На главную