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