В практике работы с конфигурацией БГУ 2.0 (Бухгалтерия государственного учреждения) технические специалисты иногда сталкиваются с парадоксальной ситуацией: в регистре накопления СтоимостьОбъектовОСиНМА остатки по конкретному объекту ведут себя непредсказуемо. Они могут присутствовать на одну дату, полностью исчезнуть на другую и снова появиться через несколько месяцев, при этом в системе отсутствуют документы расхода или сторнирующие записи. Разберем подробно, почему это происходит и как вернуть корректные данные в отчеты.
Рассмотрим ситуацию, когда при анализе движений по регистру СтоимостьОбъектовОСиНМА мы видим приходную запись от 31.12.2019 (ввод остатков). Логично ожидать, что этот остаток будет неизменным до тех пор, пока не появится документ списания, перемещения или реализации. Однако при формировании запроса или отчета выясняется следующее:
Проанализируем причину такого поведения. В платформе «1С:Предприятие 8.3» остатки регистров накопления не вычисляются «на лету» путем сложения всех записей с начала веков. Для ускорения работы система использует таблицы итогов, в которых хранятся рассчитанные значения на начало каждого месяца. Если в одной из таких таблиц (например, за ноябрь) произошел технический сбой или некорректная запись, мы получаем «дыру» в данных. В феврале же система может обратиться к другой контрольной точке итогов, которая рассчитана верно, поэтому остаток «возвращается».
Многие администраторы баз данных полагаются на стандартный механизм Тестирование и исправление с флагом Пересчет итогов. Однако практика показывает, что в сложных случаях рассогласования (особенно при использовании механизма разделителя итогов) ТИИ может пропустить регистр, если его метаданные кажутся платформе корректными. В этом случае требуется принудительное воздействие на конкретный регистр накопления.
Как выяснилось в ходе обсуждения проблемы, наиболее действенным методом является вызов метода ПересчитатьИтоги() непосредственно для проблемного регистра через консоль кода или внешнюю обработку. Этот метод полностью очищает таблицы итогов регистра и пересчитывает их заново на основании таблицы движений.
Рассмотрим пример кода, который поможет решить задачу:
// Выбираем конкретный регистр накопления, в котором наблюдаются проблемы
Регистр = РегистрыНакопления.СтоимостьОбъектовОСиНМА;
// Полный пересчет итогов по всему регистру
// Внимание: на больших базах процедура может занять время и требует монопольного доступа
Регистр.УстановитьИспользованиеИтогов(Ложь);
Регистр.УстановитьИспользованиеИтогов(Истина);
Регистр.ПересчитатьИтоги();
Сообщить("Пересчет итогов по регистру ОС завершен успешно.");
Если база данных очень большая и полный пересчет недопустим, мы можем использовать метод ПересчитатьИтогиЗаПериод(). Разберем, как это сделать для конкретного временного интервала, где наблюдается «пропадание»:
НачалоПериода = Дата(2020, 11, 01);
КонецПериода = Дата(2021, 02, 01);
РегистрыНакопления.СтоимостьОбъектовОСиНМА.ПересчитатьИтогиЗаПериод(НачалоПериода, КонецПериода);
Если пересчет итогов не помог, проанализируем саму таблицу движений. Существует вероятность, что в регистре есть записи, которые не видны в стандартных отчетах, но влияют на результат. Выясним основные причины:
Активность. Такие записи присутствуют в таблице движений, но не учитываются при расчете итогов.Организация, КФО или ИнвентарныйНомер. В БГУ 2.0 отсутствие аналитики в одном из документов может «разрывать» остатки по конкретному объекту.Посмотрим на ситуацию со стороны методологии учета. В конфигурации БГУ 2.0 документ Ввод остатков ОС, НМА и НПА должен иметь дату 31.12.XXXX 23:59:59. Рассмотрим важные моменты:
01.01.XXXX 00:00:00, это может привести к тому, что остатки не попадут в отчетность за прошлый год и некорректно отобразятся в межотчетный период.Прежде чем писать код, мы можем воспользоваться встроенными средствами платформы. Перейдем в раздел Администрирование — Обслуживание — Регламентные операции — Управление итогами. Проанализируем следующие показатели:
Период рассчитанных итогов: Если дата актуальности итогов значительно отстает от текущей даты, платформа начинает рассчитывать остатки динамически, что может приводить к ошибкам при наличии больших объемов данных. Установим период итогов на текущий месяц.
Разделитель итогов: Если в регистре включен режим разделения итогов, попробуйте временно отключить его в конфигураторе (если это допустимо для вашей нагрузки) и выполнить пересчет. Это часто «схлопывает» разрозненные записи, которые мешали корректному отображению остатка.
Чтобы в будущем избежать «прыгающих» остатков, рекомендуем выполнять следующие действия при регламентном обслуживании базы:
REINDEX и UPDATE STATISTICS. Это помогает оптимизатору запросов 1С правильно обращаться к таблицам итогов.Таким образом, мы выяснили, что проблема «невидимых» остатков в БГУ 2.0 чаще всего носит чисто технический характер и связана с повреждением вспомогательных таблиц итогов. Использование метода ПересчитатьИтоги() является самым быстрым и надежным способом восстановления целостности данных.