Почему различаются остатки по счету 68.02 на конец дня и начало следующего в 1С:УПП

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет Промышленность, строительство и АПК
← На главную

В практике работы с программой 1С:Управление производственным предприятием (УПП) технические специалисты и бухгалтеры иногда сталкиваются с парадоксальной ситуацией: остаток по счету на конец одного периода не совпадает с остатком на начало следующего. Например, сформировав оборотно-сальдовую ведомость (ОСВ) по счету 68.02 на 30 июня, мы видим одну сумму, а открыв ведомость на 1 июля — другую. Еще более странно выглядит ситуация, когда изменение периода формирования отчета всего на один день (например, с 1 апреля вместо 2 апреля) полностью меняет конечный остаток на 30 июня. Разберем детально, почему это происходит и как исправить данную проблему.

Причина проблемы: Механизм хранения итогов в 1С

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

  1. Таблица движений (основная): здесь записываются каждая проводка, каждый документ. Это «первоисточник» данных.
  2. Таблица итогов (служебная): здесь хранятся суммарные остатки и обороты, рассчитанные на начало каждого месяца. Это сделано для ускорения работы системы, чтобы при формировании отчета за год программе не приходилось пересчитывать миллионы записей с самого начала ведения учета.

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

Рассмотрим ситуацию автора: отчет с 1 апреля дает неверный итог, а со 2 апреля — верный. Это происходит потому, что при запросе с 1-го числа система обращается к «сломанной» точке итогов на 1 апреля. При запросе со 2-го числа алгоритм может выбрать расчет от другой точки (например, от итогов на 1 мая назад), и результат получается иным.

Решение 1: Пересчет итогов через пользовательский режим

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

Перейдем в меню Операции — Управление итогами. В открывшемся окне мы увидим список всех регистров. Нас интересует регистр бухгалтерии (Хозрасчетный). Проанализируем текущую дату рассчитанных итогов. Если она сильно отстает от текущей даты, это первая причина проблем.

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

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

Решение 2: Программный пересчет итогов

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


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

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

Решение 3: Тестирование и исправление в Конфигураторе

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

  1. Обязательно создаем резервную копию базы данных.
  2. Заходим в Конфигуратор в монопольном режиме.
  3. Выбираем пункт меню Администрирование — Тестирование и исправление.
  4. В списке проверок выбираем только пункт Пересчет итогов.
  5. Нажимаем Выполнить.

В процессе выполнения 1С полностью очистит таблицы _AccRgTotals (таблицы итогов в SQL) и заново заполнит их на основании данных из таблиц движений (_AccRg...). Это гарантированно устраняет любые расхождения между остатками на разные даты.

Решение 4: Использование режима загрузки данных

Иногда полезно «встряхнуть» конкретный документ, который, как кажется, влияет на итоги. Хотя итоги — это проблема регистра, а не документа, перепроведение документа в режиме Загрузка = Истина иногда помогает инициировать цепочку обновлений записей в СУБД. Проанализируем пример кода для программной перезаписи проводок документа:


ПроблемныйДокументОбъект = ПроблемныйДокументСсылка.ПолучитьОбъект();
// Устанавливаем режим загрузки, чтобы избежать лишних проверок, но обновить итоги
ПроблемныйДокументОбъект.ОбменДанными.Загрузка = Истина;
// Записываем только движения, если сам документ менять не нужно
ПроблемныйДокументОбъект.Записать(РежимЗаписиДокумента.Запись);

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

Профилактика возникновения ошибок

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

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

← На главную