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