Почему в отчете СКД неправильно рассчитываются итоги и остатки по контрагентам?

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

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда при наложении отбора по конкретному контрагенту конечный остаток обнуляется или рассчитывается неверно, хотя в целом по предприятию данные сходятся. Эта проблема обычно связана не с ошибкой в данных, а с особенностями настройки ресурсов, ролей полей и параметров виртуальных таблиц. Рассмотрим подробно, как правильно настроить такой отчет.

Настройка ролей полей для корректного расчета остатков

Одной из самых распространенных причин «пропадания» или неверного суммирования остатков является отсутствие или неправильная настройка Ролей в схеме компоновки данных. Если мы используем поля из виртуальных таблиц ОстаткиИОбороты, системе необходимо явно указать, какие поля являются начальным остатком, а какие — конечным.

Разберем настройки на вкладке Наборы данных в колонке Роль:

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

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

Параметры виртуальной таблицы и периодичность

Часто начальный остаток не выводится, если в выбранном периоде у контрагента не было оборотов. Выясним причину: виртуальная таблица без движений за период может просто не вернуть строку. Чтобы этого избежать, обратим внимание на настройку периодичности в запросе.

В тексте запроса при обращении к виртуальной таблице (например, ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ОстаткиИОбороты) рекомендуется устанавливать периодичность Авто. Это позволит СКД самостоятельно определять нужные разрезы периодов для корректного «протягивания» остатков от начала времен до выбранной даты отчета.

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


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

Использование поля ПериодСекунда

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

Посмотрим на типичную ошибку: использование только поля Регистратор или ПериодДень может привести к тому, что при наличии нескольких движений в одну секунду (или день) остатки распределятся некорректно. ПериодСекунда дает системе максимально точную временную шкалу.

Дополнение периодов в настройках отчета

Если мы хотим видеть остатки по контрагенту даже в те дни, когда по нему не было ни одного платежа или отгрузки, воспользуемся механизмом Дополнения периодов. Рассмотрим, как это сделать:

  1. Перейдем на вкладку Настройки.
  2. Выберем группировку по периоду (например, ПериодСекунда).
  3. В нижней части окна настроек перейдем на вкладку Дополнительные настройки.
  4. Установим флаг Дополнение периодов.
  5. Укажем Начало периода и Конец периода, связав их с соответствующими параметрами отчета.

Это гарантирует, что остаток «протянется» через все даты отчета, и конечный итог не будет пустой строкой.

Ресурсы и функция ЕСТЬNULL

Проанализируем ситуацию, когда итоги по иерархии или общие итоги отображаются как NULL или 0. На вкладке Ресурсы в выражении расчета итога всегда полезно подстраховаться от отсутствия данных. Вместо простого суммирования поля используем конструкцию с проверкой:

СУММА(ЕСТЬNULL(СуммаКонечныйОстаток, 0))

Это обеспечит корректное сложение числовых данных, даже если по какому-то из разрезов (например, по конкретному договору) записей в базе не обнаружено. Также убедимся, что на вкладке Ресурсы указано Рассчитывать по... для всех необходимых группировок и Общего итога.

Взаимодействие отборов и виртуальных таблиц

Если отчет все равно выдает странные результаты при установке отбора, попробуем перенести условие по контрагенту из общих отборов СКД непосредственно в параметры виртуальной таблицы. Это критично для больших баз данных: СКД иногда сначала получает остатки по всем записям, а затем отсекает лишнее, что в сложных соединениях (Join) может привести к потере расчетных данных. Установка отбора внутри параметров &Условие виртуальной таблицы работает более надежно и быстро.

← На главную