В практике работы с базами данных 1С, особенно после выполнения операции свертки базы или некорректного удаления документов, возникает специфическая проблема: в отчетах (например, в «Главной книге») появляются суммы по счету 000 или другим счетам, которые невозможно расшифровать. При детальном анализе выясняется, что в системе присутствуют записи с пустым значением в поле Регистратор. Самое странное в этой ситуации то, что при просмотре записей самого регистра бухгалтерии этих строк нет, но они отчетливо видны в виртуальных таблицах остатков и оборотов.
В рамках данной статьи мы разберем причины возникновения таких «фантомных» записей и рассмотрим пошаговые методы их устранения, от стандартного обслуживания базы до программных манипуляций с итогами.
Прежде чем переходить к лечению, давайте проанализируем ситуацию с технической точки зрения. Регистр бухгалтерии в системе «1С:Предприятие 8» хранит данные в нескольких физических таблицах SQL:
ОстаткиИОбороты) получают данные для быстрого построения отчетов.Проблема «пустого регистратора» возникает тогда, когда из основной таблицы записи были удалены (например, при свертке), а в таблицах итогов остались «хвосты». Виртуальная таблица видит остаток в таблице итогов, но не находит соответствующего документа в основной таблице, поэтому подставляет в поле Регистратор значение Неопределено или ПустаяСсылка.
Как показывает практика и обсуждения специалистов, это самый эффективный и безопасный метод. Нам нужно заставить платформу полностью очистить таблицы итогов и сформировать их заново на основании только тех записей, которые реально существуют в основной таблице движений.
Рассмотрим код обработки, который решает эту задачу. Для этого создадим внешнюю обработку и в модуле пропишем следующую последовательность действий (на примере регистра ЕПСБУ):
// 1. Полностью отключаем использование итогов для регистра
РегистрыБухгалтерии.ЕПСБУ.УстановитьИспользованиеИтогов(Ложь);
РегистрыБухгалтерии.ЕПСБУ.УстановитьИспользованиеТекущихИтогов(Ложь);
// 2. Включаем использование итогов обратно
// В этот момент таблицы итогов в SQL будут очищены и инициализированы
РегистрыБухгалтерии.ЕПСБУ.УстановитьИспользованиеИтогов(Истина);
РегистрыБухгалтерии.ЕПСБУ.УстановитьИспользованиеТекущихИтогов(Истина);
// 3. Запускаем полный пересчет итогов для актуализации данных
РегистрыБухгалтерии.ЕПСБУ.ПересчитатьИтоги();
Важный момент: После выполнения этого кода платформе потребуется время на пересчет, особенно если база большая. Рекомендуется выполнять это в монопольном режиме.
Если программный пересчет не помог, воспользуемся стандартным механизмом «Тестирование и исправление». Однако важно правильно выбрать настройки. Проанализируем, какие флаги нам необходимы:
Чтобы убедиться, что записи действительно «фантомные», мы можем использовать консоль запросов. Попробуем выяснить, откуда берутся эти данные. Проанализируем два разных запроса.
Запрос к физической таблице (обычно не возвращает ничего):
ВЫБРАТЬ
ЕПСБУ.Регистратор
ИЗ
РегистрБухгалтерии.ЕПСБУ КАК ЕПСБУ
ГДЕ
(ЕПСБУ.Регистратор ЕСТЬ NULL ИЛИ ЕПСБУ.Регистратор.Ссылка ЕСТЬ NULL)
Запрос к виртуальной таблице остатков (здесь мы увидим те самые записи):
ВЫБРАТЬ
ЕПСБУОстатки.Счет,
ЕПСБУОстатки.СуммаОстаток,
ЕПСБУОстатки.Регистратор
ИЗ
РегистрБухгалтерии.ЕПСБУ.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Запись, , , , ) КАК ЕПСБУОстатки
ГДЕ
ЕПСБУОстатки.Регистратор.Ссылка ЕСТЬ NULL
Если второй запрос показывает данные, а первый — нет, значит, мы имеем дело именно с рассинхронизацией итогов, и Метод 1 является приоритетным.
Рассмотрим еще один вариант решения, который часто помогает в случаях, когда стандартное тестирование бессильно. Это выгрузка информационной базы в файл .dt и её последующая загрузка в пустую базу.
Почему это работает? При выгрузке в .dt 1С считывает только реальные объекты и записи движений. При последующей загрузке платформа заново создает все таблицы и пересчитывает итоги с нуля. Все «фантомные» записи в таблицах итогов SQL при этом просто не попадут в новый файл и не будут созданы при загрузке.
Примечание для SQL-баз: Если при попытке выгрузки система сообщает об активных пользователях, которых на самом деле нет, необходимо перезапустить службу Агент сервера 1С:Предприятия или воспользоваться консолью администрирования серверов для принудительного завершения сеансов.
Если ваша база данных работает в файловом режиме (расширение .1CD), обязательно воспользуйтесь утилитой chdbfl.exe, которая находится в папке bin установленной платформы. Установите флаг «Исправлять обнаруженные ошибки». Эта утилита проверяет физическую целостность таблиц и может удалить записи в таблицах итогов, которые не имеют связи с основной таблицей регистра.
Выяснив причину появления записей с пустым регистратором — рассинхронизацию таблиц итогов и движений — мы можем сделать вывод: наиболее надежным способом решения является полное отключение и включение итогов программным способом. Это действие принудительно обновляет структуру хранения остатков и убирает любые расхождения, возникшие в результате свертки базы или сбоев в работе СУБД.