В процессе работы с базами данных 1С разработчики и администраторы периодически сталкиваются с ситуацией, когда виртуальная таблица остатков регистра накопления возвращает данные, которых физически нет в движениях. При этом в интерфейсе программы запись отсутствует, регистратор не определяется (или поле регистратора пустое), а прямой запрос к физической таблице движений не возвращает строк. Попытка удалить такую запись программно через стандартные объекты манипуляции данными также не дает результата, поскольку у подчиненных регистратору регистров нельзя сформировать набор записей без указания конкретного документа-регистратора.
Проанализируем природу этой ошибки и разберем по шагам все доступные способы очистки «фантомных» записей.
Чтобы понять причину сбоя, рассмотрим архитектуру хранения данных регистров накопления на уровне СУБД. В платформе «1С:Предприятие» регистры остатков физически разделены на две таблицы:
Когда мы обращаемся к виртуальной таблице .Остатки, платформа не сканирует все движения с начала времен, а берет готовое значение из таблицы итогов и прибавляет движения за промежуток от даты последних итогов до даты запроса. Если в результате аварийного завершения сеанса, сбоя СУБД или разрыва сетевой транзакции движения документа удалились, а пересчет агрегатов в таблице итогов не завершился, возникает рассинхронизация таблиц. В итоге таблица движений пуста, а в таблице итогов остается зависшее числовое значение.
Попытки удалить такую запись через РегистрНакопленияМенеджерЗаписи не сработают, так как этот объект предназначен только для регистров без регистратора, а РегистрНакопленияНаборЗаписей требует обязательного отбора по регистратору. Следовательно, единственный корректный способ исправить проблему — заставить платформу синхронизировать и пересчитать таблицу итогов.
Если база данных работает в многопользовательском режиме и вы не можете остановить работу всех пользователей для монопольного обслуживания, наиболее быстрый и безопасный вариант — программный пересчет конкретного проблемного регистра с помощью внешней обработки.
Рассмотрим вариант с полным сбросом и повторным включением итогов. При отключении итогов платформа полностью очищает физическую таблицу итогов выбранного регистра, а при повторном включении — рассчитывает ее с нуля исключительно по реальным движениям из таблицы движений:
ИмяРегистра = "ТоварыНаСкладах"; // Укажите имя проблемного регистра
// Отключаем использование итогов (таблица итогов очищается)
РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Ложь);
// Включаем использование итогов обратно (таблица пересчитывается заново)
РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Истина);
Также можно использовать метод прямой инициализации пересчета итогов за весь период или с ограничением по датам:
ИмяРегистра = "ТоварыНаСкладах";
// Полный пересчет итогов регистра
РегистрыНакопления[ИмяРегистра].ПересчитатьИтоги();
// Либо пересчет за конкретный проблемный интервал
ДатаНачала = '20230101000000';
ДатаОкончания = '20231231235959';
РегистрыНакопления[ИмяРегистра].ПересчитатьИтогиЗаПериод(ДатаНачала, ДатаОкончания);
В режиме «1С:Предприятие» присутствует стандартный функционал для управления агрегатами регистров без необходимости написания кода:
Если локальный пересчет не помог или сбои наблюдаются сразу в нескольких регистрах (включая регистры бухгалтерии), разберем классический способ восстановления целостности информационной базы через Конфигуратор:
.dt или бэкап средствами СУБД).В процессе пересчета итогов платформа пересчитает агрегаты всех регистров накопления и регистров бухгалтерии, полностью удалив расхождения между таблицами движений и итогов.
Если описанные выше стандартные механизмы не устранили проблему, проанализируем альтернативные варианты:
.dt) выгружает только реальные данные (движения, справочники, документы), не перенося таблицы итогов. При обратной загрузке в чистую базу данных платформа создает пустые таблицы итогов и рассчитывает их заново.chdbfl.exe: Для файловых баз данных (формат 1Cv8.1CD) зависание записей может быть вызвано физическим повреждением структуры файла. Запустим утилиту chdbfl.exe (находится в папке bin установленной платформы 1С) с флагом «Исправлять обнаруженные ошибки».