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