При работе с запросами к регистру бухгалтерии в платформе 1С:Предприятие разработчики часто сталкиваются с виртуальными полями ОстатокДт, ОстатокКт и базовым полем Остаток. У начинающих специалистов и даже у опытных бухгалтеров возникает резонный вопрос: как именно рассчитываются эти показатели, почему в базе данных они хранятся определенным образом и как тип счета влияет на итоговые значения в отчетах?
В этой статье мы подробно разберем внутреннее устройство регистра бухгалтерии, изучим математику расчета остатков на физическом уровне базы данных и на уровне виртуальных таблиц, а также рассмотрим особенности работы с активно-пассивными счетами и развернутыми остатками.
Для начала разберем, как данные хранятся на уровне СУБД (например, в MS SQL Server или PostgreSQL). Для оптимизации производительности и экономии дискового пространства платформа 1С не хранит отдельно дебетовые и кредитовые остатки для каждой записи итогов. В физической таблице итогов регистра бухгалтерии (которая обычно имеет префикс _AccRgTotals) для каждого числового ресурса (например, «Сумма») создаются всего три колонки:
Дебет - Кредит).Таким образом, на физическом уровне базы данных поле Остаток всегда рассчитывается по единой формуле: Остаток = Дебет - Кредит. Все остальные поля, которые мы привыкли видеть в конструкторе запросов (такие как ОстатокДт и ОстатокКт), физически в таблицах базы данных не существуют. Они являются виртуальными полями, которые платформа 1С рассчитывает «на лету» в момент выполнения запроса к виртуальным таблицам остатков.
Выясним, по каким правилам платформа преобразует единый физический Остаток в привычные для бухгалтера дебетовые и кредитовые показатели. Это преобразование жестко завязано на свойство «Вид счета» (Активный, Пассивный или Активно-пассивный), заданное в Плане счетов.
Проанализируем алгоритм работы платформы для каждого вида счета:
1. Активный счет
Для активных счетов (например, 01 «Основные средства», 10 «Материалы», 50 «Касса») нормальным считается дебетовое сальдо. Платформа рассчитывает поля следующим образом:
ОстатокДт всегда возвращает значение физического поля Остаток (даже если оно отрицательное, что в бухгалтерии называется «красным сальдо»).ОстатокКт всегда возвращает 0 (или NULL).2. Пассивный счет
Для пассивных счетов (например, 80 «Уставный капитал», 66 «Расчеты по краткосрочным кредитам») нормальным является кредитовое сальдо. Платформа выполняет обратную математическую операцию:
ОстатокКт всегда возвращает значение физического поля Остаток, умноженное на -1. Соответственно, если дебет превысил кредит, мы получим отрицательное число в поле ОстатокКт.ОстатокДт всегда возвращает 0 (или NULL).3. Активно-пассивный счет
Для активно-пассивных счетов (например, 60 «Расчеты с поставщиками», 62 «Расчеты с покупателями», 76 «Расчеты с разными дебиторами и кредиторами») сальдо может быть как дебетовым, так и кредитовым. Здесь платформа анализирует знак физического остатка:
Остаток > 0 (то есть Дебет больше Кредита), то значение записывается в виртуальное поле ОстатокДт, а поле ОстатокКт приравнивается к 0.Остаток < 0 (то есть Кредит больше Дебета), то положительное значение (умноженное на -1) записывается в поле ОстатокКт, а поле ОстатокДт приравнивается к 0.При составлении бухгалтерской отчетности (например, бухгалтерского баланса) стандартного свертывания остатков по активно-пассивным счетам часто бывает недостаточно. Рассмотрим классический пример с расчетами по счету 62 «Расчеты с покупателями и заказчиками»:
Если мы запросим обычные свернутые поля ОстатокДт и ОстатокКт в целом по счету 62, платформа просто сложит их математически. Мы получим только общую разницу: ОстатокКт = 50 000 рублей. С точки зрения бухгалтерского учета это грубейшая ошибка, искажающая реальную картину активов и обязательств предприятия.
Для решения этой проблемы в виртуальных таблицах остатков регистра бухгалтерии предусмотрены поля РазвернутыйОстатокДт и РазвернутыйОстатокКт. При их расчете платформа выполняет следующие действия:
РазвернутыйОстатокДт (в нашем примере — 100 000 рублей).РазвернутыйОстатокКт (в нашем примере — 150 000 рублей).Важное правило оптимизации: Развернутый остаток рассчитывается только по тем разрезам субконто и измерениям, которые реально указаны в параметрах виртуальной таблицы или задействованы в группировках запроса. Если выполнить запрос по счету в целом, не указав субконто, развернутый остаток вернет абсолютно те же значения, что и обычный свернутый остаток.
Рассмотрим ситуацию, когда нам необходимо получить остатки на середину месяца, например на 15-е число. Физическая таблица итогов хранит рассчитанные данные только на 1-е число каждого месяца (на 00:00:00).
Чтобы не пересчитывать все движения с самого начала ведения учета, платформа использует эффективный двухшаговый алгоритм:
Для обеспечения высокой скорости работы этой схемы крайне важно своевременно выполнять регламентную операцию «Управление итогами» и держать итоги рассчитанными по текущий месяц.
Посмотрим на практический пример запроса, который наглядно демонстрирует выборку всех видов остатков по счету расчетов с покупателями:
ВЫБРАТЬ
ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
ХозрасчетныйОстатки.Субконто2 КАК Договор,
ХозрасчетныйОстатки.ОстатокДт КАК СвернутыйДебет,
ХозрасчетныйОстатки.ОстатокКт КАК СвернутыйКредит,
ХозрасчетныйОстатки.РазвернутыйОстатокДт КАК РазвернутыйДебет,
ХозрасчетныйОстатки.РазвернутыйОстатокКт КАК РазвернутыйКредит,
ХозрасчетныйОстатки.Остаток КАК ФизическийОстаток
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, &ВидыСубконто, ) КАК ХозрасчетныйОстатки
Использование правильных полей остатков в запросах гарантирует получение корректных данных в отчетах и исключает возникновение ошибок при формировании регламентированной бухгалтерской отчетности.