Как получить конечный дебетовый остаток из ОСВ прямым запросом к регистру бухгалтерии?

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При разработке специализированных отчетов и выгрузок (например, в рамках требований 275-ФЗ) разработчики часто сталкиваются с необходимостью получить точную сумму конечного сальдо по дебету, совпадающую с итоговой строкой типового отчета Оборотно-сальдовая ведомость (ОСВ). Попытка получить это число простым обращением к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.Остатки нередко приводит к существенным расхождениям в миллионы рублей.

Разберем детально, почему возникает эта разница, какие механизмы платформы 1С влияют на расчет итогов и как составить запрос без использования конструкции ИТОГИ, чтобы результат можно было сразу поместить во временную таблицу.

Причины расхождения между простым запросом и итогами ОСВ

Проанализируем ключевые факторы, из-за которых обычный запрос к остаткам регистра не сходится с подвалом оборотно-сальдовой ведомости:

  1. Развернутое сальдо по активно-пассивным счетам. В типовой ОСВ остатки по активно-пассивным счетам (например, 60, 62, 76) рассчитываются развернуто по субконто (контрагентам, договорам, документам расчетов). Если по одному контрагенту висит дебеторская задолженность, а по другому — кредиторская, ОСВ покажет их отдельно: дебет уйдет в общую колонку дебета, а кредит — в колонку кредита. Если же мы делаем запрос к виртуальной таблице остатков без субконто, платформа свернет эти суммы на уровне счета, и итоговый дебет окажется занижен на величину свернутого кредита.
  2. Иерархия субсчетов. Сальдо по счету-родителю в ОСВ формируется как сумма развернутых остатков подчиненных субсчетов, а не как прямое свернутое сальдо счета верхнего уровня. Например, если на счете 68.01 дебет, а на 68.02 кредит, запрос без детализации по субсчетам взаимно зачтет их суммы.
  3. Забалансовые счета. В типовой ОСВ забалансовые счета (счет 001, 002, 004 и т.д.) по умолчанию исключаются из расчета общего баланса либо выводятся отдельным блоком ниже основных итогов. Если в запросе не установлено условие НЕ Счет.Забалансовый, их остатки исказят финальную сумму.
  4. Балансовые измерения регистра. Если в конфигурации ведется учет по балансовым измерениям (например, Организация или Подразделение), остатки противоположного знака по разным балансовым аналитикам не должны схлопываться.
  5. Граница периода. Для корректного получения остатка на конец расчетного дня в виртуальную таблицу необходимо передавать значение границы с включением момента времени (объект Граница с видом ВидГраницы.Включая), иначе движения последней секунды дня могут не попасть в выборку.

Ограничение платформы при работе со временными таблицами

В типовых отчетах расчет итогов часто выполняется за счет предложения ИТОГИ языка запросов с последующим обходом дерева результатов в цикле. Однако синтаксис 1С запрещает совместное использование директив ПОМЕСТИТЬ и ИТОГИ. Запрос вида:


ВЫБРАТЬ
    ХозрасчетныйОстатки.Счет,
    ХозрасчетныйОстатки.СуммаОстатокДт
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, , , ) КАК ХозрасчетныйОстатки
ИТОГИ
    СУММА(СуммаОстатокДт) ПО ОБЩИЕ

вызовет синтаксическую ошибку. Следовательно, разворачивание сальдо и расчет итоговой суммы необходимо реализовать математически внутри самого запроса.

Пошаговое построение запроса для временной таблицы

Рассмотрим, как правильно сформировать запрос, рассчитывающий конечное дебетовое сальдо ОСВ в разрезе аналитики без предложения ИТОГИ. Разберем логику по шагам:

  1. Обращаемся к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.Остатки с передачей максимального состава субконто (до трех видов субконто).
  2. Фильтруем забалансовые счета в параметрах таблицы либо в секции ГДЕ.
  3. Выбираем только счета нижнего уровня (листья плана счетов, у которых ЭтоГруппа = ЛОЖЬ).
  4. Вычисляем дебетовое сальдо с помощью конструкции ВЫБОР КОГДА в зависимости от вида счета (ВидСчета) и знака общего остатка.
  5. Помещаем результат во временную таблицу и затем сворачиваем его до одной итоговой строки.

