Работа с полем выбора

Элемент управления "Поле выбора" предназначен для хранения и быстрого выбора одного из значений, входящих в его список выбора. Список выбора для поля выбора есть список значений. Значением поля выбора является одно единственное значение, а не весь список выбора.

Установка значения в поле выбора

В Поле выбора можно установить любое значение. В процессе установки значения будет выполнен его поиск среди значений, входящих в список выбора. Если устанавливаемое значение найдено в списке выбора, оно будет сохранено в поле выбора, иначе в поле выбора будет установлено значение "Неопределено". Исключение составляет значение "Неопределено", которое можно установить в поле выбора в любом случае, независимо от того, какие значения при этом хранятся в списке выбора.

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

Представление значения, хранящегося в поле выбора

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

Поиск значения в поле выбора по введенному тексту

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

Связь поля выбора с данными

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

Особенности инициализации и использования списка выбора

Для правильного отображения в поле выбора данных, с которыми он связан, список выбора должен формироваться в теле модуля формы. Формировать список выбора для поля выбора в обработчике любого из событий формы – поздно. Это приведет к тому, что в поле выбора будет установлено значение «Неопределено», хотя в реквизите при этом может быть любое значение.

Такая ситуация возникает из-за того, что данные устанавливаются в элементы управления формы, связанные с ними, в процессе создания формы. А обработчики событий ПередОткрытием(), ПриОткрытии() вызываются после создания самой формы, в процессе инициализации ее визуальной части. Получается, что при создании формы полю выбора поставили некоторое значение в момент, когда его список выбора пустой. При этом, поскольку список выбора пустой, вместо устанавливаемого значения в поле выбора будет сохранено значение «Неопределено».

При смене типа значения (свойство "ТипЗначения") для списка выбора, у которого есть элементы, будет выполнено преобразование их значений к новому типу. Может быть следующая ситуация: после смены типа значения для списка выбора некоторое значение, которое раньше удавалось успешно установить в поле выбора, после смены типа значения установить не получается. Причина такой ситуации в том, что в процессе установки типа значения для списка выбора, успешно устанавливаемое ранее значение было конвертировано в другое значение (в соответствии с новым типом значения). Соответственно, устанавливаемое значение в списке выбора больше найдено не будет.

Использование поля выбора: пример 1

Пусть есть форма, в которой размещены поле выбора (ПолеВыбора1), поле ввода (ПолеВвода1) и создан реквизит (Реквизит1: число, длина = 10, точность = 0). В качестве данных для редактирования в ПолеВвода1 и ПолеВыбора1 стоит реквизит Реквизит1. В теле модуля формы написан следующий код:

Копировать в буфер обмена
ЭлементыФормы.ПолеВыбора1.СписокВыбора.Добавить(1, "Один");
ЭлементыФормы.ПолеВыбора1.СписокВыбора.Добавить(2, "Два");
ЭлементыФормы.ПолеВыбора1.СписокВыбора.Добавить(3, "Три");

Открыв такую форму в Предприятии, можно видеть, как будут устанавливаться значения в поле выбора:

1. В начальном состоянии поле выбора - пустое, поле ввода содержит значение 0.

2. Выбираем в поле выбора в выпадающем списке строку с надписью "Один": в поле ввода помещается значение 1. Поскольку поле ввода и поле выбора связаны с одним и тем же реквизитом формы, при изменении значения в поле ввода оно устанавливается в поле выбора и наоборот. В данном случае в поле выбора выбрали строку "Один", значение для которой равно 1. Оно и отобразилось в поле ввода.

3. Выбираем в поле выбора в выпадающем списке строку с надписью "Два": в поле ввода помещается значение 2.

Перейдем в поле ввода и попробуем редактировать значения в нем:

1. Введем в поле ввода значение 3 и сойдем с поля ввода. В поле выбора запишется значение 3 и установится значение из соответствующей строки списка выбора поля выбора ("Три").

2. Вернемся в поле ввода и введем в нем значение 4. Перейдем с поля ввода к следующему элементу управления. В поле ввода будет сохранено введенное значение "4", а поле выбора станет пустым. В данном случае введенное в поле ввода значение 4 будет сохранено в связанных с полем ввода данных, после чего выставлено из них в поле выбора. Поскольку поле выбора в списке выбора значения 4 не имеет, оно установлено в поле выбора не будет.

