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