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