В процессе эксплуатации файловых баз 1С программисты иногда сталкиваются с крайне неприятной ситуацией: в регистре бухгалтерии или регистрах накопления обнаруживаются записи (движения), у которых поле Регистратор не просто содержит «битую ссылку» (Объект не найден), а имеет значение Неопределено. Это критическая ошибка целостности данных, так как стандартные механизмы платформы 1С:Предприятие 8 жестко требуют наличия ссылки на документ-основание для каждой записи в подчиненном регистре.
Разберем подробно, почему так происходит и как мы можем вычистить эти «призрачные» проводки, когда обычное «Тестирование и исправление» не помогает.
Проанализируем типичный сценарий: база файловая, ранее проводилось тестирование и исправление с опцией «Очищать ссылки». В результате объект (документ) был удален, а ссылка в таблице движений превратилась в Неопределено. Проблема в том, что объект РегистрБухгалтерииНаборЗаписей требует обязательного установления отбора по регистратору перед записью. Если мы попробуем выполнить следующий код:
НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(Неопределено);
НаборЗаписей.Записать();
Система выдаст ошибку: «Не установлен отбор по регистратору». Платформа просто не позволяет записывать пустой набор для неопределенного регистратора. Даже использование свойства ОбменДанными.Загрузка = Истина в данном случае не спасает ситуацию.
Это самый простой, но в то же время самый радикальный метод. Рассмотрим, как он работает. Фантомные записи часто застревают не в основной таблице движений, а в таблицах итогов. Пересчет итогов заставляет систему заново пересчитать остатки, опираясь только на реально существующие движения.
Важный нюанс: как отметил автор обсуждения, после пересчета остатки могут «поплыть». Это происходит потому, что фантомные проводки реально влияли на баланс, и их исчезновение приведет отчетность к состоянию, которое соответствует фактическим документам в базе. Перед выполнением этой операции обязательно сделайте резервную копию.
Если после этого остатки в ОСВ изменились, значит, система успешно удалила «мусор», который не подтвержден первичными документами.
Если нам нужно точечно удалить конкретные записи, не затрагивая общие итоги (хотя это спорный момент с точки зрения корректности учета), мы можем попытаться «усыновить» эти записи. Идея заключается в том, чтобы найти записи с пустым регистратором и программно подменить его на реально существующий документ, например, типа ОперацияБух.
Разберем алгоритм действий:
Операция (бухгалтерский учет). Запишем его, но не будем заполнять.Регистратор не заполнен.Однако, в файловой базе прямое изменение поля Регистратор через запрос невозможно. Поэтому рассмотрим более хитрый способ: использование механизма загрузки данных.
// Пример логики поиска и попытки перезаписи
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Хозрасчетный.НомерСтроки,
| Хозрасчетный.Период
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Регистратор ЕСТЬ NULL"; // Или проверка на Неопределено
Результат = Запрос.Выполнить();
// Далее требуется низкоуровневая подмена, что сложно реализовать стандартным кодом 1С
Если стандартный код не позволяет сделать НаборЗаписей.Записать(), переходим к более продвинутым инструментам.
Так как база файловая, она физически представляет собой файл 1Cv8.1CD. Существует стороннее решение — утилита Tool_1CD, которая позволяет просматривать и редактировать таблицы этого файла напрямую, в обход движка 1С. Это аналог работы с SQL-базой через менеджмент-студию.
Проанализируем шаги работы с утилитой:
Tool_1CD._AccRg с каким-то порядковым номером (например, _AccRg154). Чтобы понять, какая именно таблица вам нужна, можно посмотреть структуру таблиц в конфигураторе (через «Получить структуру хранения данных»)._RecorderRRef (бинарный идентификатор регистратора) заполнено нулями или содержит некорректные данные.chdbfl.exe (она находится в папке bin платформы 1С) для исправления физической целостности файла, а затем выполните «Пересчет итогов» в Конфигураторе.Внимание: это самый опасный метод. Ошибка при редактировании таблиц может привести к полной невозможности открыть базу.
Рассмотрим еще один эффективный и безопасный метод очистки базы от «мусора». Механизм универсального обмена данными (через XML) при выгрузке опирается на объектную модель. Если записи в регистре не имеют владельца-регистратора, они просто не будут выгружены, так как обработка выгрузки идет «от документа к его движениям».
Пошаговая инструкция:
.cf файла).В новой базе фантомных проводок гарантированно не будет, так как при выгрузке система не найдет документов, к которым они привязаны. Этот метод также позволяет попутно «схлопнуть» файл базы, удалив лишнее свободное пространство.
Чтобы ситуация не повторилась, проанализируем причины. Чаще всего это происходит из-за:
ОбменДанными.Загрузка = Истина при записи наборов записей из внешних систем без должной проверки ссылок.Рекомендуем регулярно выполнять профилактическую проверку базы утилитой chdbfl.exe и следить за журналом регистрации в моменты проведения массовых корректировок данных.