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

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

При разработке отчетов и запросов в 1С программисты часто сталкиваются с ситуацией, когда простой запрос к виртуальной таблице ОстаткиИОбороты регистра накопления возвращает «лишние» строки или некорректные итоговые суммы. Обычно проблема проявляется при попытке вытащить документ-регистратор для построения детализации или расшифровки.

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

Проанализируем причину возникновения проблемы

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

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


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

Причины некорректного результата заключаются в следующем:

  1. Особенности периодичности «Регистратор»: Когда в параметрах виртуальной таблицы передается периодичность Регистратор (или Запись), платформа рассчитывает входящие и исходящие остатки отдельной строкой на момент времени каждой движения. Остатки перестают быть единым сальдо за выбранный интервал и превращаются в моментальные показатели для каждой записи.
  2. Метод дополнения по умолчанию: По умолчанию платформа использует параметр МетодДополнения = ДвиженияИГраницыПериода. Если на начало периода у аналитики уже был остаток, система принудительно добавляет служебную строку с пустым регистратором (NULL) на границу периода для учета входного сальдо. В итоге получается две строки: одна — граница периода с остатком, вторая — сама движение.
  3. Складывание остатков: Ресурсы СуммаНачальныйОстаток и СуммаКонечныйОстаток нельзя простым образом просуммировать без учета хронологии. Если попытаться сгруппировать результат или вывести итоговые поля в отчете без настройки ролей СКД, начальные остатки каждой строки сложатся между собой, искажая итоговую картину.

Способ 1. Установка периодичности «Авто» и настройка ролей в СКД

Если отчет разрабатывается на Системе компоновки данных (СКД) и необходима расшифровка по документам, оптимальным решением будет изменение параметра периодичности на Авто и добавление в запрос служебных полей периода.

Рассмотрим пошаговую настройку:

  1. В параметрах виртуальной таблицы укажем периодичность Авто.
  2. В список выбираемых полей добавляем поля хронологии разных уровней: ПериодСекунда, ПериодДень и Регистратор.
  3. На вкладке Наборы данных в СКД переходим к настройке ролей полей:
    1. Для поля ПериодСекунда укажем роль Период и порядковый номер 1.
    2. Для поля Регистратор укажем роль Период и порядковый номер 2.
    3. Для ресурсов СуммаНачальныйОстаток и СуммаКонечныйОстаток установим соответствующие роли НачальныйОстаток и КонечныйОстаток.

Измененный текст запроса будет выглядеть так:


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

Благодаря этому СКД сможет правильно определить хронологию: начальный остаток будет взят из первой записи, конечный — из последней, а промежуточные движения сгруппируются без лишнего дублирования.

Способ 2. Изменение метода дополнения

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

В параметрах таблицы укажем пятый параметр — МетодДополнения:


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

Значение Движения заставит платформу выводить только те периоды и записи, по которым реально существовали движения регистра в указанном интервале времени.

Способ 3. Разделение наборов данных в СКД

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

  1. Набор данных 1 (Сводные остатки и обороты): Делает запрос к виртуальной таблице ОстаткиИОбороты без указания периодичности по регистратору. Он возвращает точные начальные остатки, приход, расход и конечные остатки в разрезе аналитики (Организация, Клиент, Договор).
  2. Набор данных 2 (Детализация движений): Делает запрос к таблице Обороты или реальной таблице движений регистра с выбором поля Регистратор.
  3. Связи наборов данных: На вкладке «Связи наборов данных» связываем Набор 1 и Набор 2 по измерениям (Организация, Клиент, ДоговорИТС).

Такой подход гарантирует, что итоговые начальные и конечные остатки отчета никогда не исказятся из-за детализации до документов.

← На главную