Итак, рассмотрим возможности, которые существуют в обработчике события Обработка получения данных выбора.
Синтаксис описания этого обработчика выглядит следующим образом (листинг 3.150).
Листинг 3.150. Объявление обработчика события «Обработка получения данных выбора»
ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
ДанныеВыбора – это переменная, в которую разработчик должен поместить собственный список выбора. При входе в обработчик этот параметр не содержит никаких значений, то есть через него нельзя получить доступ к списку выбора, который сформирует платформа. Просто потому, что этот список формируется уже после выхода из этого обработчика. Однако может возникнуть желание в этом обработчике получить список, формируемый платформой, и добавить в него (удалить) несколько элементов. Как это сделать – рассказано в разделе .
Переменная Параметры содержит набор параметров, которые платформа будет использовать для формирования списка выбора. Особенность заключается в том, что при формировании списка выбора платформа будет учитывать свойства Параметры выбора и Связи параметров выбора, заданные для соответствующего реквизита объекта конфигурации. Поэтому в параметрах могут содержаться какие-то отборы.
СтандартнаяОбработка – это булева переменная, на основе которой платформа определяет, что делать после выхода из этого обработчика.
Если СтандартнаяОбработка равна Истина, то платформа самостоятельно сформирует список выбора исходя из того, что указано в Параметрах.
Если СтандартнаяОбработка равна Ложь, платформа не будет формировать список выбора самостоятельно, а покажет то, что находится в параметре ДанныеВыбора.
Таким образом, у нас есть следующие возможности:
Сначала рассмотрим, каким образом можно модифицировать параметры.
Примечание
Пример можно посмотреть в демонстрационной базе «Поле ввода», документ Накладная, реквизит Товар табличной части.
Допустим, есть документ Накладная, в табличной части которого необходимо подбирать товары. Причем для выбора должны предлагаться не все возможные товары, а только те, которые поставляет поставщик, указанный в этом документе, и те, которые не помечены на удаление.
Для этого у реквизита табличной части Товар заданы свойства Связи параметров выбора и Параметры выбора (рис. 3.191).

Рис. 3.191. Свойства «Связи параметров выбора» и «Параметры выбора»
В связях параметров выбора указывается, что для выбора будут предлагаться только товары поставщика, указанного в документе. В параметрах выбора указывается, что кроме этого для выбора будут предлагаться только товары, не помеченные на удаление.
В результате при наборе наименования товара в форме будет предложен следующий список товаров (рис. 3.192).

Рис. 3.192. Товары от поставщика «Поставщик 1», не помеченные на удаление
Если мы посмотрим на все имеющиеся товары, то заметим, что подбор товаров произведен правильно (рис. 3.193).

Рис. 3.193. Полный список товаров
Допустим, нас не устраивает, что для выбора предлагаются те элементы справочника, которые являются услугами.
Мы можем легко исправить это сразу двумя способами. Можно просто, ничего не программируя, добавить этот отбор в свойство Параметры выбора реквизита табличной части Товар.
Но, если нужно, можно сделать это программно в обработчике события Обработка получения данных выбора в модуле менеджера справочника Товары.
Благодаря свойствам Параметры выбора и Связи параметров выбора в этом обработчике структура параметров содержит следующие отборы (рис. 3.194).

Рис. 3.194. Структура отборов
Добавим к ним еще одно условие – что товар не должен быть услугой, а стандартную обработку оставим в значении Истина, чтобы платформа сформировала список выбора самостоятельно (листинг 3.151).
Листинг 3.151. Добавление условия отбора
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
Параметры.Отбор.Вставить("ВидТовара", Перечисления.ВидыТоваров.Товар);
КонецПроцедуры
Если теперь выполнить те же самые операции, мы увидим, что для выбора предлагаются только элементы, являющиеся товарами (рис. 3.195).

