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

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

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

Выясним причины возникновения проблемы

Чтобы понять механику сбоя, разберем, как платформа «1С:Предприятие» хранит и рассчитывает остатки по регистрам бухгалтерии:

  1. Механизм хранения итогов на границах периодов. Платформа 1С хранит рассчитанные остатки регистра бухгалтерии с определенной периодичностью (как правило, на начало каждого месяца в 00:00:00). Когда строится отчет, начальный остаток (например, на утро 1 января) система запрашивает напрямую из служебной таблицы итогов. Конечный остаток на конец дня платформа вычисляет динамически: берется опорная точка и суммируются фактические записи из таблицы движений за интервал. Если в базе произошел сбой и запись в таблице итогов рассинхронизировалась с записями в таблице движений (проводками), начальное сальдо считывается искаженным, а конечное формируется по фактическим проводкам. В итоге сальдо различается даже при пустых оборотах за сутки.
  2. Сбои транзакций и блокировки СУБД. Аварийное отключение сеансов, перезагрузка сервера баз данных или конфликты взаимоблокировок во время проведения и отмены проведения документов могут нарушить синхронизацию: движения могут зафиксироваться, а агрегированные итоги останутся необновленными.
  3. Специфика отборов и субконто. Иногда расхождение связано с отображением данных: если в проводках не заполнено субконто, по фильтру конкретной номенклатуры обороты не отобразятся, но при некорректных итогах виртуальная таблица выдаст нестыковку. Также влияние могут оказывать движения, записанные строго на границу секунды (00:00:00 или 23:59:59).

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

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

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

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

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

Способ 2. Использование штатной обработки «Управление итогами»

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

  1. Откроем интерфейс управления итогами (через меню Все функции или Функции для технического специалиста → Стандартные → Управление итогами).
  2. Найдем в списке регистр РегистрыБухгалтерии.Хозрасчетный.
  3. Установим требуемый период рассчитанных итогов и запустим пересчет.

Для выполнения этой процедуры пользователю требуется роль с правами УправлениеИтогами для соответствующего объекта метаданных.

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

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

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


НачалоПериода = Дата(2016, 1, 1);
КонецПериода  = КонецМесяца(НачалоПериода);

РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтогиЗаПериод(НачалоПериода, КонецПериода);

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

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

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


// Отключаем использование итогов, что очищает внутренние таблицы агрегатов
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Ложь);

// Включаем механизм обратно
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Истина);

// Устанавливаем границу рассчитанных итогов (например, на начало текущего месяца)
ГраницаИтогов = НачалоМесяца(ТекущаяДата());
РегистрыБухгалтерии.Хозрасчетный.УстановитьПериодРассчитанныхИтогов(ГраницаИтогов);

// Выполняем расчет
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтоги();

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

Ограничения и важные предупреждения

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