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