Как вывести все статьи движения денежных средств в отчете на СКД, включая нулевые значения

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

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда в результирующей таблице отображаются только те строки, по которым есть фактические движения (суммы). Если же задача стоит вывести полный справочник статей, например, для план-фактного анализа или просто для наглядности структуры бюджета, стандартное поведение СКД может мешать, «схлопывая» пустые строки. Особенно остро эта проблема проявляется при использовании внешних наборов данных и кросс-таблиц.

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

Анализ причины исчезновения строк

Прежде всего, проанализируем ситуацию: почему СКД «режет» строки, даже если в исходной таблице значений (ТЗ) они присутствуют с нулевыми суммами? Основная причина кроется в оптимизации запросов и алгоритме работы процессора компоновки. Если СКД видит, что поле не является обязательным или что ресурс для данной группировки принимает значение NULL (или 0, который система может интерпретировать как отсутствие данных при определенных настройках), она может исключить эту строку из визуализации для экономии места и ресурсов.

Решение 1: Настройка ролей полей в наборе данных

Первым делом проверим настройки ролей полей. Это один из самых эффективных способов заставить систему «заметить» данные. Рассмотрим по шагам:

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

Зачем это нужно? Установка флага «Обязательное» сообщает системе, что данное поле должно всегда присутствовать в выборке процессора компоновки, даже если оно не выбрано пользователем в настройках или если по нему отсутствуют числовые показатели. Это предотвращает исключение поля на этапе оптимизации запроса.

Решение 2: Корректная обработка ресурсов

Часто проблема скрыта в том, как мы описываем ресурсы. Посмотрим на типичную ошибку: использование функции Сумма(Поле), когда само поле содержит NULL. Проанализируем правильный подход к написанию выражений на вкладке «Ресурсы».

Вместо простого суммирования, используем проверку на пустое значение прямо в выражении ресурса:


Сумма(ЕстьNull(СуммаОборот, 0))

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

Решение 3: Использование двух наборов данных и связей

Если работа с одним внешним набором данных (ТЗ) не дает стабильного результата, рассмотрим самый надежный «архитектурный» метод — разделение данных на эталонный справочник и фактические обороты. Разберем этот алгоритм:

  1. Создадим Набор данных 1 (Объект): назовем его «ВсеСтатьи». Сюда мы передадим таблицу, содержащую полный перечень всех статей из справочника.
  2. Создадим Набор данных 2 (Объект): назовем его «Обороты». Сюда передадим таблицу только с теми данными, где суммы не нулевые.
  3. Перейдем на закладку «Связи наборов данных».
  4. Установим связь: Источник — «ВсеСтатьи», Приемник — «Обороты».
  5. Условие связи: Статья = Статья.
  6. Важный нюанс: Набор «ВсеСтатьи» должен быть ведущим. В параметрах связи убедитесь, что НЕ стоит галочка «Обязательная связь», иначе мы получим внутреннее соединение вместо левого.

В этом случае СКД сначала возьмет все записи из первого набора (справочника) и «приклеит» к ним суммы из второго. Если сумм нет, ресурс будет NULL, который мы превратим в 0 через ЕСТЬNULL.

Решение 4: Настройка вывода пустых группировок в кросс-таблицах

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

Проанализируем настройки в окне «Настройки»:

  1. Выберем группировку (строку) кросс-таблицы, где выбрано поле СтатьяДДС.
  2. В нижней части экрана перейдем на вкладку «Параметры вывода».
  3. Найдем параметр «Выводить пустые группы» и установим значение Да.
  4. Также проверим параметр «Тип дополнения». Для дат это работает автоматически, но для справочников можно использовать дополнение значениями, если это предусмотрено иерархией.

Решение 5: Исключение фильтрации на уровне запроса и отборов

Иногда мы сами того не замечая, отсекаем пустые строки. Проанализируем типичный кусок кода в модуле, который подготавливает ТЗ для внешнего набора:


// Ошибка: мы заранее убираем строки с нулевой суммой
ТекЗапрос = Новый Запрос;
ТекЗапрос.Текст = "ВЫБРАТЬ Статья, Сумма ИЗ Регистр ГДЕ Сумма <> 0"; 

Если мы хотим видеть все статьи, запрос должен выглядеть иначе. Мы должны использовать ЛЕВОЕ СОЕДИНЕНИЕ справочника с данными регистра:


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

После этого, передавая полученную ТЗ в СКД, мы гарантируем наличие всех строк. Но помните: если пользователь в настройках самого отчета (на вкладке «Отбор») установит условие Сумма Не равно 0, СКД применит этот фильтр уже после всех соединений и снова скроет пустые статьи. Чтобы этого избежать, обучайте пользователей использовать отбор не по ресурсу, а по конкретным значениям аналитики.

Дополнительный совет: Проверка условного оформления

В редких случаях строки на самом деле присутствуют в отчете, но их не видно. Проанализируем вкладку «Условное оформление». Проверьте, нет ли там правил, которые устанавливают Видимость = Ложь или белый цвет текста для записей, где Сумма = 0. Это частое решение для «подчистки» отчета, которое может быть забыто в общих настройках схемы.

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

← На главную