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