Как настроить отбор по текущему пользователю в динамическом списке 1С

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

В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача ограничить видимость данных в списках так, чтобы пользователь видел только «свои» записи. Это может быть список документов, где пользователь является автором, или справочник задач. Несмотря на то что самым надежным методом является использование механизма RLS (ограничение доступа на уровне записей), иногда требуется реализовать это именно на уровне интерфейса — через настройки динамического списка.

В этой статье мы подробно разберем, почему стандартные попытки «сделать отбор мышкой» могут не работать, проанализируем типичные ошибки при сравнении типов данных и изучим программные способы реализации надежного фильтра.

Разбор основной ошибки: Ссылка против Строки

Рассмотрим ситуацию, с которой столкнулся автор темы. В динамическом списке есть поле Автор (тип СправочникСсылка.Авторы), а в параметрах сеанса хранится ТекущийПользователь (тип Строка). Попытка сравнить Автор.Наименование = &ТекущийПользователь часто приводит к тому, что список оказывается пустым. Выясним причину.

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

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

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

Проанализируем процедуру ПриСозданииНаСервере:


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

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

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

В данном примере мы обращаемся к свойству Список.Отбор. Важно помнить, что Список — это имя реквизита формы с типом ДинамическийСписок.

Способ 2. Использование параметров в тексте запроса

Если динамический список построен на основе произвольного запроса, мы можем внедрить условие фильтрации непосредственно в текст SQL-подобного запроса 1С. Это часто работает быстрее и нагляднее.

Рассмотрим порядок действий:

  1. Откроем свойства динамического списка и установим флаг Произвольный запрос.
  2. В тексте запроса добавим условие ГДЕ.
  3. Платформа 8.3 позволяет обращаться к параметрам сеанса напрямую.

Пример текста запроса:


ВЫБРАТЬ
    ДокументПродажа.Ссылка,
    ДокументПродажа.Дата,
    ДокументПродажа.Номер,
    ДокументПродажа.Автор
ИЗ
    Документ.Продажа КАК ДокументПродажа
ГДЕ
    ДокументПродажа.Автор = &ПараметрСеанса.ТекущийПользователь

Использование конструкции &ПараметрСеанса.Имя избавляет разработчика от необходимости инициализировать параметры запроса в коде формы — система сделает это автоматически при получении данных.

Способ 3. Использование фиксированных настроек

Выясним ситуацию: если вы установите отбор через обычные настройки (как в Способе 1), пользователь может зайти в «Настройки списка» и просто отключить этот фильтр. Если ваша задача — жестко ограничить видимость данных, рассмотрите использование Фиксированных настроек.

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


&НаСервере
Процедура УстановитьЖесткийОтбор()

    ГруппаОтбора = Список.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ГруппаОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Автор");
    ГруппаОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
    ГруппаОтбора.ПравоеЗначение = ПараметрыСеанса.ТекущийПользователь;
    ГруппаОтбора.Использование  = Истина;

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

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

Важные рекомендации по работе с типами данных

Посмотрим на ситуацию шире. Чтобы отбор работал корректно и быстро, придерживайтесь следующих правил:

Таким образом, мы проанализировали основные способы настройки отбора по текущему пользователю в 1С. Выбор конкретного метода зависит от архитектуры вашей конфигурации и требований к гибкости настроек для конечного пользователя.

← На главную