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