Свой параметр в отчёте на СКД и в старом отчёте: от запроса до поля на форме
Содержание
Чтобы добавить пользовательский параметр в отчёт 1С на СКД, впишите в текст запроса &ИмяПараметра, задайте ему тип на закладке «Параметры» схемы компоновки, а затем на закладке «Настройки» отметьте его и включите в пользовательские настройки с режимом «Быстрый доступ». После этого поле параметра появится в шапке отчёта рядом с кнопкой «Сформировать».
Если поле так и не появилось, или отчёт ругается Не установлено значение параметра, — дело почти всегда в одной из трёх галочек. Ниже по шагам: как выбрать способ, как вывести параметр пользователю, как сделать его необязательным, как задать значение из кода и что делать со старыми отчётами без СКД.
Какой у вас отчёт и как в него добавить параметр
Способ зависит от того, на чём построен отчёт. Откройте его в Конфигураторе (или внешний отчёт через Файл → Открыть) и посмотрите на макеты.
- 📊 Есть макет «ОсновнаяСхемаКомпоновкиДанных» — отчёт на СКД. Параметр добавляют в схеме, код почти не нужен.
- 📄 Есть макет-табличный документ и форма с кнопкой «Сформировать», в модуле —
Новый Запрос— старый отчёт. Параметр — это реквизит отчёта, поле на форме иЗапрос.УстановитьПараметр(). - 🔒 Типовой отчёт из конфигурации на поддержке — схему лучше не править. Для пользователя хватает отбора в расширенных настройках, для разработчика — копия в виде внешнего отчёта или расширение.
| Ситуация | Что делать | Нужен Конфигуратор |
|---|---|---|
| Пользователю нужен фильтр в типовом отчёте | Отбор в настройках отчёта, вид «Расширенный» | Нет |
| Свой отчёт на СКД | Параметр в запросе + пользовательские настройки | Да |
| Значение должно подставляться само | Выражение параметра или код модуля | Да |
| Старый отчёт на обычных формах | Реквизит + элемент формы + параметр запроса | Да |
Разница между параметром и отбором простая. Параметр попадает внутрь запроса: в условие ГДЕ или в параметры виртуальной таблицы. Отбор накладывается на поля набора данных. Для дат, периодов остатков и всего, что меняет сам расчёт, нужен параметр. Для «показать только склад Основной» хватит отбора.
Шаг за шагом: новый параметр в отчёте на СКД
Пример: отчёт по продажам, нужно дать пользователю выбрать склад.
1. Пропишите параметр в запросе
Откройте схему компоновки, на закладке «Наборы данных» нажмите «Конструктор запроса» или правьте текст вручную. Добавьте условие:
ВЫБРАТЬ
Продажи.Номенклатура,
Продажи.Склад,
Продажи.Количество
ИЗ
РегистрНакопления.Продажи КАК Продажи
ГДЕ
Продажи.Склад = &Склад
Для виртуальных таблиц условие лучше ставить в параметры таблицы — так платформа отфильтрует данные раньше и быстрее:
РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, Склад = &Склад)
После выхода из конструктора СКД сама создаст параметр Склад на закладке «Параметры». Если параметр задаётся не запросом, а нужен, например, только для выражения, его добавляют там же кнопкой «Добавить».
2. Настройте свойства параметра
На закладке «Параметры» у каждой строки есть колонки. Нужны такие:
- Заголовок — то, что увидит пользователь. «Склад», а не «СкладОтбора».
- Тип —
СправочникСсылка.Склады. Если тип не задан, в поле можно будет ввести что угодно, и отчёт выдаст пустой результат. - Доступен список значений — отметьте, если нужно выбирать несколько складов. Тогда в запросе пишите
Продажи.Склад В (&Склад). - Ограничение доступности — эту галочку для пользовательского параметра снимите. С ней параметр не попадёт в настройки.
- Использование —
АвтоилиВсегда. Про разницу — в разделе об отборах. - Значение — значение по умолчанию, если оно нужно.
3. Выведите параметр в шапку отчёта
Это шаг, который чаще всего пропускают. Параметр в схеме ещё не означает поле на форме.
- Перейдите на закладку «Настройки».
- Внизу откройте закладку «Параметры». Там список параметров без ограничения доступности.
- Поставьте флажок у строки «Склад».
- Выделите строку и нажмите на панели кнопку «Свойства элемента пользовательских настроек».
- Отметьте «Включать в пользовательские настройки».
- Режим редактирования — «Быстрый доступ». Тогда поле будет прямо на форме отчёта. «Обычный» спрячет его в окно «Настройки».
Сохраните схему, обновите конфигурацию базы данных или пересохраните внешний отчёт. Откройте отчёт в режиме 1С:Предприятие — поле «Склад» стоит в шапке.
Отборы и условия: как сделать параметр необязательным
Обычное желание: склад не выбран — показать все склады. С условием Продажи.Склад = &Склад так не выйдет: пустое значение отфильтрует всё до нуля, а при снятом флажке отчёт потребует значение.
Есть три рабочих приёма.
Фигурные скобки языка СКД
В запросе схемы компоновки можно писать условия в фигурных скобках. Такое условие платформа включает в запрос, только когда параметр используется:
ГДЕ
{Продажи.Склад = &Склад}
Или в параметрах виртуальной таблицы:
РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, {Склад = &Склад})
Флажок у параметра снят — условие выпадает из текста запроса. Отмечен — работает. Это самый чистый способ для СКД.
Свойство «Использование»
Всегда— параметр нельзя выключить, значение обязательно передаётся в запрос.Авто— у поля в шапке появляется флажок. Пользователь снимает его, и параметр считается неиспользуемым.
Для необязательных параметров ставьте Авто в паре с фигурными скобками.
Условие с проверкой на пустое значение
Работает и в СКД, и в обычных запросах:
ГДЕ
(&Склад = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
ИЛИ Продажи.Склад = &Склад)
На больших таблицах конструкция с ИЛИ хуже использует индексы. Если отчёт после неё заметно тормозит, переходите на фигурные скобки.
Когда хватит обычного отбора
Если поле есть в выборке набора данных, его можно не превращать в параметр. На закладке «Настройки» → «Отбор» перетащите поле «Склад», задайте вид сравнения «Равно» или «В списке» и так же включите элемент в пользовательские настройки через «Свойства элемента пользовательских настроек».
Пользователь типового отчёта может сделать то же самое без Конфигуратора: кнопка «Настройки» на форме отчёта, вид «Расширенный», закладка «Отборы», добавить поле. Такая настройка сохраняется за пользователем и переживает обновление конфигурации .
{…} и «Использование» = Авто.В (&Параметр).Период, связанные параметры и вычисляемые значения
Параметры периода — самый частый случай. Делают их так.
- Добавьте параметр
Периодс типомСтандартныйПериоди включите в пользовательские настройки. - У параметров
НачалоПериодаиКонецПериода, которые используются в запросе, заполните колонку «Выражение»:&Период.ДатаНачалаи&Период.ДатаОкончания. - Им же поставьте «Ограничение доступности», чтобы пользователь видел одно поле периода, а не три.
ДатаОкончания стандартного периода уже указывает на конец дня, поэтому последний день периода попадает в отчёт целиком.
Ещё один полезный приём — связи параметров выбора. Если в отчёте есть параметры «Организация» и «Склад», в свойствах параметра «Склад» откройте параметры редактирования и задайте связь параметров выбора: отбор по владельцу или организации берётся из параметра «Организация». Пользователь при выборе склада увидит только склады нужной фирмы. Будет ли такая связь работать, зависит от того, есть ли у справочника складов реквизит организации в вашей конфигурации.
Выражение в параметре пишется на языке выражений СКД, а не на встроенном языке. Функции вроде НачалоПериода(&Дата, "МЕСЯЦ") там доступны, а вызовы общих модулей — нет.
Как задать параметр отчёта программно в модуле объекта
Код нужен, когда значение должно подставляться автоматически: текущий пользователь, дата формирования, организация по умолчанию. Такой параметр оставьте с «Ограничением доступности», чтобы он не мешал в шапке.
Значение перед формированием, стандартный вывод
В модуле объекта отчёта создайте обработчик ПриКомпоновкеРезультата:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
Новый ПараметрКомпоновкиДанных("ДатаФормирования"));
Если ЗначениеПараметра <> Неопределено Тогда
ЗначениеПараметра.Значение = ТекущаяДатаСеанса();
ЗначениеПараметра.Использование = Истина;
КонецЕсли;
КонецПроцедуры
СтандартнаяОбработка не трогаем — дальше отчёт сформирует сама платформа.
Короче то же самое делает метод УстановитьЗначениеПараметра:
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаФормирования", ТекущаяДатаСеанса());
Если параметр включён в пользовательские настройки, значение, которое выбрал пользователь, имеет приоритет над записанным в Настройки. Программно задавайте только скрытые параметры, а видимые оставляйте пользователю.
Полностью свой вывод
Когда нужно подменить настройки целиком, отключите стандартную обработку и соберите результат сами:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ДатаФормирования", ТекущаяДатаСеанса());
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
Процессор = Новый ПроцессорКомпоновкиДанных;
Процессор.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ДокументРезультат.Очистить();
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(Процессор);
КонецПроцедуры
ПолучитьНастройки() возвращает настройки уже с учётом пользовательских, поэтому выбор из шапки отчёта не теряется.
Новый параметр прямо в схеме из кода
Бывает, что схему собирают программно. Тогда параметр добавляют в коллекцию Параметры схемы:
НовыйПараметр = Схема.Параметры.Добавить();
НовыйПараметр.Имя = "Склад";
НовыйПараметр.Заголовок = "Склад";
НовыйПараметр.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Склады");
НовыйПараметр.ВключатьВДоступныеПоля = Ложь;
После изменения схемы переинициализируйте компоновщик: КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема)). Без этого новый параметр не появится в настройках.
Параметры в старых отчётах без СКД
Отчёты на обычных формах с выводом в табличный документ встречаются в старых самописных конфигурациях и в обработках, перенесённых с 8.2. Здесь параметр — это обычный реквизит.
- В дереве метаданных отчёта добавьте реквизит
СкладтипаСправочникСсылка.Склады. - Откройте основную форму и перетащите реквизит на форму. Появится поле ввода с кнопкой выбора.
- В процедуре, которая формирует отчёт, передайте значение в запрос.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура,
| Остатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад) КАК Остатки";
Запрос.УстановитьПараметр("Дата", КонецДня(ДатаОтчета));
Запрос.УстановитьПараметр("Склад", Склад);
Макет = ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ТабДок.Очистить();
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(Выборка);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
В управляемой форме всё то же, но формирование лучше выносить в серверную процедуру, а значение реквизита брать через Объект.Склад.
Фигурных скобок здесь нет — это возможность только СКД. Необязательный фильтр делают условием с проверкой на пустую ссылку или собирают текст запроса по условию:
Если ЗначениеЗаполнено(Склад) Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеСклад", "Остатки.Склад = &Склад");
Запрос.УстановитьПараметр("Склад", Склад);
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеСклад", "ИСТИНА");
КонецЕсли;
Для этого в тексте запроса оставьте заглушку: ГДЕ &УсловиеСклад.
Если отчёт всё равно переделывается, переносите его на СКД. Отборы, группировки, расшифровка и сохранение настроек появятся без строчки кода.
Ошибки при добавлении параметра и как их снять
{…}.В (&Параметр), а не знак равенства.&Период.ДатаОкончания у стандартного периода или оборачивайте дату в КонецДня() в коде.Настройки. Либо скройте параметр, либо меняйте значение в пользовательских настройках.Как не сломать отчёт и не замедлить его
- 🧩 Не правьте схему типового отчёта на поддержке. При обновлении правки придётся сливать вручную. Копия во внешнем отчёте или расширение избавят от этого.
- ⚡ Фильтруйте как можно раньше. Условие в параметрах виртуальной таблицы быстрее, чем
ГДЕпосле неё, аГДЕбыстрее отбора по полю в настройках. - 🏷️ Давайте параметрам понятные заголовки. Имя
НачалоПериодауйдёт в код, а пользователь увидит «Дата с». - 🔐 Служебные параметры скрывайте. Всё, что заполняется выражением или кодом, — с «Ограничением доступности».
- 🗂️ Используйте варианты отчёта. Если одному отделу нужен склад, а другому — организация, сделайте два варианта на закладке «Настройки», а не один перегруженный.
- 🧪 Проверяйте на копии базы. Новый параметр в тяжёлом отчёте сначала гоняйте на копии, чтобы увидеть время формирования на реальных объёмах.
Можно ли добавить параметр в типовой отчёт без программиста?
Чем параметр с «Быстрым доступом» отличается от «Обычного»?
Как сделать выбор нескольких значений в одном параметре?
В (&Параметр). В шапке появится поле со списком.