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

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Сворачивание информационной базы 1С — это стандартная, но чрезвычайно ответственная процедура, предназначенная для уменьшения объема базы данных и повышения быстродействия системы. В процессе свертки удаляются устаревшие документы за прошлые периоды, а вместо них создаются документы ввода остатков (как правило, это документы КорректировкаЗаписейРегистров или специализированные документы ввода остатков). Однако иногда после успешно завершенной свертки технические специалисты сталкиваются со странным поведением системы: отчеты выводят некорректные остатки товаров или взаиморасчетов, хотя физические документы-регистраторы содержат абсолютно верные цифры.

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

Анализ проблемы: расхождение реальных движений и виртуальных остатков

Рассмотрим классическую ситуацию, с которой часто сталкиваются разработчики. Вы выполнили свертку базы данных на определенную дату. Для проверки корректности данных вы формируете запрос к виртуальной таблице остатков регистра накопления ТоварыНаСкладах.Остатки на конец текущего дня:


ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки(
        &Дата,
        Номенклатура В (&Номенклатура)
            И Склад В (&Склад)) КАК ТоварыНаСкладахОстатки

Запрос возвращает некорректное число (например, 97 единиц товара). Чтобы разобраться, откуда взялась эта цифра, мы пишем запрос к таблице физических движений этого же регистра за весь период существования свернутой базы:


ВЫБРАТЬ
    ТоварыНаСкладах.Номенклатура КАК Номенклатура,
    ТоварыНаСкладах.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
    ТоварыНаСкладах.Количество КАК Количество,
    ТоварыНаСкладах.Регистратор КАК Регистратор,
    ТоварыНаСкладах.ВидДвижения КАК ВидДвижения
ИЗ
    РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
ГДЕ
    ТоварыНаСкладах.Номенклатура = &Номенклатура
    И ТоварыНаСкладах.Склад = &Склад

Этот запрос возвращает всего две записи:

  1. Документ КорректировкаЗаписейРегистров (ввод остатков после свертки) — движение Приход на сумму 15 единиц.
  2. Документ ЧекККМ (текущие продажи после даты свертки) — движение Расход на сумму 1 единица.

Математически очевидно, что итоговый остаток должен составлять 14 единиц. Однако виртуальная таблица упорно возвращает 97. При этом стандартное Тестирование и Исправление (ТиИ) через Конфигуратор с включенными флагами «Реиндексация таблиц» и «Пересчет итогов» на рабочем компьютере не дает никакого результата. Выясним, почему так происходит, и разберем четыре основные причины этой проблемы.

Решение 1. Очистка локального кэша платформы 1С

Если тестирование и исправление базы данных не приносит результатов на рабочем компьютере, но при переносе базы на другой ПК и повторном выполнении ТиИ остатки мгновенно приходят в норму — проблема кроется в локальном кэше платформы 1С:Предприятие.

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

Для устранения этой проблемы выполним очистку кэша по шагам:

  1. Полностью закроем все сеансы работы с базой данных 1С на проблемном компьютере.
  2. Перейдем в каталоги хранения локального кэша текущего пользователя операционной системы Windows. Обычно они располагаются по следующим путям:
    • %userprofile%\AppData\Local\1C\1Cv8
    • %userprofile%\AppData\Roaming\1C\1Cv8
  3. Удалим все папки с шестнадцатеричными именами вида 2c9f56a3-678a-4b9d-b4ef.... В этих папках как раз и содержатся временные кэшированные данные конфигураций и баз данных.
  4. В качестве альтернативы можно просто удалить базу данных из списка запуска в окне 1С и добавить её заново. При этом старый кэш перестанет ассоциироваться с базой, и создастся новая чистая папка.

Решение 2. Обход багов платформы (в частности, линейки 8.3.8)

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

Для исправления ситуации выполним следующие действия:

Решение 3. Принудительный «жесткий» сброс и пересчет итогов

Иногда стандартный механизм «Пересчета итогов» в Конфигураторе не выполняет физическую очистку таблиц итогов, а лишь пытается наложить новые расчеты на уже существующие «фантомные» записи. В этом случае нам поможет принудительный сброс рассчитанных итогов далеко в прошлое с последующим полным расчетом «с нуля».

Проанализируем процедуру ручного сброса через режим Предприятия:

  1. Откроем базу в режиме «1С:Предприятие» под правами администратора.
  2. Перейдем в меню Операции — Управление итогами (для обычных форм) или воспользуемся стандартной обработкой «Управление итогами и агрегатами» в разделе «Администрирование» (для управляемых форм).
  3. Установим дату рассчитанных итогов далеко в прошлое (например, на начало 2000 года).
  4. Нажмем кнопку Применить. Платформа полностью очистит все физические таблицы итогов за все последующие 20 лет, оставив только «чистые» физические движения документов.
  5. После завершения операции вернем дату рассчитанных итогов на текущий рабочий месяц и снова нажмем Применить. Платформа выполнит полный последовательный расчет остатков с самого начала ведения учета.

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


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

// Включаем использование итогов обратно - это форсирует полную очистку и пересоздание таблиц
РегистрыНакопления.ТоварыНаСкладах.УстановитьИспользованиеИтогов(Истина);

// Вызываем метод принудительного пересчета за весь период ведения учета
РегистрыНакопления.ТоварыНаСкладах.ПересчитатьИтогиЗаПериод();

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

Решение 4. Устранение частично завершенных транзакций (ошибок СУБД)

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

В такой ситуации в базе возникают «битые» или «сиротские» записи итогов, у которых нет физических документов-регистраторов. Стандартная таблица остатков обращается к ним напрямую, искажая картину.

Для исправления такой проблемы необходимо выполнить полное Тестирование и Исправление (ТиИ) со следующими обязательными настройками:

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

← На главную