Почему запрос к виртуальной таблице ОстаткиИОбороты регистра бухгалтерии не выводит новые расходы за период

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

При разработке отчетов по счетам учета расходов будущих периодов (например, по счету 97.21) разработчики часто сталкиваются с ситуацией: стандартная оборотно-сальдовая ведомость показывает все объекты аналитики, а собственный запрос выбирает только те позиции, которые существовали на начало года, игнорируя новые расходы, возникшие внутри периода.

Разберем по шагам, почему возникает такое поведение платформы 1С:Предприятие и как правильно составить запрос к виртуальной таблице РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты, чтобы получить полную и корректную картину движений и остатков.

Анализ проблемы и механизма работы виртуальной таблицы

Рассмотрим исходный запрос, в котором проявляется ошибка:


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

Проанализируем ситуацию: период отчета установлен с 01.01 по 31.12. Первый расход уже числился на счете на 01.01, поэтому поле СуммаНачальныйОстатокДт для него заполнено. Второй расход поступил документом от 01.06.

Выясним причину ошибки:

  1. Виртуальная таблица ОстаткиИОбороты сначала формирует агрегированные данные по остаткам на границы и оборотам внутри периода. Для позиции, поступившей 01.06, значение начального остатка на 01.01 строго равно 0.
  2. Секция ГДЕ накладывает пост-фильтрацию на результат работы виртуальной таблицы. Условие ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт > 0 принудительно отсекает любые строки, по которым не было остатка на &НачалоПериода, даже если по ним были крупные обороты или есть остаток на конец периода.

Вариант 1. Корректировка условия отбора по остаткам и оборотам

Если нам необходимо получить в отчете все элементы, по которым в течение периода были либо остатки, либо движения (поступления и списания), расширим условие в секции ГДЕ, включив в него обороты и конечный остаток.

Посмотрим на пример исправленного запроса:


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

Если задача отчета заключается только в выводе позиций, которые еще не списаны на конец периода, достаточно использовать условие ГДЕ ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт > 0.

Вариант 2. Детализация данных по документам-регистраторам

Если новый расход был оформлен на тот же самый элемент справочника Расходы будущих периодов, при стандартных настройках виртуальной таблицы обороты схлопнутся в одну общую строку по субконто. Чтобы увидеть раздельно первый и второй расход с привязкой к датам и документам возникновения, необходимо включить детализацию по регистраторам.

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


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Период КАК ПериодДвижения,
    ХозрасчетныйОстаткиИОбороты.Регистратор КАК ДокументДвижения,
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК РБП,
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК НачальныйОстаток,
    ХозрасчетныйОстаткиИОбороты.СуммаОборотДт КАК Приход,
    ХозрасчетныйОстаткиИОбороты.СуммаОборотКт КАК Расход,
    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК КонечныйОстаток
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
        &НачалоПериода,
        &КонецПериода,
        Регистратор,
        ДвиженияИГраницыПериода,
        Счет = &Счет,
        &ВидыСубконто,
        Организация = &Организация
    ) КАК ХозрасчетныйОстаткиИОбороты

Рекомендации по оптимизации запросов к регистру бухгалтерии

  1. Передача списка видов субконто: При обращении к полям вида Субконто1 обязательно передавайте в 6-й параметр виртуальной таблицы массив или значение вида субконто (например, ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.РасходыБудущихПериодов). Без этого СУБД выполняет неоптимальные левые соединения со всеми возможными таблицами субконто конфигурации.
  2. Ведение аналитики РБП: В типовой методологии 1С каждый отдельный расход со своими параметрами (срок списания, сумма, способ признания) должен создаваться как отдельный элемент справочника, даже если речь идет об одной и той же номенклатуре или услуге.
  3. Проверка актуальности итогов: Если данные регистра отображаются некорректно даже без условий в секции ГДЕ, выполните пересчет бухгалтерских итогов через режим конфигуратора или обработку управления итогами.
← На главную