Свой параметр в отчёте на СКД и в старом отчёте: от запроса до поля на форме

· 10 мин

Содержание

Чтобы добавить пользовательский параметр в отчёт 1С на СКД, впишите в текст запроса &ИмяПараметра, задайте ему тип на закладке «Параметры» схемы компоновки, а затем на закладке «Настройки» отметьте его и включите в пользовательские настройки с режимом «Быстрый доступ». После этого поле параметра появится в шапке отчёта рядом с кнопкой «Сформировать».

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

Какой у вас отчёт и как в него добавить параметр

Способ зависит от того, на чём построен отчёт. Откройте его в Конфигураторе (или внешний отчёт через Файл → Открыть) и посмотрите на макеты.

  • 📊 Есть макет «ОсновнаяСхемаКомпоновкиДанных» — отчёт на СКД. Параметр добавляют в схеме, код почти не нужен.
  • 📄 Есть макет-табличный документ и форма с кнопкой «Сформировать», в модуле — Новый Запрос — старый отчёт. Параметр — это реквизит отчёта, поле на форме и Запрос.УстановитьПараметр().
  • 🔒 Типовой отчёт из конфигурации на поддержке — схему лучше не править. Для пользователя хватает отбора в расширенных настройках, для разработчика — копия в виде внешнего отчёта или расширение.
СитуацияЧто делатьНужен Конфигуратор
Пользователю нужен фильтр в типовом отчётеОтбор в настройках отчёта, вид «Расширенный»Нет
Свой отчёт на СКДПараметр в запросе + пользовательские настройкиДа
Значение должно подставляться самоВыражение параметра или код модуляДа
Старый отчёт на обычных формахРеквизит + элемент формы + параметр запросаДа

Разница между параметром и отбором простая. Параметр попадает внутрь запроса: в условие ГДЕ или в параметры виртуальной таблицы. Отбор накладывается на поля набора данных. Для дат, периодов остатков и всего, что меняет сам расчёт, нужен параметр. Для «показать только склад Основной» хватит отбора.

Шаг за шагом: новый параметр в отчёте на СКД

Пример: отчёт по продажам, нужно дать пользователю выбрать склад.

1. Пропишите параметр в запросе

Откройте схему компоновки, на закладке «Наборы данных» нажмите «Конструктор запроса» или правьте текст вручную. Добавьте условие:

ВЫБРАТЬ
    Продажи.Номенклатура,
    Продажи.Склад,
    Продажи.Количество
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Склад = &Склад

Для виртуальных таблиц условие лучше ставить в параметры таблицы — так платформа отфильтрует данные раньше и быстрее:

РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, Склад = &Склад)

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

2. Настройте свойства параметра

На закладке «Параметры» у каждой строки есть колонки. Нужны такие:

  • Заголовок — то, что увидит пользователь. «Склад», а не «СкладОтбора».
  • Тип — СправочникСсылка.Склады. Если тип не задан, в поле можно будет ввести что угодно, и отчёт выдаст пустой результат.
  • Доступен список значений — отметьте, если нужно выбирать несколько складов. Тогда в запросе пишите Продажи.Склад В (&Склад).
  • Ограничение доступности — эту галочку для пользовательского параметра снимите. С ней параметр не попадёт в настройки.
  • Использование — Авто или Всегда. Про разницу — в разделе об отборах.
  • Значение — значение по умолчанию, если оно нужно.

3. Выведите параметр в шапку отчёта

Это шаг, который чаще всего пропускают. Параметр в схеме ещё не означает поле на форме.

  1. Перейдите на закладку «Настройки».
  2. Внизу откройте закладку «Параметры». Там список параметров без ограничения доступности.
  3. Поставьте флажок у строки «Склад».
  4. Выделите строку и нажмите на панели кнопку «Свойства элемента пользовательских настроек».
  5. Отметьте «Включать в пользовательские настройки».
  6. Режим редактирования — «Быстрый доступ». Тогда поле будет прямо на форме отчёта. «Обычный» спрячет его в окно «Настройки».

Сохраните схему, обновите конфигурацию базы данных или пересохраните внешний отчёт. Откройте отчёт в режиме 1С:Предприятие — поле «Склад» стоит в шапке.

Отборы и условия: как сделать параметр необязательным

Обычное желание: склад не выбран — показать все склады. С условием Продажи.Склад = &Склад так не выйдет: пустое значение отфильтрует всё до нуля, а при снятом флажке отчёт потребует значение.

