Почему запрос к остаткам регистра накопления двоит данные и как это исправить

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке отчетов, документов и справочников в 1С программисты часто сталкиваются с ситуацией, когда запрос к виртуальной таблице Остатки регистра накопления возвращает удвоенные значения ресурсов, хотя в физической таблице движений регистра присутствуют корректные единичные записи прихода. Разберем причины возникновения такой ошибки и рассмотрим проверенные способы восстановления корректных итогов.

Анализ проблемы и симптомов

Рассмотрим типовой запрос к виртуальной таблице остатков:


ВЫБРАТЬ
    СодержаниеДрагметалловОстатки.ОсновноеСредство КАК ОсновноеСредство,
    СодержаниеДрагметалловОстатки.ВидДМ КАК ВидДМ,
    СодержаниеДрагметалловОстатки.СпособОпределенияДМ КАК СпособОпределенияДМ,
    СодержаниеДрагметалловОстатки.КоличествоОстаток КАК Количество,
    СодержаниеДрагметалловОстатки.СтоимостьОстаток КАК Стоимость
ИЗ
    РегистрНакопления.СодержаниеДрагметаллов.Остатки(
        &ДатаДокумента,
        Организация = &Организация
            И ОсновноеСредство = &ОсновноеСредство) КАК СодержаниеДрагметалловОстатки

Если в таблице движений регистра по указанному отбору числится только один документ прихода с количеством 0,1061, а виртуальная таблица Остатки возвращает 0,2122, корень проблемы кроется не в тексте запроса, а в повреждении агрегатных данных служебной таблицы итогов регистра накопления.

Виртуальная таблица остатков не выполняет суммирование всех движений с начала времен при каждом вызове. Платформа 1С использует механизм рассчитанных итогов (смещений), суммируя значения из таблицы итогов и дельту движений за последний период. При сбоях транзакций, некорректном завершении сеансов или сбоях СУБД в таблице итогов могут возникнуть дублирующие записи по одинаковым комбинациям измерений, что приводит к суммированию задвоенных агрегатов.

Способ 1. Программный сброс и полный пересчет итогов

Самый быстрый и надежный способ устранить рассинхронизацию — выполнить принудительный программный сброс использования итогов по проблемному регистру и рассчитать их заново. Для этого используем методы менеджера регистра накопления:


// Отключаем использование итогов для очистки агрегатов
РегистрыНакопления.СодержаниеДрагметаллов.УстановитьИспользованиеИтогов(Ложь);

// Включаем использование и производим полный пересчет
РегистрыНакопления.СодержаниеДрагметаллов.УстановитьИспользованиеИтогов(Истина);
РегистрыНакопления.СодержаниеДрагметаллов.ПересчитатьИтоги();

Данный код можно выполнить во внешней обработке или через консоль кода. Это полностью очистит закэшированные агрегатные значения и пересчитает их с нуля на основе реальных записей таблицы движений.

Способ 2. Управление итогами через стандартный интерфейс платформы

Если конфигурация работает в режиме обычного приложения (толстый клиент), стандартную форму управления итогами можно вызвать через запуск отладки в тонком клиенте. Проанализируем порядок действий:

  1. Открываем Конфигуратор.
  2. Переходим в меню Сервис → Параметры → вкладка Общие.
  3. В группе параметров запуска устанавливаем флаг Управляемое приложение и обычное приложение.
  4. Запускаем отладку через меню Отладка → Начать отладку → Тонкий клиент.
  5. В запущенном сеансе открываем меню Все функции (или Функции для технического специалиста) → Стандартные → Управление итогами.
  6. Выбираем проблемный регистр, нажимаем Полные возможности, отключаем текущие итоги, а затем повторно включаем их и выполняем установку периода рассчитанных итогов.

Способ 3. Тестирование, исправление и реструктуризация таблиц базы

Если ошибка вызвана физическим повреждением индексов или страниц базы данных (особенно в файловом режиме базы .1CD), применяем комплексные регламентные процедуры:

  1. Для файловых баз предварительно запускаем утилиту chdbfl.exe (находится в каталоге bin установленной платформы) с установленным флагом исправлений.
  2. Создаем резервную копию базы данных.
  3. В Конфигураторе открываем меню Администрирование → Тестирование и исправление...
  4. Устанавливаем флаги Пересчет итогов и Реструктуризация таблиц информационной базы.
  5. Запускаем процедуру выполнения. В процессе реструктуризации платформа пересоздает физические таблицы регистра и удаляет некорректные служебные записи.

Способ 4. Пересоздание таблиц через изменение вида регистра в конфигураторе

В экстренных случаях на этапе разработки помогает сброс структуры регистра:

  1. В дереве метаданных открываем свойства проблемного регистра накопления.
  2. Меняем свойство Вид регистра со значения Остатки на Обороты.
  3. Применяем изменения (обновляем конфигурацию базы данных). При этом физическая таблица остатков и итогов удаляется СУБД.
  4. Возвращаем свойство Вид регистра обратно в значение Остатки и повторно обновляем конфигурацию базы данных. Таблицы итогов формируются с нуля.

Способ 5. Временный обходной запрос по таблице движений

Если на рабочей базе невозможно немедленно выполнить регламентные операции с монопольной блокировкой, для получения точного остатка можно временно использовать прямой расчет через реальную таблицу движений регистра:


ВЫБРАТЬ
    Движения.ОсновноеСредство КАК ОсновноеСредство,
    Движения.ВидДМ КАК ВидДМ,
    Движения.СпособОпределенияДМ КАК СпособОпределенияДМ,
    СУММА(ВЫБОР
        КОГДА Движения.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
            ТОГДА Движения.Количество
        ИНАЧЕ -Движения.Количество
    КОНЕЦ) КАК Количество,
    СУММА(ВЫБОР
        КОГДА Движения.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
            ТОГДА Движения.Стоимость
        ИНАЧЕ -Движения.Стоимость
    КОНЕЦ) КАК Стоимость
ИЗ
    РегистрНакопления.СодержаниеДрагметаллов КАК Движения
ГДЕ
    Движения.Период <= &ДатаДокумента
    И Движения.Организация = &Организация
    И Движения.ОсновноеСредство = &ОсновноеСредство
СГРУППИРОВАТЬ ПО
    Движения.ОсновноеСредство,
    Движения.ВидДМ,
    Движения.СпособОпределенияДМ

Такой запрос обращается напрямую к строкам приходов и расходов, полностью игнорируя поврежденную таблицу итогов, что гарантирует получение математически верных остатков до проведения регламентного пересчета.

← На главную