При разработке специализированных отчетов и выгрузок (например, в рамках требований 275-ФЗ) разработчики часто сталкиваются с необходимостью получить точную сумму конечного сальдо по дебету, совпадающую с итоговой строкой типового отчета Оборотно-сальдовая ведомость (ОСВ). Попытка получить это число простым обращением к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.Остатки нередко приводит к существенным расхождениям в миллионы рублей.
Разберем детально, почему возникает эта разница, какие механизмы платформы 1С влияют на расчет итогов и как составить запрос без использования конструкции ИТОГИ, чтобы результат можно было сразу поместить во временную таблицу.
Проанализируем ключевые факторы, из-за которых обычный запрос к остаткам регистра не сходится с подвалом оборотно-сальдовой ведомости:
НЕ Счет.Забалансовый, их остатки исказят финальную сумму.Организация или Подразделение), остатки противоположного знака по разным балансовым аналитикам не должны схлопываться.Граница с видом ВидГраницы.Включая), иначе движения последней секунды дня могут не попасть в выборку.В типовых отчетах расчет итогов часто выполняется за счет предложения ИТОГИ языка запросов с последующим обходом дерева результатов в цикле. Однако синтаксис 1С запрещает совместное использование директив ПОМЕСТИТЬ и ИТОГИ. Запрос вида:
ВЫБРАТЬ
ХозрасчетныйОстатки.Счет,
ХозрасчетныйОстатки.СуммаОстатокДт
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, , , ) КАК ХозрасчетныйОстатки
ИТОГИ
СУММА(СуммаОстатокДт) ПО ОБЩИЕ
вызовет синтаксическую ошибку. Следовательно, разворачивание сальдо и расчет итоговой суммы необходимо реализовать математически внутри самого запроса.
Рассмотрим, как правильно сформировать запрос, рассчитывающий конечное дебетовое сальдо ОСВ в разрезе аналитики без предложения ИТОГИ. Разберем логику по шагам:
РегистрБухгалтерии.Хозрасчетный.Остатки с передачей максимального состава субконто (до трех видов субконто).ГДЕ.ЭтоГруппа = ЛОЖЬ).ВЫБОР КОГДА в зависимости от вида счета (ВидСчета) и знака общего остатка.Посмотрим на пример практической реализации такого запроса:
ВЫБРАТЬ
Остатки.Счет КАК Счет,
ВЫБОР
КОГДА Остатки.Счет.ВидСчета = ЗНАЧЕНИЕ(ВидСчета.Активный)
ТОГДА Остатки.СуммаОстаток
КОГДА Остатки.Счет.ВидСчета = ЗНАЧЕНИЕ(ВидСчета.Пассивный)
ТОГДА ВЫБОР
КОГДА Остатки.СуммаОстаток < 0
ТОГДА -Остатки.СуммаОстаток
ИНАЧЕ 0
КОНЕЦ
КОГДА Остатки.Счет.ВидСчета = ЗНАЧЕНИЕ(ВидСчета.АктивноПассивный)
ТОГДА ВЫБОР
КОГДА Остатки.СуммаОстаток > 0
ТОГДА Остатки.СуммаОстаток
ИНАЧЕ 0
КОНЕЦ
КОНЕЦ КАК РазвернутыйДебет
ПОМЕСТИТЬ ВТ_РазвернутыеОстатки
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(
&ПериодГраница,
НЕ Счет.Забалансовый И НЕ Счет.ЭтоГруппа,
,
Организация = &Организация) КАК Остатки
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЕСТЬNULL(СУММА(ВТ.РазвернутыйДебет), 0) КАК ИтогКонечныйОстатокДт
ПОМЕСТИТЬ ВТ_ИтогОСВ
ИЗ
ВТ_РазвернутыеОстатки КАК ВТ
Проанализируем настройку параметров, передаваемых в запрос:
Для корректного среза остатков на конец периода создадим объект Граница во встроенном языке:
ГраницаПериода = Новый Граница(КонецДня(ДатаОтчета), ВидГраницы.Включая);
Запрос.УстановитьПараметр("ПериодГраница", ГраницаПериода);
Запрос.УстановитьПараметр("Организация", ВыбраннаяОрганизация);
Если для активно-пассивных счетов важна детализация по конкретным видам субконто, их список можно передать массивом во второй параметр виртуальной таблицы остатков или перечислить в секции выборки (Субконто1, Субконто2, Субконто3), что автоматически заставит платформу рассчитать остатки в максимальном разрезе аналитики.
Если задача не ограничивается временной таблицей в пакетном запросе, рассмотрим два альтернативных решения:
Сумма(СуммаОстатокДт) с указанием расчета по полю Счет и полям субконто). Механизм компоновки данных самостоятельно сформирует итоговую строку подвала, идентичную ОСВ.ПроцессорКомпоновкиДанных и вывести его не в табличный документ, а в объект ТаблицаЗначений. Из подвала полученной таблицы напрямую считывается значение нужной колонки.Таким образом, для получения сходящейся с ОСВ дебетовой суммы исключительно средствами языка запросов ключевым шагом является расчет развернутого сальдо на самом детальном уровне аналитики субконто и субсчетов с разделением логики для активных, пассивных и активно-пассивных счетов.