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

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

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

Метод 1: Использование события «НачалоВыбора» в форме

Это один из самых гибких и популярных методов. Он позволяет динамически формировать список выбора прямо в момент обращения пользователя к полю ввода. Чтобы реализовать этот подход, выполним следующие шаги:

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

Рассмотрим пример кода, который необходимо разместить в модуле формы:


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

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

Метод 2: Использование модуля менеджера перечисления

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

Разберем использование процедуры ОбработкаПолученияДанныхВыбора:


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

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

Почему пропадают значения в старых документах?

Одной из частых проблем является исчезновение значений в уже проведенных документах. Это происходит из-за того, что если вы программно переопределяете список выбора, но забываете добавить в него текущее значение, записанное в реквизите, система «не видит» этого значения и может отобразить поле как пустое.

При программном заполнении списков всегда выполняйте проверку: если в поле уже есть выбранное значение, оно обязательно должно присутствовать в формируемом вами списке ДанныеВыбора. В противном случае интерфейс не сможет корректно отобразить текущее состояние объекта.

Рекомендации по выбору метода

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

← На главную