В практике разработчика 1С часто возникает задача получить данные, идентичные отчету Оборотно-сальдовая ведомость (ОСВ), программным путем. Одной из самых коварных ловушек здесь является получение развернутого сальдо по активно-пассивным счетам, таким как 69, 70, 71 или 76. Обычный запрос к виртуальной таблице остатков часто возвращает «свернутую» сумму (разницу между дебетом и кредитом), в то время как бухгалтер видит в отчете суммы и в дебете, и в кредите одновременно.
В рамках данной статьи мы подробно разберем, как работает механизм разворота сальдо, проанализируем ошибки начинающих разработчиков и составим правильный запрос, который позволит получить корректные данные в разрезе любой аналитики.
Прежде чем приступать к написанию кода, давайте выясним причину возникновения проблемы. Развернутое сальдо — это сумма остатков по всем разрезам аналитики без их предварительного взаимозачета. Рассмотрим классический пример: счет 69.11 «Налоги и взносы». По одному виду платежа у организации может быть переплата (дебетовый остаток), а по другому — задолженность (кредитовый остаток).
Если мы просто сложим эти цифры, мы получим свернутое сальдо. Однако для целей бухгалтерского баланса и отчетности нам нужно видеть обе суммы раздельно. В 1С это реализуется через настройки счета в Плане счетов. Только счета, помеченные как Активно-Пассивные, поддерживают корректное хранение и вывод развернутого остатка по дебету и кредиту одновременно.
В системе 1С:Предприятие 8 для получения остатков чаще всего используются две виртуальные таблицы регистра бухгалтерии. Рассмотрим особенности каждой из них в контексте нашей задачи.
1. Виртуальная таблица «Остатки»
Эта таблица по умолчанию возвращает свернутый результат. Если вы просто обратитесь к полям СуммаОстатокДт или СуммаОстатокКт, система схлопнет данные. Чтобы получить подобие развернутого сальдо через эту таблицу, необходимо обязательно:
ВидыСубконто. Если этого не сделать, система не поймет, в разрезе каких аналитик нужно «держать» разворот, и выдаст общую разницу по счету.Организация и Подразделение).2. Виртуальная таблица «ОстаткиИОбороты»
Это наиболее мощный инструмент для решения нашей задачи. В ней предусмотрены специальные расчетные поля, которые система вычисляет автоматически:
СуммаКонечныйРазвернутыйОстатокДтСуммаКонечныйРазвернутыйОстатокКтВажно помнить, что эти поля рассчитываются на лету. Их корректность напрямую зависит от седьмого параметра виртуальной таблицы — «Метод построения развернутого сальдо». Рассмотрим подробнее, как использовать этот механизм.
Проанализируем ситуацию, когда нам нужно получить развернутое сальдо по счету 69.11. Основная ошибка заключается в том, что разработчики забывают про иерархию аналитики и настройки разрезов. Чтобы запрос в консоли выдал тот же результат, что и ОСВ, мы должны четко следовать алгоритму.
При обращении к таблице Хозрасчетный.ОстаткиИОбороты мы должны указать период, счет и, что критически важно, состав субконто. Если мы не укажем виды субконто, по которым нужно разворачивать итоги, поля развернутого остатка могут выдать результат, идентичный обычному остатку.
Рассмотрим пример запроса, который успешно решает проблему получения кредитового развернутого сальдо. Мы будем использовать виртуальную таблицу ОстаткиИОбороты, так как она предоставляет наиболее прозрачный доступ к нужным нам полям.
ВЫБРАТЬ
ХозрасчетныйОстатки.Субконто1 КАК ВидПлатежа,
ХозрасчетныйОстатки.СуммаКонечныйРазвернутыйОстатокКт КАК СуммаОстатокКт
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
&НачалоПериода,
&КонецПериода,
,
,
Счет В ИЕРАРХИИ (&Счет),
&МассивВидовСубконто,
) КАК ХозрасчетныйОстатки
ИТОГИ
СУММА(СуммаОстатокКт)
ПО
ОБЩИЕ
В данном примере обратите внимание на следующие моменты:
СуммаКонечныйОстатокКт.ВидыСубконтоХозрасчетные.ВидыПлатежейВБюджет. Без этого разворота не произойдет.ИТОГИ СУММА(...) ПО ОБЩИЕ позволяет получить финальную сумму по всем строкам, что часто требуется для вывода в отчет или сверки с балансом.Выясним еще одну важную причину, по которой данные в запросе могут не сходиться с ОСВ. В типовых конфигурациях (БП 3.0, ERP) Организация является измерением регистра, а не субконто. Это означает, что если в базе ведется учет по нескольким юрлицам, а в запросе не наложен фильтр по организации, система может выдать «кашу» из остатков.
Аналогичная ситуация с Подразделениями. Если на счете включен учет по подразделениям, то сальдо в ОСВ может быть развернуто не только по контрагентам или налогам, но и по офисам/складам. Если вы видите развернутое сальдо в отчете, убедитесь, что в запросе вы также учитываете это измерение в группировках или параметрах виртуальной таблицы.
Рассмотрим вопрос ресурсов сервера. Использование полей развернутого остатка в таблице ОстаткиИОбороты более ресурсоемко для СУБД, чем работа с простой таблицей Остатки. Чтобы ваш запрос не «вешал» систему на больших объемах данных, придерживайтесь следующих правил:
ВидовСубконто в параметрах виртуальной таблицы. Не заставляйте сервер высчитывать развертку по всей возможной аналитике счета, если вам нужно только одно конкретное субконто.УсловиеСчета, а не в секции ГДЕ. Это позволит SQL-серверу эффективнее использовать индексы.Остатки, передав в нее нужный массив видов субконто — в некоторых случаях это работает быстрее.Подводя итог, проанализируем последовательность действий для гарантированного получения развернутого сальдо:
ОстаткиИОбороты.ВидыСубконто в шестой параметр таблицы.СуммаКонечныйРазвернутыйОстатокДт и Кт.Организация — оно должно быть либо в фильтре, либо в разрезе запроса.Соблюдение этих технических нюансов обеспечит полную идентичность ваших данных с типовыми бухгалтерскими отчетами 1С.