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