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