Есть три рабочих приёма.

Фигурные скобки языка СКД

В запросе схемы компоновки можно писать условия в фигурных скобках. Такое условие платформа включает в запрос, только когда параметр используется:

ГДЕ
    {Продажи.Склад = &Склад}

Или в параметрах виртуальной таблицы:

РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, {Склад = &Склад})

Флажок у параметра снят — условие выпадает из текста запроса. Отмечен — работает. Это самый чистый способ для СКД.

Свойство «Использование»

  • Всегда — параметр нельзя выключить, значение обязательно передаётся в запрос.
  • Авто — у поля в шапке появляется флажок. Пользователь снимает его, и параметр считается неиспользуемым.

Для необязательных параметров ставьте Авто в паре с фигурными скобками.

Условие с проверкой на пустое значение

Работает и в СКД, и в обычных запросах:

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

На больших таблицах конструкция с ИЛИ хуже использует индексы. Если отчёт после неё заметно тормозит, переходите на фигурные скобки.

Когда хватит обычного отбора

Если поле есть в выборке набора данных, его можно не превращать в параметр. На закладке «Настройки» → «Отбор» перетащите поле «Склад», задайте вид сравнения «Равно» или «В списке» и так же включите элемент в пользовательские настройки через «Свойства элемента пользовательских настроек».

Пользователь типового отчёта может сделать то же самое без Конфигуратора: кнопка «Настройки» на форме отчёта, вид «Расширенный», закладка «Отборы», добавить поле. Такая настройка сохраняется за пользователем и переживает обновление конфигурации .

Что именно вам нужно от нового поля в отчёте?

Период, связанные параметры и вычисляемые значения

Параметры периода — самый частый случай. Делают их так.

  1. Добавьте параметр Период с типом СтандартныйПериод и включите в пользовательские настройки.
  2. У параметров НачалоПериода и КонецПериода, которые используются в запросе, заполните колонку «Выражение»: &Период.ДатаНачала и &Период.ДатаОкончания.
  3. Им же поставьте «Ограничение доступности», чтобы пользователь видел одно поле периода, а не три.

ДатаОкончания стандартного периода уже указывает на конец дня, поэтому последний день периода попадает в отчёт целиком.

Ещё один полезный приём — связи параметров выбора. Если в отчёте есть параметры «Организация» и «Склад», в свойствах параметра «Склад» откройте параметры редактирования и задайте связь параметров выбора: отбор по владельцу или организации берётся из параметра «Организация». Пользователь при выборе склада увидит только склады нужной фирмы. Будет ли такая связь работать, зависит от того, есть ли у справочника складов реквизит организации в вашей конфигурации.

Выражение в параметре пишется на языке выражений СКД, а не на встроенном языке. Функции вроде НачалоПериода(&Дата, "МЕСЯЦ") там доступны, а вызовы общих модулей — нет.

Как задать параметр отчёта программно в модуле объекта

Код нужен, когда значение должно подставляться автоматически: текущий пользователь, дата формирования, организация по умолчанию. Такой параметр оставьте с «Ограничением доступности», чтобы он не мешал в шапке.

Значение перед формированием, стандартный вывод

В модуле объекта отчёта создайте обработчик ПриКомпоновкеРезультата:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
        Новый ПараметрКомпоновкиДанных("ДатаФормирования"));

    Если ЗначениеПараметра <> Неопределено Тогда
        ЗначениеПараметра.Значение = ТекущаяДатаСеанса();
        ЗначениеПараметра.Использование = Истина;
    КонецЕсли;

КонецПроцедуры

СтандартнаяОбработка не трогаем — дальше отчёт сформирует сама платформа.

Короче то же самое делает метод УстановитьЗначениеПараметра:

КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаФормирования", ТекущаяДатаСеанса());

Если параметр включён в пользовательские настройки, значение, которое выбрал пользователь, имеет приоритет над записанным в Настройки. Программно задавайте только скрытые параметры, а видимые оставляйте пользователю.

Полностью свой вывод

Когда нужно подменить настройки целиком, отключите стандартную обработку и соберите результат сами:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

    Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    Настройки = КомпоновщикНастроек.ПолучитьНастройки();
    Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаФормирования", ТекущаяДатаСеанса());

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);

    Процессор = Новый ПроцессорКомпоновкиДанных;
    Процессор.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);

    ДокументРезультат.Очистить();
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(Процессор);

КонецПроцедуры

