Отчеты и Аналитика · 11 мин
Как передать параметры в отчет на СКД в 1С
Как передать параметры в отчет на СКД в 1С: настройка в схеме компоновки, передача из кода и формы, обязательные параметры, типовые ошибки и примеры.
Параметры в отчете на системе компоновки данных (СКД) позволяют пользователю управлять содержимым отчета: ограничивать период, выбирать контрагента, склад или организацию. Без правильно настроенных параметров отчет либо выводит лишние данные, либо вообще не формируется, если параметр объявлен обязательным.
Передать параметры в СКД можно несколькими способами: через закладку «Параметры» в схеме компоновки, программно из модуля объекта или формы отчета, а также через настройки пользователя в режиме предприятия. Каждый способ решает свою задачу, и часто они комбинируются в одном отчете.
Ниже разобраны основные сценарии: объявление параметров, связь их с запросом, передача значений из кода, работа со стандартными периодами, типовые ошибки и проверка результата. Примеры ориентированы на управляемые формы, но логика применима и к обычным формам.
Как объявить параметр в схеме компоновки данных
Откройте схему компоновки данных отчета и перейдите на закладку «Параметры». Добавьте новый параметр кнопкой «Добавить», задайте имя (латиницей, без пробелов, например НачалоПериода или Организация) и выберите тип данных. Тип должен совпадать с типом поля, с которым параметр сравнивается в запросе, иначе получите ошибку несоответствия типов или пустой отчет.
Для периодических отчетов удобно использовать тип «СтандартныйПериод» — тогда пользователь выбирает период одним полем, а в запросе используются выражения &НачалоПериода и &КонецПериода через свойства СтандартныйПериод.ДатаНачала и СтандартныйПериод.ДатаОкончания. Альтернатива — два отдельных параметра типа «Дата».
Флажок «Ограничение доступности» снимают, если параметр должны видеть и менять пользователи в форме настроек. Если оставить ограничение, параметр доступен только программно. Поле «Выражение» позволяет задать значение по умолчанию, например выражение на языке выражений СКД.
Как связать параметр с запросом набора данных
Самый простой способ — использовать параметр напрямую в тексте запроса в условии ГДЕ: ГДЕ Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода. Конструктор СКД автоматически подхватит параметры из запроса при нажатии кнопки «Заполнить» на закладке «Параметры», если включено автозаполнение.
Для виртуальных таблиц (обороты, остатки) параметры передаются в круглых скобках: РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ). Это эффективнее, чем фильтрация в условии ГДЕ, потому что отбор выполняется на уровне виртуальной таблицы до соединения данных.
Если параметр должен применяться только при заполненном значении, используйте расширение языка запросов СКД — фигурные скобки: {ГДЕ (Продажи.Контрагент = &Контрагент)}. Тогда при снятом флажке «Использование» условие исключается из итогового запроса, и отчет показывает данные по всем контрагентам.
Как передать параметры программно из кода
Программная передача нужна, когда отчет формируется из обработки, команды или при открытии формы с предустановленными значениями. Доступ к параметрам дает коллекция Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных. Типовой код выглядит так:
Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Организация");
Если Параметр <> Неопределено Тогда
Параметр.Использование = Истина;
Параметр.Значение = ВыбраннаяОрганизация;
КонецЕсли;
Обратите внимание на два обязательных действия: установка флага Использование и присвоение значения. Если установить только значение без флага использования, параметр не применится — это одна из самых частых причин «не работающего» кода.
Когда отчет формируется полностью программно (без формы), последовательность такая: создать объект отчета, получить схему, загрузить настройки в компоновщик, установить параметры, затем через КомпоновщикМакета и ПроцессорКомпоновкиДанных вывести результат в табличный документ. Для установки значений удобно обращаться к настройкам компоновщика до формирования макета.
- 1Откройте схему компоновки и убедитесь, что параметр объявлен на закладке «Параметры»
- 2Свяжите параметр с запросом: условие ГДЕ или параметры виртуальной таблицы
- 3В коде найдите параметр в Настройки.ПараметрыДанных.Элементы по имени
- 4Установите Использование = Истина и присвойте Значение нужного типа
- 5Сформируйте отчет и проверьте, что данные отфильтрованы по параметру
Передача параметров при открытии формы отчета
Частый сценарий — открыть отчет из документа или списка с уже заполненными отборами. Для этого используются параметры формы: при вызове ОткрытьФорму("Отчет.Продажи.Форма", ПараметрыФормы) передайте структуру, а в обработчике ПриСозданииНаСервере формы отчета прочитайте значения и установите их в настройки компоновщика.
В типовых конфигурациях на БСП есть механизм передачи отбора через параметр формы Отбор — структура, где ключи совпадают с именами полей компоновки. Если отчет подключен к подсистеме «Варианты отчетов», платформа сама применит переданный отбор без дополнительного кода.
Для самописных отчетов без БСП реализуйте установку вручную: в ПриСозданииНаСервере проверьте наличие параметров формы, найдите соответствующие элементы в ПараметрыДанных и Отбор настроек и заполните их. Дополнительно установите ключ СформироватьПриОткрытии, чтобы отчет построился сразу.
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("Организация", ОрганизацияСсылка));
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ОткрытьФорму("Отчет.Продажи.ФормаОбъекта", ПараметрыФормы);Стандартные периоды, даты и списки значений
Параметр типа «СтандартныйПериод» в коде заполняется объектом СтандартныйПериод: создайте его, назначьте ДатаНачала и ДатаОкончания (или вариант вроде ВариантСтандартногоПериода.ЭтотМесяц) и присвойте параметру. В запросе при этом используйте два параметра дат, которые СКД свяжет со стандартным периодом автоматически, если имена совпадают с настройками.
Для передачи списка значений (например, несколько складов) объявите параметр с флажком «Доступен список значений» и в запросе используйте условие В (&Склады). Из кода присваивайте объект СписокЗначений или массив. Условие «В ИЕРАРХИИ» работает для ссылочных типов с иерархией.
Помните про границы дат: дата окончания без времени означает начало дня, поэтому записи за последний день периода могут не попасть в отчет. Используйте функцию КонецПериода(Дата, ДЕНЬ) в запросе или передавайте дату с временем 23:59:59.
Обязательные параметры и проверка заполнения
Если без параметра отчет бессмыслен (например, расшифровка по конкретному документу), сделайте его обязательным. В типовых механизмах на БСП проверка выполняется автоматически для параметров с установленным флагом «Использование» и пустым значением. В самописном отчете добавьте проверку в обработчике ПриКомпоновкеРезультата модуля объекта: если значение не заполнено, вызовите исключение с понятным текстом и отмените формирование.
Не делайте обязательными параметры, которые логично оставлять пустыми: например, отбор по контрагенту обычно должен быть необязательным, иначе пользователь не сможет посмотреть сводные данные. Правильный критерий — обязателен только тот параметр, без которого запрос технически не может выполниться корректно.
Как проверить, что параметры применились
Первый признак — данные в отчете соответствуют заданным ограничениям: период, организация, контрагент совпадают с переданными. Если отчет пуст, проверьте в консоли СКД (или через временный вывод итогового запроса), какое условие реально ушло в запрос, и сравните значения параметров с данными базы.
Полезная техника отладки — временно вывести значения параметров через Сообщить() перед формированием. Так вы сразу увидите, дошло ли значение до компоновщика и установлен ли флаг использования. Также проверьте, что в настройках пользователя (закладка «Параметры» формы отчета) не переопределено значение — пользовательские настройки имеют приоритет над программными при загрузке варианта.
Как проверить результат
Установлен в Истина перед формированием
Ложь — параметр не применяется
Соответствуют переданным отборам
Выводятся все данные или пусто
Совпадает с типом поля в запросе
Ошибка несоответствия типов при формировании
Включены все записи последнего дня
Пропадают данные за конечную дату
Частые вопросы
Почему параметр установлен в коде, но отчет его игнорирует?
Чаще всего не установлен флаг Использование. Вторая причина — пользовательские настройки варианта отчета перекрывают программные значения. Очистите пользовательские настройки или устанавливайте параметр в пользовательских настройках компоновщика, а не только в основных.
Как передать в отчет список контрагентов?
Объявите параметр с признаком «Доступен список значений», в запросе используйте условие В (&Контрагенты), а из кода присвойте объект СписокЗначений или массив ссылок. Условие оберните в фигурные скобки, если отбор должен быть необязательным.
Чем параметр отличается от отбора в СКД?
Параметр напрямую подставляется в запрос (в том числе в параметры виртуальных таблиц) и влияет на этап получения данных. Отбор применяется компоновкой к уже полученному набору. Для виртуальных таблиц параметры эффективнее, для гибких пользовательских условий удобнее отборы.
Как задать значение параметра по умолчанию?
На закладке «Параметры» схемы компоновки заполните колонку «Значение» или «Выражение» — например, выражение для текущей даты. Значение по умолчанию применится, пока пользователь или код не переопределят его.
Можно ли передать параметры в отчет через команду из документа?
Да. В модуле команды сформируйте структуру параметров формы с отбором по ссылке документа и откройте форму отчета с этими параметрами. В конфигурациях на БСП отбор применится автоматически, в самописных — обработайте параметры в ПриСозданииНаСервере формы отчета.
Почему отчет выдает ошибку «Параметр не используется»?
Параметр объявлен в схеме, но не встречается ни в запросе, ни в выражениях. Либо добавьте его в условие запроса (возможно, в фигурных скобках), либо удалите из списка параметров, либо отключите автозаполнение и настройте параметры вручную.
Что важно запомнить
Параметр создается на закладке «Параметры» СКД, связывается с запросом через &ИмяПараметра, а из кода устанавливается через ПараметрыДанных с обязательным флагом Использование. Для необязательных условий используйте фигурные скобки, для периодов — СтандартныйПериод, и всегда проверяйте типы значений и границы дат.