Посмотрим на пример практической реализации такого запроса:


ВЫБРАТЬ
    Остатки.Счет КАК Счет,
    ВЫБОР
        КОГДА Остатки.Счет.ВидСчета = ЗНАЧЕНИЕ(ВидСчета.Активный)
            ТОГДА Остатки.СуммаОстаток
        КОГДА Остатки.Счет.ВидСчета = ЗНАЧЕНИЕ(ВидСчета.Пассивный)
            ТОГДА ВЫБОР
                    КОГДА Остатки.СуммаОстаток < 0
                        ТОГДА -Остатки.СуммаОстаток
                    ИНАЧЕ 0
                КОНЕЦ
        КОГДА Остатки.Счет.ВидСчета = ЗНАЧЕНИЕ(ВидСчета.АктивноПассивный)
            ТОГДА ВЫБОР
                    КОГДА Остатки.СуммаОстаток > 0
                        ТОГДА Остатки.СуммаОстаток
                    ИНАЧЕ 0
                КОНЕЦ
    КОНЕЦ КАК РазвернутыйДебет
ПОМЕСТИТЬ ВТ_РазвернутыеОстатки
ИЗ
    РегистрБухгалтерии.Хозрасчетный.Остатки(
            &ПериодГраница,
            НЕ Счет.Забалансовый И НЕ Счет.ЭтоГруппа,
            ,
            Организация = &Организация) КАК Остатки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЕСТЬNULL(СУММА(ВТ.РазвернутыйДебет), 0) КАК ИтогКонечныйОстатокДт
ПОМЕСТИТЬ ВТ_ИтогОСВ
ИЗ
    ВТ_РазвернутыеОстатки КАК ВТ

Особенности передачи параметров в виртуальную таблицу

Проанализируем настройку параметров, передаваемых в запрос:

Для корректного среза остатков на конец периода создадим объект Граница во встроенном языке:


ГраницаПериода = Новый Граница(КонецДня(ДатаОтчета), ВидГраницы.Включая);
Запрос.УстановитьПараметр("ПериодГраница", ГраницаПериода);
Запрос.УстановитьПараметр("Организация", ВыбраннаяОрганизация);

Если для активно-пассивных счетов важна детализация по конкретным видам субконто, их список можно передать массивом во второй параметр виртуальной таблицы остатков или перечислить в секции выборки (Субконто1, Субконто2, Субконто3), что автоматически заставит платформу рассчитать остатки в максимальном разрезе аналитики.

Альтернативные способы получения итогов ОСВ

Если задача не ограничивается временной таблицей в пакетном запросе, рассмотрим два альтернативных решения:

  1. Использование схемы компоновки данных (СКД). СКД способна рассчитывать развернутые остатки штатными средствами. Для поля ресурса дебетового остатка в выражении указывается расчет по группировкам (например, Сумма(СуммаОстатокДт) с указанием расчета по полю Счет и полям субконто). Механизм компоновки данных самостоятельно сформирует итоговую строку подвала, идентичную ОСВ.
  2. Программный вывод типового отчета ОСВ в коллекцию значений. Если конфигурация типовая и логика отчета слишком сложна (учитываются валюты, сценарии, корректировки), можно программно сформировать отчет «Оборотно-сальдовая ведомость» через ПроцессорКомпоновкиДанных и вывести его не в табличный документ, а в объект ТаблицаЗначений. Из подвала полученной таблицы напрямую считывается значение нужной колонки.

Таким образом, для получения сходящейся с ОСВ дебетовой суммы исключительно средствами языка запросов ключевым шагом является расчет развернутого сальдо на самом детальном уровне аналитики субконто и субсчетов с разделением логики для активных, пассивных и активно-пассивных счетов.

← На главную