Как ограничить редактирование и поиск в полях отбора отчета СКД

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

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

Метод 1. Использование события ОбработкаПолученияДанныхВыбора (Модуль менеджера)

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

Разберем по шагам логику работы в расширении. Нам необходимо переопределить процедуру ОбработкаПолученияДанныхВыбора. В ней мы отключим стандартную обработку поиска и сформируем свой список значений на основе прав доступа или данных из регистра сведений.

Проанализируем пример кода, который решает задачу ограничения списка доступных статей ДДС для конкретного пользователя:


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

В данном примере мы используем СтандартнаяОбработка = Ложь. Это критически важный момент: он сообщает системе, что мы берем управление на себя и стандартный поиск по наименованию или коду выполнять не нужно. Если пользователь введет текст, поиск будет идти только по тем записям, которые мы выбрали в запросе из регистра TSS_ДоступКДДС.

Метод 2. Ограничение через настройки СКД (без программирования)

Выясним, как можно решить задачу, используя только штатные средства конструктора схемы компоновки данных. Если список значений фиксирован или может быть определен заранее, рассмотрим закладку Наборы данных в редакторе СКД.

  1. Выберем нужное поле в списке полей набора данных.
  2. Найдем колонку Параметры редактирования.
  3. В открывшемся окне можно настроить свойство Списки выбора или Связи параметров выбора.
  4. Если установить конкретные Доступные значения, то вместо поля ввода с возможностью поиска пользователь увидит выпадающий список. Это автоматически исключит возможность ручного ввода произвольного текста.

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

Метод 3. Программное отключение текстового ввода в форме отчета

Рассмотрим ситуацию, когда нам нужно запретить именно редактирование текста в поле отбора, оставив только кнопку выбора ("три точки"). Это гарантирует, что пользователь не сможет ничего написать в поле, а будет вынужден нажать кнопку и выбрать элемент из формы.

Поскольку поля пользовательских настроек (отборов) в отчетах генерируются динамически, нам нужно программно найти элемент формы в событии ПриСозданииНаСервере или ПриЗагрузкеВариантаНаСервере. Проанализируем следующий алгоритм:


// В модуле формы отчета
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Перебираем элементы формы, относящиеся к пользовательским настройкам
    Для Каждого ЭлементФормы Из Элементы Цикл
        // Ищем поле, связанное с нужным нам параметром или отбором
        // Обычно имя содержит путь к данным настройки
        Если СтрНайти(ЭлементФормы.Имя, "СтатьяДДС") > 0 Тогда
            // Запрещаем ручной ввод текста в поле
            ЭлементФормы.РедактированиеТекста = Ложь;
            // Можно также отключить кнопку создания нового элемента прямо из отбора
            ЭлементФормы.КнопкаСоздания = Ложь;
            // Отключаем кнопку выпадающего списка, если нужен только выбор из формы
            ЭлементФормы.КнопкаСпискаВыбора = Ложь;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

Установка свойства РедактированиеТекста = Ложь — это самый эффективный визуальный способ достичь цели. Поле становится визуально доступным, но курсор в него не ставится, и клавиатурный ввод игнорируется.

Метод 4. Использование механизмов RLS (Row Level Security)

Проанализируем архитектурно верный подход. Если задача стоит как "скрыть ненужные данные от определенных глаз", то лучшим решением в долгосрочной перспективе будет настройка RLS (Ограничение доступа на уровне записей). Перед внедрением стоит выполнить анализ прав и ролей для поиска подходящего профиля. В конфигурациях уровня КА 2.4 или ERP это настраивается через профили групп доступа, а для специфических задач может потребоваться доработка RLS по организации для 1С:ERP.

Преимущества этого метода:

  1. Глобальность: Данные будут скрыты не только в одном отчете, но и во всех документах, списках и даже при обращении через консоль запросов.
  2. Безопасность: Пользователь в принципе не сможет получить доступ к объекту, на который у него нет прав.
  3. Отсутствие дублирования кода: Вам не придется писать расширения для каждого отчета или справочника.

Однако помните, что сложные правила RLS могут снижать производительность системы при формировании отчетов, так как к каждому SQL-запросу будет добавляться подзапрос проверки прав.

Резюме и рекомендации

Мы рассмотрели несколько способов ограничения выбора. Выбор конкретного метода зависит от вашей конечной цели:

Совместное использование этих методов позволит создать интуитивно понятный и защищенный интерфейс для конечного пользователя.

← На главную