Как скрыть определенные значения перечисления в реквизите управляемой формы 1С?

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

При разработке прикладных решений на платформе 1С:Предприятие 8 часто возникает задача ограничения списка доступных значений для реквизита, тип которого установлен как Перечисление. Например, в зависимости от прав текущего пользователя или бизнес-логики, нам необходимо скрыть некоторые элементы перечисления, чтобы исключить возможность их выбора в интерфейсе. Рассмотрим, как это можно реализовать профессионально и аккуратно.

Использование обработчика «ОбработкаПолученияДанныхВыбора»

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

Разберем по шагам, как настроить этот обработчик:

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

Рассмотрим пример реализации кода для ограничения видимости значений:


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

Этот метод хорош тем, что логика обработки данных выбора инкапсулирована непосредственно в объекте метаданных, что позволяет использовать её во всех формах системы, где используется данный тип данных.

Программное заполнение списка выбора на форме

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

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

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


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

Обратите внимание: при использовании этого метода важно убедиться, что у элемента формы установлен режим выбора из списка (свойство РежимВыбораИзСписка равно Истина), иначе программно добавленные элементы могут не отобразиться корректно.

Важные замечания по безопасности

Необходимо помнить, что ограничение списка выбора на форме — это инструмент обеспечения удобства интерфейса (UX). Это не является полноценным ограничением прав доступа на уровне базы данных. Опытный пользователь или сторонний механизм обмена данными смогут записать в реквизит любое значение перечисления, даже если оно скрыто на форме.

Если ваша задача — запретить запись определенных состояний, обязательно:

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

← На главную