Как правильно настроить вывод параметров данных в отчете СКД и избежать ошибок с необязательными полями

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

При разработке отчетов на Системе Компоновки Данных (СКД) мы часто сталкиваемся с требованием заказчика изменить стандартный вид "шапки" отчета. Стандартный вывод, который формирует платформа (строка вида "Параметры: Период: ...; Менеджер: ..."), редко удовлетворяет эстетическим требованиям бизнеса. Нам ставят задачу: убрать слово "Параметры", выделить жирным имя менеджера или вовсе перенести эти данные в специфический заголовок. В этой статье мы подробно разберем, как кастомизировать вывод параметров, как использовать макеты оформления и, самое главное, как побороть распространенную ошибку "не установлено значение параметра", возникающую при работе с необязательными условиями запроса.

Постановка задачи

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

Способ 1: Настройка стандартного вывода (без макетов)

Если ваша задача — просто избавиться от слова "Параметры", не прибегая к сложному рисованию макетов, мы можем использовать штатные настройки компоновки данных. Давайте проанализируем настройки отчета (варианта отчета): 1. Перейдем на вкладку "Другие настройки" (в конфигураторе или в режиме предприятия). 2. Найдем настройку Выводить параметры данных. 3. Установим значение в Не выводить (также может быть полезно скрыть столбцы, когда нет данных). После этого стандартный блок исчезнет. Но как теперь показать пользователю, по какому менеджеру сформирован отчет? Мы можем добавить параметры прямо в выбранные поля отчета: 1. В настройках отчета создадим новую группировку (например, "Детальные записи" или фиктивную группировку, если нужно вывести сверху). 2. Перейдем на вкладку "Выбранные поля". 3. Добавим туда наш параметр ПараметрыДанных.Менеджер. 4. В свойствах этого поля (правая кнопка мыши -> Установить заголовок) зададим нужное нам имя, например, просто "Менеджер". В результате мы получим вывод значения параметра в виде колонки или строки таблицы, но без лишних префиксов.

Способ 2: Использование макетов оформления

Если требования к дизайну выше (нужен логотип, особый шрифт, расположение текста), нам придется использовать механизм макетов СКД. Это наиболее гибкий инструмент. Разберем по шагам, как это сделать: 1. В схеме компоновки данных переходим на вкладку "Макеты". 2. Добавляем "Макет заголовка группировки" или "Макет группировки". Однако для вывода общих параметров отчета правильнее использовать тип макета **"Заголовок"** (не группировки, а именно глобальный заголовок отчета). Если такого типа нет в списке добавления, можно использовать макет для группировки-корня, но давайте рассмотрим вариант, который использовал автор темы — макет для верхней группировки. Создаем область в табличном документе макета. В ячейке, где мы хотим видеть имя менеджера, мы можем поступить двумя способами: * **Вариант А (Параметр):** В свойствах ячейки ставим "Заполнение" = "Параметр". В тексте ячейки пишем имя параметра макета, например ПечМенеджер. Затем в таблице параметров макета (снизу) связываем ПечМенеджер с полем компоновки ПараметрыДанных.Менеджер. * **Вариант Б (Шаблон):** В свойствах ячейки ставим "Заполнение" = "Шаблон". В тексте ячейки пишем: Отчет по сотруднику: [Менеджер]. В параметрах макета указываем, что Менеджер берется из ПараметрыДанных.Менеджер. Этот метод позволяет сформировать любую "шапку". Но здесь нас подстерегает главная проблема, с которой столкнулся автор вопроса.

Проблема необязательных параметров (Фигурные скобки)

Допустим, в запросе набора данных у нас написано следующее условие:


ВЫБРАТЬ
    ...
ИЗ
    Документ.Продажи КАК Продажи
ГДЕ
    {Продажи.Менеджер = &Менеджер}

Проверить работу таких условий можно в консоли запросов УФ.

Фигурные скобки {} — это директива препроцессора СКД. Она означает: "Если пользователь не установил галочку использования параметра Менеджер и не задал значение, то **удалить этот кусок текста из запроса**". **В чем суть ошибки "Не установлено значение параметра"?** Когда пользователь не выбирает менеджера: 1. СКД анализирует настройки. Видит, что параметр &Менеджер не используется. 2. Генерирует итоговый запрос к базе данных, вырезая условие Продажи.Менеджер = &Менеджер. 3. В итоговом контексте выполнения параметр &Менеджер перестает существовать или становится неопределенным на уровне процессора компоновки, так как он был исключен из логики получения данных. 4. Однако, когда начинается вывод макета (шапки), система пытается получить данные для заполнения ячейки [Менеджер]. Она обращается к параметру данных, а он "выключен" или не инициализирован. Происходит ошибка.

Решение проблемы с необязательными параметрами

