При разработке отчетов, документов и справочников в 1С программисты часто сталкиваются с ситуацией, когда запрос к виртуальной таблице Остатки регистра накопления возвращает удвоенные значения ресурсов, хотя в физической таблице движений регистра присутствуют корректные единичные записи прихода. Разберем причины возникновения такой ошибки и рассмотрим проверенные способы восстановления корректных итогов.
Рассмотрим типовой запрос к виртуальной таблице остатков:
ВЫБРАТЬ
СодержаниеДрагметалловОстатки.ОсновноеСредство КАК ОсновноеСредство,
СодержаниеДрагметалловОстатки.ВидДМ КАК ВидДМ,
СодержаниеДрагметалловОстатки.СпособОпределенияДМ КАК СпособОпределенияДМ,
СодержаниеДрагметалловОстатки.КоличествоОстаток КАК Количество,
СодержаниеДрагметалловОстатки.СтоимостьОстаток КАК Стоимость
ИЗ
РегистрНакопления.СодержаниеДрагметаллов.Остатки(
&ДатаДокумента,
Организация = &Организация
И ОсновноеСредство = &ОсновноеСредство) КАК СодержаниеДрагметалловОстатки
Если в таблице движений регистра по указанному отбору числится только один документ прихода с количеством 0,1061, а виртуальная таблица Остатки возвращает 0,2122, корень проблемы кроется не в тексте запроса, а в повреждении агрегатных данных служебной таблицы итогов регистра накопления.
Виртуальная таблица остатков не выполняет суммирование всех движений с начала времен при каждом вызове. Платформа 1С использует механизм рассчитанных итогов (смещений), суммируя значения из таблицы итогов и дельту движений за последний период. При сбоях транзакций, некорректном завершении сеансов или сбоях СУБД в таблице итогов могут возникнуть дублирующие записи по одинаковым комбинациям измерений, что приводит к суммированию задвоенных агрегатов.
Самый быстрый и надежный способ устранить рассинхронизацию — выполнить принудительный программный сброс использования итогов по проблемному регистру и рассчитать их заново. Для этого используем методы менеджера регистра накопления:
// Отключаем использование итогов для очистки агрегатов
РегистрыНакопления.СодержаниеДрагметаллов.УстановитьИспользованиеИтогов(Ложь);
// Включаем использование и производим полный пересчет
РегистрыНакопления.СодержаниеДрагметаллов.УстановитьИспользованиеИтогов(Истина);
РегистрыНакопления.СодержаниеДрагметаллов.ПересчитатьИтоги();
Данный код можно выполнить во внешней обработке или через консоль кода. Это полностью очистит закэшированные агрегатные значения и пересчитает их с нуля на основе реальных записей таблицы движений.
Если конфигурация работает в режиме обычного приложения (толстый клиент), стандартную форму управления итогами можно вызвать через запуск отладки в тонком клиенте. Проанализируем порядок действий:
Если ошибка вызвана физическим повреждением индексов или страниц базы данных (особенно в файловом режиме базы .1CD), применяем комплексные регламентные процедуры:
chdbfl.exe (находится в каталоге bin установленной платформы) с установленным флагом исправлений.В экстренных случаях на этапе разработки помогает сброс структуры регистра:
Остатки на Обороты.Остатки и повторно обновляем конфигурацию базы данных. Таблицы итогов формируются с нуля.Если на рабочей базе невозможно немедленно выполнить регламентные операции с монопольной блокировкой, для получения точного остатка можно временно использовать прямой расчет через реальную таблицу движений регистра:
ВЫБРАТЬ
Движения.ОсновноеСредство КАК ОсновноеСредство,
Движения.ВидДМ КАК ВидДМ,
Движения.СпособОпределенияДМ КАК СпособОпределенияДМ,
СУММА(ВЫБОР
КОГДА Движения.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА Движения.Количество
ИНАЧЕ -Движения.Количество
КОНЕЦ) КАК Количество,
СУММА(ВЫБОР
КОГДА Движения.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА Движения.Стоимость
ИНАЧЕ -Движения.Стоимость
КОНЕЦ) КАК Стоимость
ИЗ
РегистрНакопления.СодержаниеДрагметаллов КАК Движения
ГДЕ
Движения.Период <= &ДатаДокумента
И Движения.Организация = &Организация
И Движения.ОсновноеСредство = &ОсновноеСредство
СГРУППИРОВАТЬ ПО
Движения.ОсновноеСредство,
Движения.ВидДМ,
Движения.СпособОпределенияДМ
Такой запрос обращается напрямую к строкам приходов и расходов, полностью игнорируя поврежденную таблицу итогов, что гарантирует получение математически верных остатков до проведения регламентного пересчета.