При разработке отчетов на базе Системы компоновки данных (СКД) часто возникают задачи, которые требуют гибкого управления выводимыми значениями. Например, нужно вывести данные в поле только при соблюдении условий в других полях или корректно обработать иерархическую структуру справочника. Рассмотрим подробнее, как решать эти задачи эффективно, используя механизмы вычисляемых полей, параметров и условного оформления.
Первый вопрос, который мы разберем: как сделать так, чтобы значение в поле выводилось только при выполнении определенного условия? Существует два основных подхода: Условное оформление и Вычисляемые поля. Выясним причину выбора каждого из них.
Условное оформление больше подходит для визуального скрытия данных. Если мы укажем условие в оформлении и выберем текст «пустая строка», данные физически останутся в результате, но пользователь их не увидит. Однако, если эти данные участвуют в расчете итогов, они все равно будут просуммированы.
Для корректного управления самими данными лучше использовать Вычисляемые поля. Разберем по шагам, как написать выражение для такого поля:
ОбъектСписания).ВЫБОР КОГДА....Пример выражения:
ВЫБОР
КОГДА СчётНачисленияАмортизации = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОсновноеПроизводство_01)
ТОГДА НоменклатурнаяГруппа
ИНАЧЕ ""
КОНЕЦ
В данном случае мы проверяем конкретный счет, и если он совпадает с искомым, выводим НоменклатурнаяГруппа, в противном случае — пустую строку. Обратите внимание на использование функции ЗНАЧЕНИЕ() — это наиболее правильный способ обращения к предопределенным элементам в СКД.
Проанализируем ситуацию, когда необходимо отобрать элементы по родителю, но структура справочника имеет разную глубину вложенности. Если нам нужно проверить вхождение элемента в определенную группу на разных уровнях, мы можем использовать так называемую «гирлянду» из обращений к родителю в вычисляемом поле.
Рассмотрим пример логики проверки до третьего уровня вложенности:
ВЫБОР
КОГДА Родитель = &НужнаяГруппа ТОГДА "Попал"
КОГДА Родитель.Родитель = &НужнаяГруппа ТОГДА "Попал"
КОГДА Родитель.Родитель.Родитель = &НужнаяГруппа ТОГДА "Попал"
ИНАЧЕ "Не попал"
КОНЕЦ
Такой подход допустим, если максимальная глубина вложенности заранее известна и невелика. Однако помните, что избыточное количество обращений через точку (Родитель.Родитель.Родитель...) может негативно сказаться на производительности отчета, так как каждое такое обращение — это неявное соединение таблиц в запросе к базе данных.
Иногда возникает соблазн использовать методы типа НайтиПоКоду() прямо в выражениях СКД. Важно понимать: в языке выражений СКД нельзя напрямую вызывать методы объектов. Попытка написать Справочники.ОсновныеСредства.НайтиПоКоду("00001") приведет к ошибке.
Разберем, как правильно реализовать отбор конкретных элементов, если их список ограничен (например, те самые 8 объектов из обсуждения):
СписокОбъектов.ПриКомпоновкеРезультата) программно заполним этот параметр нужными ссылками.Пример программного заполнения списка в модуле:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
Список8Объектов = Новый СписокЗначений;
Объект1 = Справочники.ОсновныеСредства.НайтиПоКоду("000000614");
Если ЗначениеЗаполнено(Объект1) Тогда
Список8Объектов.Добавить(Объект1);
КонецЕсли;
// Устанавливаем параметр в настройках компоновки
ПараметрСхемы = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("СписокОбъектов");
Если ПараметрСхемы <> Неопределено Тогда
ПараметрСхемы.Значение = Список8Объектов;
ПараметрСхемы.Использование = Истина;
КонецЕсли;
КонецПроцедуры
В вычисляемом поле выражение теперь будет выглядеть так:
ВЫБОР
КОГДА ОсновноеСредство В (&СписокОбъектов)
ТОГДА "Облагается"
ИНАЧЕ "Не облагается"
КОНЕЦ
Важное замечание по именованию: никогда не начинайте имя параметра с цифры (например, &8объектов). Это недопустимо в языке 1С и приведет к ошибке «Параметр не найден». Используйте понятные имена: &СписокОбъектов или &ОбъектыДляПроверки.
Если логика определения значения слишком сложна для конструкции ВЫБОР КОГДА, мы можем обратиться к функциям общих модулей. Это мощный инструмент, который позволяет вынести программный код за пределы схемы СКД.
Для этого должны быть соблюдены условия:
Экспорт.Синтаксис вызова в вычисляемом поле будет следующим: ИмяОбщегоМодуля.ИмяФункции(Поле1, Поле2). Например, вы можете передать ссылку на объект в функцию, которая выполнит сложный поиск или расчет и вернет готовый результат.
Мы проанализировали основные способы кастомизации данных в СКД. Для простых условий идеально подходят Вычисляемые поля. Если нужно отобрать конкретный список элементов, лучше использовать Параметры со списком значений, заполняемые программно. А для работы с иерархией на уровне условий — проверку через родителей или специализированные функции общих модулей. Использование этих методов позволит вам создавать профессиональные и быстродействующие отчеты.