Как удалить проводки без регистратора в файловой базе 1С

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

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

Разберем подробно, почему так происходит и как мы можем вычистить эти «призрачные» проводки, когда обычное «Тестирование и исправление» не помогает.

Анализ ситуации: почему штатные методы дают сбой

Проанализируем типичный сценарий: база файловая, ранее проводилось тестирование и исправление с опцией «Очищать ссылки». В результате объект (документ) был удален, а ссылка в таблице движений превратилась в Неопределено. Проблема в том, что объект РегистрБухгалтерииНаборЗаписей требует обязательного установления отбора по регистратору перед записью. Если мы попробуем выполнить следующий код:


НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Неопределено);
НаборЗаписей.Записать();

Система выдаст ошибку: «Не установлен отбор по регистратору». Платформа просто не позволяет записывать пустой набор для неопределенного регистратора. Даже использование свойства ОбменДанными.Загрузка = Истина в данном случае не спасает ситуацию.

Решение 1: Полный пересчет итогов

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

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

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

Если после этого остатки в ОСВ изменились, значит, система успешно удалила «мусор», который не подтвержден первичными документами.

Решение 2: Программная привязка к техническому документу

Если нам нужно точечно удалить конкретные записи, не затрагивая общие итоги (хотя это спорный момент с точки зрения корректности учета), мы можем попытаться «усыновить» эти записи. Идея заключается в том, чтобы найти записи с пустым регистратором и программно подменить его на реально существующий документ, например, типа ОперацияБух.

Разберем алгоритм действий:

  1. Создадим в пользовательском режиме новый документ Операция (бухгалтерский учет). Запишем его, но не будем заполнять.
  2. Напишем обработку, которая выберет записи из реальной таблицы регистра бухгалтерии, где Регистратор не заполнен.
  3. В цикле создадим новые наборы записей, где в качестве регистратора укажем ссылку на наш новый документ, и перенесем туда данные фантомных записей.

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


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

Результат = Запрос.Выполнить();
// Далее требуется низкоуровневая подмена, что сложно реализовать стандартным кодом 1С

Если стандартный код не позволяет сделать НаборЗаписей.Записать(), переходим к более продвинутым инструментам.

Решение 3: Использование утилиты Tool_1CD

Так как база файловая, она физически представляет собой файл 1Cv8.1CD. Существует стороннее решение — утилита Tool_1CD, которая позволяет просматривать и редактировать таблицы этого файла напрямую, в обход движка 1С. Это аналог работы с SQL-базой через менеджмент-студию.

Проанализируем шаги работы с утилитой:

  1. Закройте все сеансы работы с базой.
  2. Откройте файл базы в Tool_1CD.
  3. Найдите таблицу регистра бухгалтерии. Обычно она называется _AccRg с каким-то порядковым номером (например, _AccRg154). Чтобы понять, какая именно таблица вам нужна, можно посмотреть структуру таблиц в конфигураторе (через «Получить структуру хранения данных»).
  4. Найдите строки, в которых поле _RecorderRRef (бинарный идентификатор регистратора) заполнено нулями или содержит некорректные данные.
  5. Удалите эти строки непосредственно из таблицы.
  6. После сохранения изменений обязательно запустите штатную утилиту chdbfl.exe (она находится в папке bin платформы 1С) для исправления физической целостности файла, а затем выполните «Пересчет итогов» в Конфигураторе.

Внимание: это самый опасный метод. Ошибка при редактировании таблиц может привести к полной невозможности открыть базу.

Решение 4: Выгрузка и загрузка данных через XML

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

Пошаговая инструкция:

  1. Создайте новую пустую базу с той же самой конфигурацией (используйте выгрузку .cf файла).
  2. В исходной базе воспользуйтесь обработкой «Универсальный обмен данными в формате XML».
  3. Выгрузите все данные (документы, справочники, константы).
  4. Загрузите полученный файл в пустую базу.

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

Выясним причину появления таких записей

Чтобы ситуация не повторилась, проанализируем причины. Чаще всего это происходит из-за:

Рекомендуем регулярно выполнять профилактическую проверку базы утилитой chdbfl.exe и следить за журналом регистрации в моменты проведения массовых корректировок данных.

← На главную