Разберем типичную прикладную задачу: в конфигурации «Управление торговлей 10.3» (обычные формы, платформа 1С:Предприятие 8.1 / 8.2 / 8.3) требуется сформировать типовой универсальный отчет с жестко зафиксированным отбором, например, по конкретной торговой точке или кассе. При этом необходимо исключить возможность отключения, изменения или полного удаления данного условия пользователем.
Проанализируем техническую особенность объекта ПостроительОтчета. В отличие от Системы компоновки данных (СКД), где у каждого элемента пользовательских настроек предусмотрены свойства режима редактирования, у объекта ЭлементОтбора построителя отчета отсутствуют встроенные свойства доступности или только просмотра. Попытка обратиться к свойствам вроде ЭлементОтбора.Доступность вызовет синтаксическую ошибку. Рассмотрим проверенные и надежные способы реализации такого ограничения.
Самый надежный способ защитить условие от изменения — сделать так, чтобы оно вообще не попадало в список доступных отборов построителя. Построитель отчета формирует пользовательские отборы только по тем полям, которые заключены в фигурные скобки {ГДЕ ...} в тексте запроса.
Перенесем жесткое ограничение в основную секцию запроса, передав значение через параметры:
РозничнаяТочка из фигурных скобок {ГДЕ ...}.ГДЕ основного запроса:
ГДЕ
Таблица.РозничнаяТочка = &ФиксированнаяКасса
Затем в коде инициализации или формирования отчета передадим значение через коллекцию параметров построителя:
ОтчетОбъект.УниверсальныйОтчет.ПостроительОтчета.Параметры.Вставить("ФиксированнаяКасса", ЗначениеКасса);
В результате поле полностью исчезнет из диалога настройки отборов, и пользователь физически не сможет повлиять на его фильтрацию.
Если условие должно отображаться в интерфейсе, но пользователю требуется запретить его удаление или изменение, обратимся к свойствам и событиям элементов управления формы отчета. На форме универсального отчета список отборов выводится с помощью элемента ТабличноеПоле.
Выполним настройку перехвата событий табличного поля отборов:
ПередУдалением проверяем имя текущего поля:
Процедура ТабличноеПолеОтборПередУдалением(Элемент, Отказ)
ТекущаяСтрока = Элемент.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено И ТекущаяСтрока.Имя = "РозничнаяТочка" Тогда
Отказ = Истина;
Сообщить("Удаление данного условия отбора запрещено настройками системы!");
КонецЕсли;
КонецПроцедуры
ПриНачалеРедактирования:
Процедура ТабличноеПолеОтборПриНачалеРедактирования(Элемент, НоваяСтрока, Отказ)
ТекущаяСтрока = Элемент.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено И ТекущаяСтрока.Имя = "РозничнаяТочка" Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
ПриВыводеСтроки:
Процедура ТабличноеПолеОтборПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ДанныеСтроки.Имя = "РозничнаяТочка" Тогда
ОформлениеСтроки.Ячейки.Использование.ТолькоПросмотр = Истина;
ОформлениеСтроки.Ячейки.ВидСравнения.ТолькоПросмотр = Истина;
ОформлениеСтроки.Ячейки.Значение.ТолькоПросмотр = Истина;
ОформлениеСтроки.ЦветТекста = ЦветаСтиля.ТекстЗапрещеннойЯчейки;
КонецЕсли;
КонецПроцедуры
В типовых конфигурациях при открытии отчета могут подтягиваться сохраненные пользовательские настройки, затирая программно установленные значения. Чтобы гарантировать применение нужного фильтра вне зависимости от действий пользователя в диалоге, переопределим отбор непосредственно в процедуре формирования отчета перед вызовом метода Выполнить():
Элемент = УниверсальныйОтчет.ПостроительОтчета.Отбор.Найти("РозничнаяТочка");
Если Элемент = Неопределено Тогда
Элемент = УниверсальныйОтчет.ПостроительОтчета.Отбор.Добавить("РозничнаяТочка");
КонецЕсли;
Элемент.Использование = Истина;
Элемент.ВидСравнения = ВидСравнения.Равно;
Элемент.Значение = ЗначениеКасса;
Даже если пользователь снял флажок, поменял значение или нажал кнопку сброса настроек, данный код принудительно восстановит требуемый отбор в момент построения отчета.
Если задача ограничения доступа к данным носит характер безопасности (пользователь кассы не должен видеть чеки и выручку других касс ни при каких обстоятельствах), отборов на уровне конкретного отчета недостаточно. Пользователь может открыть другой отчет, список документов или консоль запросов.
В такой ситуации правильным решением является настройка ограничения доступа на уровне записей (RLS) в правах соответствующей роли пользователя. Ограничение накладывается на уровне таблиц базы данных в конфигураторе, благодаря чему исключается просмотр чужих данных в любых объектах конфигурации.