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