В процессе сопровождения баз данных «1С:Предприятие» программисты часто сталкиваются с ситуацией, когда по регистру накопления тянутся старые, «зависшие» остатки. Попытки исправить их с помощью документов корректировки иногда кажутся безуспешными: запрос к виртуальной таблице все равно показывает записи. Рассмотрим подробнее, как устроены механизмы хранения итогов, почему возникают «хвосты» и как технически грамотно привести регистр в порядок.
Прежде всего, важно понимать, что виртуальные таблицы (например, Остатки или ОстаткиИОбороты) не являются самостоятельными объектами хранения данных в СУБД. Это динамический механизм платформы. Разберем по шагам, как система получает данные для этих таблиц:
_AccumRgT. Обычно эти итоги рассчитаны на начало каждого месяца._AccumRg) за период между датой итогов и датой запроса.Выясним причину, по которой автор темы сначала не увидел результата: корректировка была сделана концом месяца, и запрос остатков выполнялся на этот же момент времени. В 1С важно учитывать границу периода. Если запрос делается на момент времени документа, сам документ (корректировка) может не войти в выборку в зависимости от настроек границы запроса. Проанализируем ситуацию: на начало следующего месяца остатки обнулились, так как документ корректировки гарантированно попал в расчет.
Существует заблуждение, что если сумма по регистру равна нулю, то запись из базы исчезает. Проанализируем, почему это не так. В таблице итогов _AccumRgT записи хранятся в разрезе всех измерений. Если ваше движение «Приход» имело заполненное измерение Склад, а движение «Расход» в корректировке — нет, то в таблице итогов останутся две строки:
В сумме (агрегированно) отчет может показать ноль, но физически в таблице итогов записи останутся. Это и есть то самое «разбухание». Рассмотрим подробнее последствия такого накопления «хвостов»:
Чтобы корректировка действительно «схлопнула» записи в таблице итогов, необходимо обеспечить полную идентичность измерений. Выясним, на что обратить внимание при программном заполнении или использовании документа КорректировкаЗаписейРегистров:
1. Идентичность измерений: Каждое измерение (Склад, Номенклатура, Характеристика, Серия, Заказ) должно в точности совпадать с тем, что зависло в остатках. Если в остатке измерение NULL, в корректировке оно тоже должно быть NULL.
2. Использование правильного типа движения: Если остаток положительный, делаем движение Расход. Если отрицательный — Приход.
3. Проверка «зависших» нулей: Для поиска записей, которые имеют нулевые ресурсы, но физически существуют в итогах, можно использовать следующий запрос к виртуальной таблице остатков:
ВЫБРАТЬ
Рег.Номенклатура,
Рег.Склад,
Рег.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК Рег
ГДЕ
Рег.КоличествоОстаток = 0
Такие записи — прямой кандидат на очистку, так как они свидетельствуют о несовпадении каких-то скрытых измерений или разделителей.
Рассмотрим по шагам, что делает процедура пересчета итогов, которую упоминал автор. Пересчет итогов — это процедура, которая полностью очищает физическую таблицу _AccumRgT и заново заполняет ее на основании данных из таблицы движений _AccumRg.
Это помогает в следующих случаях:
УдалитьОбъекты), но итоги не обновились автоматически.Важный нюанс: простой пересчет итогов не удалит «нулевые» записи, если они порождены некорректными движениями (разными измерениями). Чтобы их убрать, нужно сначала сделать правильную корректировку, которая физически закроет остатки, а затем платформа сама очистит таблицу итогов при записи документа или при очередном пересчете.
Посмотрим на практические советы, которые помогут избежать проблем с остатками в будущем:
ВводОстатков с удалением старых движений.Таким образом, мы выяснили, что «зависшие» остатки чаще всего являются следствием невнимательности к моменту времени запроса или различий в измерениях регистра. Правильное понимание работы _AccumRgT позволяет не только исправлять ошибки учета, но и существенно оптимизировать скорость работы системы.