Как удалить запись регистра регистра бухгалтерии с пустым регистратором

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

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

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

Почему возникают записи без регистратора

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

  1. Таблица движений (основная таблица) — здесь хранятся сами проводки. Каждая запись обязана иметь ссылку на документ-регистратор.
  2. Таблицы итогов — в них хранятся предварительно рассчитанные остатки и обороты (обычно в разрезе месяцев). Именно из этих таблиц виртуальные таблицы 1С (такие как ОстаткиИОбороты) получают данные для быстрого построения отчетов.

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

Метод 1. Программный сброс и пересчет итогов

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

Рассмотрим код обработки, который решает эту задачу. Для этого создадим внешнюю обработку и в модуле пропишем следующую последовательность действий (на примере регистра ЕПСБУ):


// 1. Полностью отключаем использование итогов для регистра
РегистрыБухгалтерии.ЕПСБУ.УстановитьИспользованиеИтогов(Ложь);
РегистрыБухгалтерии.ЕПСБУ.УстановитьИспользованиеТекущихИтогов(Ложь);

// 2. Включаем использование итогов обратно
// В этот момент таблицы итогов в SQL будут очищены и инициализированы
РегистрыБухгалтерии.ЕПСБУ.УстановитьИспользованиеИтогов(Истина);
РегистрыБухгалтерии.ЕПСБУ.УстановитьИспользованиеТекущихИтогов(Истина);

// 3. Запускаем полный пересчет итогов для актуализации данных
РегистрыБухгалтерии.ЕПСБУ.ПересчитатьИтоги();

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

Метод 2. Тестирование и исправление с реструктуризацией

Если программный пересчет не помог, воспользуемся стандартным механизмом «Тестирование и исправление». Однако важно правильно выбрать настройки. Проанализируем, какие флаги нам необходимы:

Метод 3. Диагностика через консоль запросов

Чтобы убедиться, что записи действительно «фантомные», мы можем использовать консоль запросов. Попробуем выяснить, откуда берутся эти данные. Проанализируем два разных запроса.

Запрос к физической таблице (обычно не возвращает ничего):


ВЫБРАТЬ
    ЕПСБУ.Регистратор
ИЗ
    РегистрБухгалтерии.ЕПСБУ КАК ЕПСБУ
ГДЕ
    (ЕПСБУ.Регистратор ЕСТЬ NULL ИЛИ ЕПСБУ.Регистратор.Ссылка ЕСТЬ NULL)

Запрос к виртуальной таблице остатков (здесь мы увидим те самые записи):


ВЫБРАТЬ
    ЕПСБУОстатки.Счет,
    ЕПСБУОстатки.СуммаОстаток,
    ЕПСБУОстатки.Регистратор
ИЗ
    РегистрБухгалтерии.ЕПСБУ.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Запись, , , , ) КАК ЕПСБУОстатки
ГДЕ
    ЕПСБУОстатки.Регистратор.Ссылка ЕСТЬ NULL

Если второй запрос показывает данные, а первый — нет, значит, мы имеем дело именно с рассинхронизацией итогов, и Метод 1 является приоритетным.

Метод 4. Выгрузка и загрузка в формат DT

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

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

Примечание для SQL-баз: Если при попытке выгрузки система сообщает об активных пользователях, которых на самом деле нет, необходимо перезапустить службу Агент сервера 1С:Предприятия или воспользоваться консолью администрирования серверов для принудительного завершения сеансов.

Метод 5. Использование утилиты chdbfl.exe (для файловых баз)

Если ваша база данных работает в файловом режиме (расширение .1CD), обязательно воспользуйтесь утилитой chdbfl.exe, которая находится в папке bin установленной платформы. Установите флаг «Исправлять обнаруженные ошибки». Эта утилита проверяет физическую целостность таблиц и может удалить записи в таблицах итогов, которые не имеют связи с основной таблицей регистра.

Резюме

Выяснив причину появления записей с пустым регистратором — рассинхронизацию таблиц итогов и движений — мы можем сделать вывод: наиболее надежным способом решения является полное отключение и включение итогов программным способом. Это действие принудительно обновляет структуру хранения остатков и убирает любые расхождения, возникшие в результате свертки базы или сбоев в работе СУБД.

← На главную