Использование поля выбора: пример 2

Пусть есть форма, в которой размещены поле выбора (ПолеВыбора1), поле ввода (ПолеВвода1) и создан реквизит (Реквизит1: СправочникСсылка.Номенклатура). В качестве данных для редактирования в ПолеВвода1 и ПолеВыбора1 стоит реквизит Реквизит1. В теле модуля формы написан следующий код:

Копировать в буфер обмена
ЭлементыФормы.ПолеВыбора1.СписокВыбора.Добавить(Справочники.Номенклатура.Элемент1, "Один");
ЭлементыФормы.ПолеВыбора1.СписокВыбора.Добавить(Справочники.Номенклатура.Элемент2, "Два");

Открыв такую форму в 1С:Предприятии, можно видеть, как будут устанавливаться значения в поле выбора:

1. В начальном состоянии поле выбора и поле ввода - пустые:

2. Выбираем в поле выбора в выпадающем списке строку с надписью "Один": в поле ввода помещается значение. Поскольку поле ввода и поле выбора связаны с одним и тем же реквизитом формы, при изменении значения в поле ввода оно устанавливается в поле выбора и наоборот. В данном случае в поле выбора выбрали строку "Один", значение для которой равно ссылке на на элемент справочника Справочники.Номенклатура.Элемент1. Оно и отобразилось в поле ввода.

3. Выбираем в поле выбора в выпадающем списке строку с надписью "Два": в поле ввода помещается ссылка на элемент справочника Справочники.Номенклатура.Элемент2:

Перейдем в поле ввода и попробуем редактировать значения в нем:

1. Выберем в поле ввода значение Справочники.Номенклатура.Элемент1. В поле выбора запишется значение  Справочники.Номенклатура.Элемент1 и установится значение из соответствующей строки списка выбора поля выбора ("Один").

2. Выберем в поле ввода значение Справочники.Номенклатура.Элемент2. В поле выбора запишется значение  Справочники.Номенклатура.Элемент2 и установится значение из соответствующей строки списка выбора поля выбора ("Два").

3. Выберем в поле ввода значение Справочники.Номенклатура.Элемент3. В поле выбора значение Справочники.Номенклатура.Элемент3 записано не будет, поскольку оно не было добавлено в список выбора. Значением в поле ввода будет "Неопределено":

Использование поля выбора: пример 3

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

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

Копировать в буфер обмена
// Вставить содержимое обработчика.
Реквизит1 = ЭлементыФормы.ПолеВвода1.Значение;
ф = ПолучитьФорму("Форма");
ф.Открыть();

В правой колонке - внешний вид второй формы внешней обработки. В ней размещены поле выбора и поле ввода; они оба связаны с реквизитом внешней обработки Реквизит1 по данным. Приведем текст модуля формы:

Копировать в буфер обмена
Процедура КнопкаВыполнитьНажатие(Элемент)
// Вставить содержимое обработчика.
КонецПроцедуры

ЭлементыФормы.ПолеВыбора1.СписокВыбора.Добавить(Справочники.Номенклатура.Элемент1, "Один");
ЭлементыФормы.ПолеВыбора1.СписокВыбора.Добавить(Справочники.Номенклатура.Элемент2, "Два");

Мы видим, что в модуле формы инициализируется список выбора для поля выбора: поле выбора может принимать значения Справочники.Номенклатура.Элемент1, Справочники.Номенклатура.Элемент2, Неопределено. При этом для двух первых значений явно указаны их представления - "Один" и "Два".

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

Значение реквизита - пустая ссылка:

           

В данном случае в поле ввода значением будет пустая ссылка на элемент справочника, а в поле выбора - Неопределено. Поскольку в списке выбора для поля выбора пустая ссылка на элемент справочника в значения не входит, ее установить нельзя - при установке значения в виде пустой ссылки поле выбора примет значение Неопределено.

Значение реквизита - одно из значений, имеющихся в списке выбора для поля выбора:

           

В данном случае и в поле ввода, и в поле выбора значением будет ссылка на Элемент1 справочника. При этом для представления значения поле выбора воспользуется представлением установленного значения из списка выбора - строкой "Один".

Значение реквизита в списке выбора для поля выбора отсутствует:

           

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

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