Как скрыть строки в форме списка документов по условию для конкретного пользователя в 1С 8.3

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

В процессе разработки в среде 1С:Предприятие 8.3 часто возникает задача разграничения видимости данных в формах списков. Рассмотрим типичную ситуацию: в конфигурации «Бухгалтерия предприятия 3.0» есть два пользователя и документ с булевым реквизитом. Нам необходимо сделать так, чтобы один из пользователей не видел строки документов, у которых этот реквизит имеет значение Ложь, до тех пор, пока другой пользователь не установит признак в значение Истина.

Многие начинающие разработчики пытаются решить эту задачу через Условное оформление, однако этот подход имеет свои ограничения. Разберем подробно все доступные инструменты и выберем оптимальный вариант в зависимости от требуемой строгости ограничений.

Метод 1. Программная установка фиксированного отбора

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

Рассмотрим по шагам, как реализовать это в коде. Вся логика должна располагаться в процедуре ПриСозданииНаСервере модуля формы списка.

Сначала нам нужно определить текущего пользователя. Рекомендуется использовать идентификацию не по строковому имени, а через ссылки или роли, чтобы избежать ошибок при переименовании пользователей. Затем мы добавим элемент отбора в динамический список.


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

Этот метод гарантирует, что Юзер2 увидит только те документы, где Рекв1 установлен в Истина. Остальные документы будут просто отсутствовать в списке.

Метод 2. Динамическое изменение текста запроса

Иногда условие скрытия строк бывает достаточно сложным и зависит от множества параметров. В таких случаях мы можем программно изменить сам текст SQL-подобного запроса, который лежит в основе динамического списка. Проанализируем, как это сделать.

Разберем пример, где мы добавляем условие ГДЕ непосредственно в текст запроса. Это работает быстрее, чем наложение фильтров на уже полученную выборку, особенно на больших объемах данных в базе.


&НаСервере
Процедура НастроитьЗапросСписка()
    
    ТекстЗапроса = Список.ТекстЗапроса;
    
    // Проверяем пользователя
    Если ПользователиИнформационнойБазы.ТекущийПользователь().Имя = "Юзер2" Тогда
        // Добавляем условие в запрос. 
        // Важно убедиться, что в исходном запросе нет конфликтующих условий ГДЕ
        ТекстЗапроса = ТекстЗапроса + " 
            |ГДЕ
            |   ДокументОбъект.Рекв1 = ИСТИНА";
    КонецЕсли;
    
    Список.ТекстЗапроса = ТекстЗапроса;
    
КонецПроцедуры

Использование параметров запроса (например, &ТекущийПользователь) делает этот метод еще более гибким и безопасным с точки зрения производительности СУБД.

Метод 3. Почему Условное оформление — не лучший выбор?

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

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

Метод 4. Row Level Security (RLS) — максимальная защита

Если задача состоит не просто в том, чтобы «не мозолить глаза» пользователю, а в реальном ограничении прав доступа к коммерческой информации, то предыдущие методы (отборы в форме) будут недостаточны.

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

  1. Универсальном отчете или любой другой консоли запросов.
  2. При выборе этого документа в качестве значения поля (например, в другом документе).
  3. В результатах глобального поиска по базе.

Для обеспечения реальной безопасности необходимо использовать механизм RLS (Row Level Security). Рассмотрим, как он работает в современных конфигурациях на базе БСП (Библиотека Стандартных Подсистем):

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

Резюме и практические рекомендации

Подводя итог, выделим основные правила выбора решения:

  1. Если нужно просто удобство работы («чтобы не мешало»), используйте программный фиксированный отбор через КомпоновщикНастроек в событии ПриСозданииНаСервере. Это самый простой и быстрый в реализации способ.
  2. Если условие фильтрации крайне сложное и требует соединения с другими таблицами, используйте изменение текста запроса динамического списка.
  3. Если требуется защита данных от просмотра в отчетах и через прямой поиск, используйте RLS. Помните, что избыточное использование RLS может замедлить работу системы.
  4. Никогда не используйте условное оформление для задачи «скрыть данные», оно предназначено только для раскраски.

При реализации проверки пользователя всегда старайтесь использовать механизмы БСП, такие как Пользователи.ТекущийПользователь() или РолиДоступны(), чтобы код оставался надежным и легко поддерживаемым.

← На главную