В процессе разработки отчетов в системе 1С:Предприятие 8.3 часто возникает необходимость строго регламентировать действия пользователя. Одной из таких задач является ограничение возможностей ввода в полях отбора: например, когда нужно запретить пользователю вводить текст вручную (использовать текстовый поиск) или создавать новые элементы, оставив лишь возможность выбора из строго определенного списка или формы выбора. Чтобы реализовать контроль видимости и доступности элементов управляемой формы, необходимо проанализировать ситуацию, разобрать возможные методы решения и детально рассмотреть программную реализацию.
Рассмотрим наиболее гибкий и мощный способ — перехват события получения данных выбора в модуле менеджера объекта (справочника), который используется в отборе. Этот метод позволяет полностью контролировать то, что видит пользователь, когда нажимает на кнопку выбора или начинает вводить текст. Мы будем использовать механизм расширений, чтобы не снимать конфигурацию с поддержки. Похожим образом работает универсальное расширение для управления видимостью и доступностью реквизитов справочников, позволяя гибко настраивать поведение элементов.
Разберем по шагам логику работы в расширении. Нам необходимо переопределить процедуру ОбработкаПолученияДанныхВыбора. В ней мы отключим стандартную обработку поиска и сформируем свой список значений на основе прав доступа или данных из регистра сведений.
Проанализируем пример кода, который решает задачу ограничения списка доступных статей ДДС для конкретного пользователя:
&После("ОбработкаПолученияДанныхВыбора")
Процедура TSS_ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
// Проверяем наличие полных прав, чтобы не ограничивать администраторов
Если НЕ УправлениеДоступом.ЕстьРоль("ПолныеПрава") Тогда
// Отключаем стандартный механизм поиска платформы
СтандартнаяОбработка = Ложь;
// Формируем запрос к нашему регистру сведений, где хранятся разрешенные статьи
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| TSS_ДоступКДДС.СтатьяДДС КАК СтатьяДДС
|ИЗ
| РегистрСведений.TSS_ДоступКДДС КАК TSS_ДоступКДДС
|ГДЕ
| TSS_ДоступКДДС.Пользователь = &Пользователь
| И TSS_ДоступКДДС.СтатьяДДС.Наименование ПОДОБНО &СтрокаПоиска";
// Устанавливаем параметры: текущего пользователя и строку, которую он начал вводить
Запрос.УстановитьПараметр("Пользователь", Пользователи.ТекущийПользователь());
Запрос.УстановитьПараметр("СтрокаПоиска", "%" + Параметры.СтрокаПоиска + "%");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
// Создаем список значений, который вернем в платформу для отображения пользователю
Список = Новый СписокЗначений;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Список.Добавить(ВыборкаДетальныеЗаписи.СтатьяДДС);
КонецЦикла;
// Подменяем стандартные данные выбора нашим сформированным списком
ДанныеВыбора = Список;
КонецЕсли;
КонецПроцедуры
В данном примере мы используем СтандартнаяОбработка = Ложь. Это критически важный момент: он сообщает системе, что мы берем управление на себя и стандартный поиск по наименованию или коду выполнять не нужно. Если пользователь введет текст, поиск будет идти только по тем записям, которые мы выбрали в запросе из регистра TSS_ДоступКДДС.
Выясним, как можно решить задачу, используя только штатные средства конструктора схемы компоновки данных. Если список значений фиксирован или может быть определен заранее, рассмотрим закладку Наборы данных в редакторе СКД.
Также полезно обратить внимание на свойство Быстрый выбор. Если установить его в значение Истина, выбор будет происходить из небольшого выпадающего списка, что часто удобнее для пользователя, чем открытие громоздкой формы справочника.
Рассмотрим ситуацию, когда нам нужно запретить именно редактирование текста в поле отбора, оставив только кнопку выбора ("три точки"). Это гарантирует, что пользователь не сможет ничего написать в поле, а будет вынужден нажать кнопку и выбрать элемент из формы.
Поскольку поля пользовательских настроек (отборов) в отчетах генерируются динамически, нам нужно программно найти элемент формы в событии ПриСозданииНаСервере или ПриЗагрузкеВариантаНаСервере. Проанализируем следующий алгоритм:
// В модуле формы отчета
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Перебираем элементы формы, относящиеся к пользовательским настройкам
Для Каждого ЭлементФормы Из Элементы Цикл
// Ищем поле, связанное с нужным нам параметром или отбором
// Обычно имя содержит путь к данным настройки
Если СтрНайти(ЭлементФормы.Имя, "СтатьяДДС") > 0 Тогда
// Запрещаем ручной ввод текста в поле
ЭлементФормы.РедактированиеТекста = Ложь;
// Можно также отключить кнопку создания нового элемента прямо из отбора
ЭлементФормы.КнопкаСоздания = Ложь;
// Отключаем кнопку выпадающего списка, если нужен только выбор из формы
ЭлементФормы.КнопкаСпискаВыбора = Ложь;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Установка свойства РедактированиеТекста = Ложь — это самый эффективный визуальный способ достичь цели. Поле становится визуально доступным, но курсор в него не ставится, и клавиатурный ввод игнорируется.
Проанализируем архитектурно верный подход. Если задача стоит как "скрыть ненужные данные от определенных глаз", то лучшим решением в долгосрочной перспективе будет настройка RLS (Ограничение доступа на уровне записей). Перед внедрением стоит выполнить анализ прав и ролей для поиска подходящего профиля. В конфигурациях уровня КА 2.4 или ERP это настраивается через профили групп доступа, а для специфических задач может потребоваться доработка RLS по организации для 1С:ERP.
Преимущества этого метода:
Однако помните, что сложные правила RLS могут снижать производительность системы при формировании отчетов, так как к каждому SQL-запросу будет добавляться подзапрос проверки прав.
Мы рассмотрели несколько способов ограничения выбора. Выбор конкретного метода зависит от вашей конечной цели:
ОбработкаПолученияДанныхВыбора в расширении модуля менеджера.РедактированиеТекста = Ложь в форме отчета.Совместное использование этих методов позволит создать интуитивно понятный и защищенный интерфейс для конечного пользователя.