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