Как запретить пользователям удалять и редактировать отбор в отчете 1С 8.1?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Разберем типичную прикладную задачу: в конфигурации «Управление торговлей 10.3» (обычные формы, платформа 1С:Предприятие 8.1 / 8.2 / 8.3) требуется сформировать типовой универсальный отчет с жестко зафиксированным отбором, например, по конкретной торговой точке или кассе. При этом необходимо исключить возможность отключения, изменения или полного удаления данного условия пользователем.

Проанализируем техническую особенность объекта ПостроительОтчета. В отличие от Системы компоновки данных (СКД), где у каждого элемента пользовательских настроек предусмотрены свойства режима редактирования, у объекта ЭлементОтбора построителя отчета отсутствуют встроенные свойства доступности или только просмотра. Попытка обратиться к свойствам вроде ЭлементОтбора.Доступность вызовет синтаксическую ошибку. Рассмотрим проверенные и надежные способы реализации такого ограничения.

Способ 1. Вынос фиксированного условия в параметры запроса

Самый надежный способ защитить условие от изменения — сделать так, чтобы оно вообще не попадало в список доступных отборов построителя. Построитель отчета формирует пользовательские отборы только по тем полям, которые заключены в фигурные скобки {ГДЕ ...} в тексте запроса.

Перенесем жесткое ограничение в основную секцию запроса, передав значение через параметры:

  1. Откроем текст запроса универсального отчета и найдем секцию условий.
  2. Удалим поле РозничнаяТочка из фигурных скобок {ГДЕ ...}.
  3. Добавим явное условие в секцию ГДЕ основного запроса:

ГДЕ
	Таблица.РозничнаяТочка = &ФиксированнаяКасса

Затем в коде инициализации или формирования отчета передадим значение через коллекцию параметров построителя:


ОтчетОбъект.УниверсальныйОтчет.ПостроительОтчета.Параметры.Вставить("ФиксированнаяКасса", ЗначениеКасса);

В результате поле полностью исчезнет из диалога настройки отборов, и пользователь физически не сможет повлиять на его фильтрацию.

Способ 2. Управление интерактивными действиями в табличном поле формы

Если условие должно отображаться в интерфейсе, но пользователю требуется запретить его удаление или изменение, обратимся к свойствам и событиям элементов управления формы отчета. На форме универсального отчета список отборов выводится с помощью элемента ТабличноеПоле.

Выполним настройку перехвата событий табличного поля отборов:

  1. Запрет удаления строки отбора. В обработчике события ПередУдалением проверяем имя текущего поля:

Процедура ТабличноеПолеОтборПередУдалением(Элемент, Отказ)
	
	ТекущаяСтрока = Элемент.ТекущиеДанные;
	Если ТекущаяСтрока <> Неопределено И ТекущаяСтрока.Имя = "РозничнаяТочка" Тогда
		Отказ = Истина;
		Сообщить("Удаление данного условия отбора запрещено настройками системы!");
	КонецЕсли;

КонецПроцедуры
  1. Запрет редактирования значения и флага использования. Перехватим событие ПриНачалеРедактирования:

Процедура ТабличноеПолеОтборПриНачалеРедактирования(Элемент, НоваяСтрока, Отказ)
	
	ТекущаяСтрока = Элемент.ТекущиеДанные;
	Если ТекущаяСтрока <> Неопределено И ТекущаяСтрока.Имя = "РозничнаяТочка" Тогда
		Отказ = Истина;
	КонецЕсли;

КонецПроцедуры
  1. Визуальная блокировка ячеек. Чтобы ячейки выглядели заблокированными, задействуем обработчик ПриВыводеСтроки:

Процедура ТабличноеПолеОтборПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
	
	Если ДанныеСтроки.Имя = "РозничнаяТочка" Тогда
		ОформлениеСтроки.Ячейки.Использование.ТолькоПросмотр = Истина;
		ОформлениеСтроки.Ячейки.ВидСравнения.ТолькоПросмотр = Истина;
		ОформлениеСтроки.Ячейки.Значение.ТолькоПросмотр = Истина;
		ОформлениеСтроки.ЦветТекста = ЦветаСтиля.ТекстЗапрещеннойЯчейки;
	КонецЕсли;

КонецПроцедуры

Способ 3. Принудительное восстановление значения перед формированием

В типовых конфигурациях при открытии отчета могут подтягиваться сохраненные пользовательские настройки, затирая программно установленные значения. Чтобы гарантировать применение нужного фильтра вне зависимости от действий пользователя в диалоге, переопределим отбор непосредственно в процедуре формирования отчета перед вызовом метода Выполнить():


Элемент = УниверсальныйОтчет.ПостроительОтчета.Отбор.Найти("РозничнаяТочка");
Если Элемент = Неопределено Тогда
	Элемент = УниверсальныйОтчет.ПостроительОтчета.Отбор.Добавить("РозничнаяТочка");
КонецЕсли;

Элемент.Использование = Истина;
Элемент.ВидСравнения = ВидСравнения.Равно;
Элемент.Значение = ЗначениеКасса;

Даже если пользователь снял флажок, поменял значение или нажал кнопку сброса настроек, данный код принудительно восстановит требуемый отбор в момент построения отчета.

Способ 4. Использование механизма RLS

Если задача ограничения доступа к данным носит характер безопасности (пользователь кассы не должен видеть чеки и выручку других касс ни при каких обстоятельствах), отборов на уровне конкретного отчета недостаточно. Пользователь может открыть другой отчет, список документов или консоль запросов.

В такой ситуации правильным решением является настройка ограничения доступа на уровне записей (RLS) в правах соответствующей роли пользователя. Ограничение накладывается на уровне таблиц базы данных в конфигураторе, благодаря чему исключается просмотр чужих данных в любых объектах конфигурации.

← На главную