В процессе разработки в среде 1С:Предприятие 8.3 часто возникает задача разграничения видимости данных в формах списков. Рассмотрим типичную ситуацию: в конфигурации «Бухгалтерия предприятия 3.0» есть два пользователя и документ с булевым реквизитом. Нам необходимо сделать так, чтобы один из пользователей не видел строки документов, у которых этот реквизит имеет значение Ложь, до тех пор, пока другой пользователь не установит признак в значение Истина.
Многие начинающие разработчики пытаются решить эту задачу через Условное оформление, однако этот подход имеет свои ограничения. Разберем подробно все доступные инструменты и выберем оптимальный вариант в зависимости от требуемой строгости ограничений.
Проанализируем самый распространенный и эффективный способ скрытия данных на уровне интерфейса конкретной формы — использование КомпоновщикаНастроек динамического списка. Нам важно использовать именно ФиксированныеНастройки, так как пользователь не сможет изменить или отключить их через стандартное меню «Настроить список».
Рассмотрим по шагам, как реализовать это в коде. Вся логика должна располагаться в процедуре ПриСозданииНаСервере модуля формы списка.
Сначала нам нужно определить текущего пользователя. Рекомендуется использовать идентификацию не по строковому имени, а через ссылки или роли, чтобы избежать ошибок при переименовании пользователей. Затем мы добавим элемент отбора в динамический список.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Определяем текущего пользователя
ТекущийПользователь = Пользователи.ТекущийПользователь();
// Предположим, нам нужно ограничить видимость для "Юзера 2"
// В реальной задаче лучше проверять наличие определенной Роли
Если ТекущийПользователь.Наименование = "Юзер2" Тогда
// Очистим старые фиксированные отборы, если они могли быть установлены ранее
// (хотя при создании формы они обычно пусты)
ЭлементОтбора = Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Рекв1");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = Истина;
КонецЕсли;
КонецПроцедуры
Этот метод гарантирует, что Юзер2 увидит только те документы, где Рекв1 установлен в Истина. Остальные документы будут просто отсутствовать в списке.
Иногда условие скрытия строк бывает достаточно сложным и зависит от множества параметров. В таких случаях мы можем программно изменить сам текст SQL-подобного запроса, который лежит в основе динамического списка. Проанализируем, как это сделать.
Разберем пример, где мы добавляем условие ГДЕ непосредственно в текст запроса. Это работает быстрее, чем наложение фильтров на уже полученную выборку, особенно на больших объемах данных в базе.
&НаСервере
Процедура НастроитьЗапросСписка()
ТекстЗапроса = Список.ТекстЗапроса;
// Проверяем пользователя
Если ПользователиИнформационнойБазы.ТекущийПользователь().Имя = "Юзер2" Тогда
// Добавляем условие в запрос.
// Важно убедиться, что в исходном запросе нет конфликтующих условий ГДЕ
ТекстЗапроса = ТекстЗапроса + "
|ГДЕ
| ДокументОбъект.Рекв1 = ИСТИНА";
КонецЕсли;
Список.ТекстЗапроса = ТекстЗапроса;
КонецПроцедуры
Использование параметров запроса (например, &ТекущийПользователь) делает этот метод еще более гибким и безопасным с точки зрения производительности СУБД.
Выясним причину, по которой Условное оформление (УО) не подходит для задачи полного скрытия строк. Механизм УО предназначен для визуального выделения данных: изменения цвета фона, текста, шрифта или отображения текста как зачеркнутого.
Важный технический нюанс: в платформе 1С 8.3 в динамическом списке с помощью УО нельзя установить высоту строки в 0 или сделать её полностью невидимой (свойство Видимость отсутствует в настройках оформления строк). Если вы примените УО, строка останется в списке, она просто будет выглядеть иначе, что не решит задачу автора темы.
Если задача состоит не просто в том, чтобы «не мозолить глаза» пользователю, а в реальном ограничении прав доступа к коммерческой информации, то предыдущие методы (отборы в форме) будут недостаточны.
Проанализируем ситуацию: если пользователь скроет строки в форме списка через программный отбор, он все равно сможет увидеть эти документы в:
Для обеспечения реальной безопасности необходимо использовать механизм RLS (Row Level Security). Рассмотрим, как он работает в современных конфигурациях на базе БСП (Библиотека Стандартных Подсистем):
Рекв1.В этом случае платформа сама на уровне ядра будет добавлять условия во все запросы этого пользователя, и данные станут невидимы во всей системе, а не только в одной форме.
Подводя итог, выделим основные правила выбора решения:
КомпоновщикНастроек в событии ПриСозданииНаСервере. Это самый простой и быстрый в реализации способ.При реализации проверки пользователя всегда старайтесь использовать механизмы БСП, такие как Пользователи.ТекущийПользователь() или РолиДоступны(), чтобы код оставался надежным и легко поддерживаемым.