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