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