Рис. 3.195. Товары, предлагаемые для выбора
Рассмотрим вторую ситуацию, когда мы полностью самостоятельно формируем список выбора, не используя стандартные возможности платформы.
Здесь есть два случая. Список выбора может быть «простым» и «сложным».
Сначала посмотрим, как можно сформировать простой список.
Примечание
Пример можно посмотреть в демонстрационной базе «Поле ввода», документ Накладная, реквизит Склад.
Допустим, в документе Накладная есть реквизит Склад. Тогда в модуле менеджера справочника Склады мы можем написать следующий обработчик (листинг 3.152).
Листинг 3.152. Обработчик события «Обработка получения данных выбора»
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Склады.Ссылка
|ИЗ
| Справочник.Склады КАК Склады
|ГДЕ
| Склады.Розничный = ЛОЖЬ
| И Склады.Наименование ПОДОБНО &СтрокаПоиска";
Запрос.УстановитьПараметр("СтрокаПоиска", "%" + Параметры.СтрокаПоиска + "%");
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Список = Новый СписокЗначений;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Список.Добавить(ВыборкаДетальныеЗаписи.Ссылка);
КонецЦикла;
ДанныеВыбора = Список;
КонецПроцедуры
В нем мы прежде всего отказываемся от стандартной обработки.
Затем формируем запрос, который выберет нам все склады, не являющиеся розничными и наименование которых содержит строку, введенную пользователем в поле ввода.
Строку, введенную пользователем, мы получаем из структуры параметров, в ней она содержится отдельным элементом с ключом СтрокаПоиска (листинг 3.153).
Листинг 3.153. Получение строки, введенной пользователем
Запрос.УстановитьПараметр("СтрокаПоиска", "%" + Параметры.СтрокаПоиска + "%");
Затем создаем пустой список значений и, обходя результат запроса, заполняем список ссылками. В конце помещаем этот список в переменную ДанныеВыбора.
В результате при вводе наименования склада мы будем иметь следующую ситуацию (рис. 3.196).

Рис. 3.196. Склады, предлагаемые для выбора
Если посмотреть на список складов, мы увидим, что выбор произведен правильно, а фрагмент наименования склада может быть произвольным, не обязательно находящимся в начале наименования (рис. 3.197).

Рис. 3.197. Полный список складов
Теперь рассмотрим, как формировать сложный список выбора.
Примечание
Пример можно посмотреть в демонстрационной базе «Поле ввода», документ Накладная, реквизит Поставщик. В модуле менеджера справочника Поставщики снять комментарии с варианта «Пример 1».
Допустим, в документе Накладная есть реквизит Поставщик. Тогда в модуле менеджера справочника Поставщики мы можем написать следующий обработчик (листинг 3.154).
Листинг 3.154. Обработчик события «Обработка получения данных выбора»
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Поставщики.Ссылка,
| Поставщики.ПометкаУдаления,
| Поставщики.Ненадежный
|ИЗ
| Справочник.Поставщики КАК Поставщики
|ГДЕ
| Поставщики.Наименование ПОДОБНО &СтрокаПоиска";
Запрос.УстановитьПараметр("СтрокаПоиска", "%" + Параметры.СтрокаПоиска + "%");
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Список = Новый СписокЗначений;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Структура = Новый Структура;
Структура.Вставить("Значение", ВыборкаДетальныеЗаписи.Ссылка);
Структура.Вставить("ПометкаУдаления", ВыборкаДетальныеЗаписи.ПометкаУдаления);
Если ВыборкаДетальныеЗаписи.Ненадежный Тогда
Структура.Вставить("Предупреждение", "Это ненадежный поставщик, его лучше не выбирать!");
КонецЕсли;
Список.Добавить(Структура);
КонецЦикла;
ДанныеВыбора = Список;
КонецПроцедуры
Здесь, как и раньше, отказываемся от стандартной обработки и запросом получаем нужные ссылки.
Затем создаем пустой список значений, а при каждом обходе результата запроса создаем структуру, в которую помещаем:
После заполнения структуры добавляем ее в список значений, а после обхода всего результата запроса список помещаем в переменную ДанныеВыбора.
В результате при вводе наименования поставщика список выбора будет выглядеть следующим образом (рис. 3.198).

Рис. 3.198. Поставщики, предлагаемые для выбора
На примере имеющихся поставщиков мы сможем посмотреть все возможные варианты работы «сложного» списка выбора (рис. 3.199).

Рис. 3.199. Полный список поставщиков
Если выбрать Поставщик 1, мы не получим никаких предупреждений.
Если выбрать поставщика, помеченного на удаление (Поставщик11), мы получим стандартное предупреждение платформы (рис. 3.200).

Рис. 3.200. Предупреждение о том, что выбранный элемент помечен на удаление
Если выбрать ненадежного поставщика, да еще и помеченного на удаление (Поставщик367), мы получим «свое» предупреждение (рис. 3.201).

Рис. 3.201. Предупреждение о том, что выбран ненадежный поставщик
Таким образом, попутно мы убедились в следующем: если для выбираемого элемента указаны и пометка удаления, и предупреждение, будет выведено предупреждение.
Несколько слов о производительности. Событие Обработка получения данных выбора, обрабатываемое в модуле менеджера объекта, вызывается довольно часто. Перечислим эти случаи еще раз:
Поэтому при написании обработчика Обработка получения данных выбора нужно особенно тщательно подходить к вопросу эффективности создаваемого кода.