При формировании стандартных бухгалтерских отчетов (например, карточки счета, отчета по счету или оборотно-сальдовой ведомости) бухгалтеры и программисты иногда сталкиваются с парадоксальной ситуацией: по конкретному объекту аналитики за выбранный день нет ни одного движения и обороты равны нулю, однако сальдо на начало дня отличается от сальдо на конец дня. Рассмотрим подробно, почему возникает подобная ошибка, как устроены внутренние механизмы платформы 1С и какими способами можно восстановить целостность данных.
Чтобы понять механику сбоя, разберем, как платформа «1С:Предприятие» хранит и рассчитывает остатки по регистрам бухгалтерии:
Основным методом устранения такой рассинхронизации является процедура пересчета итогов регистра. Разберем доступные варианты решения задачи: от глобального пересчета до точечных программных методов.
Это классический и самый надежный способ, гарантирующий полное приведение всех служебных таблиц в актуальное состояние. Однако следует учитывать, что он блокирует информационную базу и требует монопольного режима.
Важный нюанс: данная операция выполняет пересчет итогов по всем регистрам информационной базы сразу (регистры накопления, бухгалтерии, расчета), что на больших объемах данных может занять существенное время.
Если нет возможности перезапускать базу в конфигураторе, проанализируем режим «1С:Предприятие». В стандартных прикладных решениях доступна обработка управления итогами:
РегистрыБухгалтерии.Хозрасчетный.Для выполнения этой процедуры пользователю требуется роль с правами УправлениеИтогами для соответствующего объекта метаданных.
Если база данных имеет значительный объем и полный пересчет займет слишком много времени, применим методы встроенного языка платформы 1С для точечного воздействия на нужный регистр и проблемный диапазон дат.
Посмотрим на пример кода, позволяющего обновить итоги только по регистру Хозрасчетный за заданный интервал дат:
НачалоПериода = Дата(2016, 1, 1);
КонецПериода = КонецМесяца(НачалоПериода);
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтогиЗаПериод(НачалоПериода, КонецПериода);
Метод ПересчитатьИтогиЗаПериод() менеджера регистра позволяет обновить только те срезы данных, где обнаружена ошибка, не затрагивая исторические периоды и другие регистры системы.
В ситуациях, когда стандартный пересчет не устраняет логические расхождения таблиц, разберем по шагам радикальный программный алгоритм — физическую очистку и пересоздание внутренней таблицы итогов только для одного регистра:
// Отключаем использование итогов, что очищает внутренние таблицы агрегатов
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Ложь);
// Включаем механизм обратно
РегистрыБухгалтерии.Хозрасчетный.УстановитьИспользованиеИтогов(Истина);
// Устанавливаем границу рассчитанных итогов (например, на начало текущего месяца)
ГраницаИтогов = НачалоМесяца(ТекущаяДата());
РегистрыБухгалтерии.Хозрасчетный.УстановитьПериодРассчитанныхИтогов(ГраницаИтогов);
// Выполняем расчет
РегистрыБухгалтерии.Хозрасчетный.ПересчитатьИтоги();
Этот подход гарантирует полное удаление поврежденных записей из таблицы итогов регистра бухгалтерии и рассчитывает их заново на основе фактических записей журнала проводок.
chdbfl.exe тестирует только физическую структуру файла базы (страницы данных, B-деревья), но не проверяет логическую целостность между таблицами движений и таблицами итогов.