ПолучитьНастройки() возвращает настройки уже с учётом пользовательских, поэтому выбор из шапки отчёта не теряется.

Новый параметр прямо в схеме из кода

Бывает, что схему собирают программно. Тогда параметр добавляют в коллекцию Параметры схемы:

НовыйПараметр = Схема.Параметры.Добавить();
НовыйПараметр.Имя = "Склад";
НовыйПараметр.Заголовок = "Склад";
НовыйПараметр.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Склады");
НовыйПараметр.ВключатьВДоступныеПоля = Ложь;

После изменения схемы переинициализируйте компоновщик: КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема)). Без этого новый параметр не появится в настройках.

Параметры в старых отчётах без СКД

Отчёты на обычных формах с выводом в табличный документ встречаются в старых самописных конфигурациях и в обработках, перенесённых с 8.2. Здесь параметр — это обычный реквизит.

  1. В дереве метаданных отчёта добавьте реквизит Склад типа СправочникСсылка.Склады.
  2. Откройте основную форму и перетащите реквизит на форму. Появится поле ввода с кнопкой выбора.
  3. В процедуре, которая формирует отчёт, передайте значение в запрос.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Остатки.Номенклатура,
|    Остатки.КоличествоОстаток
|ИЗ
|    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки";

Запрос.УстановитьПараметр("Дата", КонецДня(ДатаОтчета));
Запрос.УстановитьПараметр("Склад", Склад);

Макет = ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

ТабДок.Очистить();
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    ОбластьСтрока.Параметры.Заполнить(Выборка);
    ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;

В управляемой форме всё то же, но формирование лучше выносить в серверную процедуру, а значение реквизита брать через Объект.Склад.

Фигурных скобок здесь нет — это возможность только СКД. Необязательный фильтр делают условием с проверкой на пустую ссылку или собирают текст запроса по условию:

Если ЗначениеЗаполнено(Склад) Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеСклад", "Остатки.Склад = &Склад");
    Запрос.УстановитьПараметр("Склад", Склад);
Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеСклад", "ИСТИНА");
КонецЕсли;

Для этого в тексте запроса оставьте заглушку: ГДЕ &УсловиеСклад.

Если отчёт всё равно переделывается, переносите его на СКД. Отборы, группировки, расшифровка и сохранение настроек появятся без строчки кода.

Ошибки при добавлении параметра и как их снять

Диагностика: выберите симптом

Как не сломать отчёт и не замедлить его

  • 🧩 Не правьте схему типового отчёта на поддержке. При обновлении правки придётся сливать вручную. Копия во внешнем отчёте или расширение избавят от этого.
  • ⚡ Фильтруйте как можно раньше. Условие в параметрах виртуальной таблицы быстрее, чем ГДЕ после неё, а ГДЕ быстрее отбора по полю в настройках.
  • 🏷️ Давайте параметрам понятные заголовки. Имя НачалоПериода уйдёт в код, а пользователь увидит «Дата с».
  • 🔐 Служебные параметры скрывайте. Всё, что заполняется выражением или кодом, — с «Ограничением доступности».
  • 🗂️ Используйте варианты отчёта. Если одному отделу нужен склад, а другому — организация, сделайте два варианта на закладке «Настройки», а не один перегруженный.
  • 🧪 Проверяйте на копии базы. Новый параметр в тяжёлом отчёте сначала гоняйте на копии, чтобы увидеть время формирования на реальных объёмах.
Можно ли добавить параметр в типовой отчёт без программиста?
Параметр — нет, отбор — да. Откройте «Настройки» на форме отчёта, переключите вид на «Расширенный» и добавьте поле на закладке «Отборы». Настройка сохранится за пользователем.
Чем параметр с «Быстрым доступом» отличается от «Обычного»?
«Быстрый доступ» выводит поле прямо в шапку отчёта. «Обычный» показывает его только в окне «Настройки». «Недоступный» скрывает от пользователя.
Как сделать выбор нескольких значений в одном параметре?
Отметьте у параметра «Доступен список значений» и пишите в запросе условие В (&Параметр). В шапке появится поле со списком.
Почему параметр есть в схеме, но его нет на закладке «Настройки → Параметры»?
У него стоит «Ограничение доступности». Снимите флажок в колонке на закладке «Параметры» схемы.
Где хранится значение параметра, которое выбрал пользователь?
В пользовательских настройках отчёта в хранилище настроек. Поэтому после смены схемы пользователю иногда нужно вернуть стандартные настройки.