При неудачном выполнении свертки информационной базы или сбоях в процессе записи данных в регистрах накопления могут образоваться «пустые» или «битые» записи. В таких ситуациях штатная процедура тестирования и исправления информационной базы не может нормально пересчитать итоги, блокируя дальнейшую работу с платформой.
Рассмотрим подробно причины возникновения этой проблемы и разберем по шагам проверенные способы ее решения.
Выясним, почему стандартные инструменты 1С могут выдавать ошибку при наличии фантомных записей:
.1cd): При внезапном прерывании процесса свертки в файле базы образуются разорванные страницы или «потерянные» строки в физической таблице регистра накопления.Объект не найден) либо `NULL`.Простое условие в стандартном отборе набора записей по пустому регистратору может не сработать. Для поиска битых ссылок построим запрос к основной таблице регистра (не к таблицам остатков или оборотов) с проверкой на NULL или проверкой допустимых типов регистраторов.
Проанализируем пример запроса для поиска битых движений:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаРегистра.Период КАК Период,
| ТаблицаРегистра.Регистратор КАК Регистратор
|ИЗ
| РегистрНакопления.ТоварыНаСкладах КАК ТаблицаРегистра
|ГДЕ
| ТаблицаРегистра.Регистратор.Ссылка ЕСТЬ NULL";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Очистка набора записей по найденному регистратору
Набор = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(Выборка.Регистратор);
Набор.Записать(); // Запись пустого набора удаляет движения
КонецЦикла;
Если ссылки на регистратор имеют вид битого GUID, можно программно восстановить временно фиктивный документ с соответствующим GUID вызовом метода УстановитьСсылкуНового(), очистить движения стандартным способом через набор записей, а затем пометить и удалить созданный документ.
Если стандартные запросы 1С не видят битые строки, но платформа спотыкается о них при пересчете итогов, выполним пересоздание структуры регистра через промежуточный файл.
Разберем алгоритм по шагам:
Для файлового варианта базы данных (.1cd) эффективно помогают штатные утилиты физического исправления файла:
chdbfl.exe (находится в папке bin установленной платформы 1С).Если проблема возникает исключительно на шаге пересчета итогов, попробуем отключить и заново включить использование итогов для конкретного регистра накопления программным путем:
// Отключаем использование итогов по регистру
РегистрыНакопления.ТоварыНаСкладах.УстановитьИспользованиеИтогов(Ложь);
// Включаем использование итогов обратно - платформа перестроит их с нуля
РегистрыНакопления.ТоварыНаСкладах.УстановитьИспользованиеИтогов(Истина);
Также можно воспользоваться стандартной обработкой «Управление итогами» (доступной через меню «Функции для специалиста»). Сместим начальную границу рассчитанных итогов на максимально раннюю дату (например, 01.01.1980 г.), применим изменения, после чего вернем границу расчета на текущий период.
Если база работает в клиент-серверном режиме (MS SQL Server / PostgreSQL), исправление физически битых записей выполним напрямую в СУБД:
ПолучитьСтруктуруХраненияБазыДанных() определим имя физической таблицы движения регистра (например, _AccumReg1234).