Давайте рассмотрим несколько проверенных методов, как обойти эту ошибку.

Метод 1: Дублирование параметра (Рекомендуемый)

Этот метод был предложен в обсуждении и является одним из самых надежных. Суть в том, чтобы разделить логику фильтрации и логику вывода. 1. Создаем в СКД параметр Менеджер (для отбора). Оставляем его в запросе в фигурных скобках: {Продажи.Менеджер = &Менеджер}. 2. Создаем второй параметр, например МенеджерДляЗаголовка. 3. Для параметра МенеджерДляЗаголовка убираем ограничение доступности, но **не используем его в тексте запроса** внутри фигурных скобок. Мы можем использовать его только для вывода. 4. В модуле объекта отчета (в событии ПриКомпоновкеРезультата) мы прописываем логику: считываем значение основного параметра, и если оно заполнено, передаем его во второй параметр. Если нет — пишем во второй параметр строку "Все менеджеры" или Неопределено. Однако, есть способ проще, без кодирования, используя выражения параметров.

Метод 2: Использование выражений параметров

Мы можем попытаться обработать значение прямо в настройках параметров СКД. 1. Оставим параметр &Менеджер. 2. Уберем его из "Ограничения доступности". 3. В колонке "Выражение" (вкладка Параметры) попробуем написать конструкцию обработки NULL, но это сработает, только если параметр все-таки присутствует в запросе. Если параметр в запросе полностью внутри {}, он может исчезать. Более надежный способ — сделать параметр **всегда обязательным** технически, но **необязательным** логически. Изменим запрос так:


ГДЕ
    (&Менеджер = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) 
     ИЛИ Продажи.Менеджер = &Менеджер)

И уберем фигурные скобки (аналогичный подход применяется, когда настраивается интерактивное формирование текста запроса для иерархии). Теперь параметр &Менеджер всегда участвует в запросе. * Если пользователь не выбрал менеджера, мы должны передать туда Пустую Ссылку. * При выводе в макет мы можем использовать выражение представления: ВЫБОР КОГДА &Менеджер = ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка) ТОГДА "По всем менеджерам" ИНАЧЕ &Менеджер КОНЕЦ.

Метод 3: Постобработка табличного документа

Этот метод (упомянутый в сообщении №4) идеален для сложных заголовков, которые трудно сверстать внутри СКД. Идея заключается в следующем: 1. Мы вообще отключаем стандартный вывод заголовков и параметров в СКД. 2. В макете (не СКД, а обычном макете табличного документа) рисуем красивую шапку. В ней пишем текст-заполнитель, например %%Менеджер%% или параметр области. 3. Перехватываем формирование отчета в процедуре ПриКомпоновкеРезультата. Примерный алгоритм действий в коде:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартный вывод
    
    // 1. Получаем настройки
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    
    // 2. Формируем макет компоновки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
    
    // 3. Выполняем компоновку данных
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
    
    // 4. Выводим свой заголовок ПЕРЕД результатом СКД
    // Получаем значение параметра из настроек пользователя
    ЗначениеПараметра = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Менеджер"));
    
    ТекстМенеджера = "Все менеджеры";
    Если ЗначениеПараметра <> Неопределено И ЗначениеПараметра.Использование Тогда
        ТекстМенеджера = Строка(ЗначениеПараметра.Значение);
    КонецЕсли;
    
    // Выводим область заголовка (предполагается, что есть макет "ЗаголовокОтчета")
    МакетОформления = ПолучитьМакет("ЗаголовокОтчета"); 
    Область = МакетОформления.ПолучитьОбласть("Шапка");
    Область.Параметры.МенеджерТекст = ТекстМенеджера;
    ДокументРезультат.Вывести(Область);
    
    // 5. Выводим результат СКД
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
КонецПроцедуры

При таком подходе ошибка "не установлено значение" не возникнет внутри СКД, так как мы берем значение из настроек *до* выполнения запроса и сами решаем, что вывести, если галочка использования снята.

Выводы и рекомендации

1. Если нужно просто убрать слово "Параметры" — используйте вкладку "Другие настройки" -> "Выводить параметры данных: Не выводить", и добавьте поля вручную в "Выбранные поля". 2. Если нужен сложный дизайн — используйте **Макеты** в схеме компоновки. 3. Если вы используете параметры в фигурных скобках {} в запросе, помните: они могут исчезнуть из контекста. Для их безопасного вывода в заголовок используйте **программную постобработку** или **дублирующие параметры**, которые всегда включены (упростить программную работу с СКД можно через СКДБилдер). 4. Никогда не полагайтесь на то, что пользователь обязательно заполнит параметр. Ваш код (или настройки СКД) всегда должен предусматривать вариант Значение.Использование = Ложь или значение Неопределено/Null.

← На главную