В процессе разработки интерфейсов на платформе 1С:Предприятие 8.3 часто возникает задача управления составом полей, которые пользователь может самостоятельно вывести в список. Типовой механизм платформы «Изменить форму» позволяет пользователю «провалиться» внутрь поля типа Ссылка и вытащить на экран практически любой реквизит связанного объекта. Однако в целях безопасности, упрощения интерфейса или оптимизации производительности нам может потребоваться ограничить этот список. Проанализируем ситуацию и разберем несколько эффективных способов решения этой задачи.
Динамический список в своей основе использует механизмы Системы компоновки данных (СКД). Даже если вы не создаете внешнюю схему, у списка есть встроенные настройки, позволяющие гибко управлять доступностью полей. Рассмотрим, как это настроить в конфигураторе.
Рассмотрим по шагам процесс ограничения через настройки компоновки:
ДинамическийСписок.В этом дереве полей мы можем найти наше поле Ссылка и раскрыть его структуру. Для каждого дочернего реквизита предусмотрены флаги ограничений:
Этот метод является наиболее «чистым» и правильным с точки зрения архитектуры платформы, так как он не затрагивает права доступа и работает непосредственно на уровне интерфейсного решения конкретной формы.
Проанализируем работу конструктора запроса в динамическом списке. По умолчанию платформа часто подставляет конструкцию Справочник.ИмяСправочника.*, что открывает доступ ко всем полям. Мы можем переопределить это поведение, используя возможности языка запросов СКД.
Если мы хотим разрешить пользователю выбирать только определенные поля из ссылки, мы можем воспользоваться секцией описания полей в фигурных скобках {}. Посмотрим на пример кода в тексте запроса:
ВЫБРАТЬ
Док.Ссылка КАК Ссылка,
Док.Номер КАК Номер,
Док.Дата КАК Дата
ИЗ
Документ.РеализацияТоваровУслуг КАК Док
{ВЫБРАТЬ
Ссылка.*,
Номер,
Дата,
Док.Контрагент.Наименование КАК КонтрагентНаименование}
В данном случае, перечисляя поля внутри {ВЫБРАТЬ ...}, мы явно указываем системе, какие данные доступны для выбора. Если мы не укажем там Ссылка.*, а перечислим только конкретные вложенные поля (например, Ссылка.Номер, Ссылка.Дата), то при попытке развернуть «Ссылку» в окне изменения формы пользователь увидит только разрешенный нами перечень.
Выясним причину, по которой поля вообще попадают в список доступных. Платформа 1С проверяет право Просмотр для каждого реквизита объекта метаданных. Если у пользователя в его роли снята галочка «Просмотр» для конкретного реквизита (например, ФактическийАдрес), это поле исчезнет из всех интерфейсов:
Важный нюанс: этот метод является глобальным. Если вам нужно скрыть поле только в одной конкретной форме списка, а в других местах оставить его доступным, роли использовать не стоит. Однако для защиты конфиденциальных данных (например, суммы прибыли или личных телефонов) это самый надежный вариант.
Иногда состав доступных полей должен зависеть от контекста: текущего пользователя, параметров сеанса или состояния системы. В этом случае мы можем программно модифицировать настройки компоновщика при создании формы. Рассмотрим пример реализации в модуле формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Получаем поле из схемы компоновки данных списка
ПолеАдрес = Список.КомпоновщикНастроек.Настройки.ДоступныеПоляВыбора.Элементы.Найти("Ссылка.ФактическийАдрес");
Если ПолеАдрес <> Неопределено Тогда
// Запрещаем выбор поля пользователем
ПолеАдрес.Доступность = Ложь;
КонецЕсли;
КонецПроцедуры
Посмотрим подробнее на объект КомпоновщикНастроек. Через него мы имеем доступ к коллекции ДоступныеПоляВыбора. У каждого элемента этой коллекции есть свойство Доступность. Установка его в значение Ложь программно исключает поле из списка выбора в окне изменения формы.
Если ограничение полей связано с функциональностью программы (например, если в настройках системы отключен учет по складам, то и поле Склад не должно быть доступно), правильно будет использовать Функциональные опции. Привяжите реквизит объекта к функциональной опции, и платформа сама позаботится о том, чтобы это поле исчезло из диалога «Изменить форму», когда опция выключена.
Выясним преимущество этого подхода: вам не нужно писать код или настраивать СКД в каждой форме. Поле скрывается централизованно во всей системе. Это делает решение масштабируемым и легким в поддержке.
Мы рассмотрели пять различных способов ограничения состава полей реквизита Ссылка. Выбор конкретного метода зависит от ваших задач:
Комбинируя эти подходы, мы можем создать максимально удобный и безопасный интерфейс для конечного пользователя, не перегружая его лишними техническими полями и защищая важную коммерческую информацию.