Почему в регистрах накопления появляются остатки без регистратора и как их исправить?

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

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

Причина появления фантомных остатков без регистратора

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

  1. Таблица движений — хранит фактические записи, сформированные документами. Здесь присутствуют дата операции, тип движения (приход или расход), ссылка на документ-регистратор, номер строки, значения всех измерений и ресурсов.
  2. Таблица итогов — содержит предварительно рассчитанные агрегированные остатки на начало каждого месяца и срез текущих итогов. В структуре этой таблицы физически отсутствуют поля точного времени и ссылки на документ-регистратор, так как в ней хранятся только свернутые остатки ресурсов в разрезе измерений.

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

Почему стандартное «Тестирование и исправление» не всегда устраняет проблему

Многие специалисты в первую очередь запускают режим Тестирование и исправление (ТиИ) в конфигураторе, выбирая пункт Пересчет итогов, однако фантомные остатки в исторических периодах часто сохраняются. Выясним причину такого поведения платформы.

Стандартный пересчет итогов в рамках ТиИ ориентирован на актуализацию данных: платформа проверяет и пересчитывает итоги вперед от установленной границы рассчитанных итогов до текущего момента. Если свертка выполнялась в далеком прошлом, а граница рассчитанных итогов находится в актуальном рабочем периоде, ТиИ просто не затрагивает старые срезы. Чтобы гарантированно пересобрать таблицы итогов через ТиИ, флаг Пересчет итогов необходимо запускать строго в комбинации с пунктом Реструктуризация таблиц информационной базы. Именно реструктуризация полностью пересоздает структуры таблиц в СУБД и очищает устаревшие агрегаты.

Способ 1. Пересчет итогов через режим «Все функции» («Функции для технического специалиста»)

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

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

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

Способ 2. Выгрузка и загрузка базы данных через файл выгрузки (.dt)

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

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

Способ 3. Программный сброс и пересчет итогов через встроенный язык

Если требуется исправить остатки по расписанию, в пакетном режиме или в рамках собственной сервисной обработки, воспользуемся методами менеджера регистра накопления. Рассмотрим несколько вариантов программного воздействия.

Первый вариант — полный сброс механизма итогов для конкретного регистра. Отключение и повторное включение свойства очищает таблицу итогов и инициирует ее полное перестроение:


ИмяРегистра = "ПрочиеРасчеты";
РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Ложь);
РегистрыНакопления[ИмяРегистра].УстановитьИспользованиеИтогов(Истина);

Второй вариант — точечный пересчет за заданный интервал, когда необходимо обновить исторические агрегаты только в периоде выполнения свертки:


ИмяРегистра = "РасходыПриУСН";
ДатаНачала = '20160101000000';
ДатаОкончания = '20161231235959';

РегистрыНакопления[ИмяРегистра].ПересчитатьИтогиЗаПериод(ДатаНачала, ДатаОкончания);

Третий вариант — вызов метода ПересчитатьИтоги() у менеджера регистра. В отличие от конфигураторского ТиИ, метод менеджера выполняет полный принудительный перерасчет всех итогов именно для выбранного объекта метаданных без ограничений по текущей границе.

Рекомендации при проведении свертки базы

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

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