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