Как в 1С настроить выпадающий список выбора для отображения дополнительных реквизитов?

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Давайте подробно разберем, как реализовать обе эти задачи в управляемых формах 1С, основываясь на двух ключевых механизмах платформы.

Решение 1: Отображение дополнительных реквизитов в списке быстрого выбора

Основная задача — при наборе названия товара в поле ввода формировать список подсказок вида "Наименование (Артикул) Цена". Наиболее правильный и системный способ решения этой задачи — использование события ОбработкаПолученияДанныхВыбора.

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

Рассмотрим по шагам, как это работает.

  1. Отмена стандартного поведения. Первой строкой в процедуре мы должны сообщить платформе, что берем формирование списка на себя. Для этого устанавливаем параметр СтандартнаяОбработка в значение Ложь.
  2. Подготовка списка. Мы создаем новый объект СписокЗначений. Именно его мы наполним нужными данными и вернем платформе для отображения пользователю. Этот список присваивается параметру ДанныеВыбора.
  3. Получение данных. Чтобы получить не только ссылку на товар, но и его дополнительные реквизиты (артикул, цену), используем Запрос. Текст, который пользователь вводит в поле, доступен нам через структуру Параметры, а именно — Параметры.СтрокаПоиска. Мы используем этот текст для отбора данных в запросе, как правило, с помощью оператора ПОДОБНО.
  4. Формирование представления. Это ключевой этап. В цикле мы обходим результат запроса и для каждой найденной записи добавляем новый элемент в наш СписокЗначений. При добавлении мы указываем два параметра:
    • Значение — сюда помещается сама ссылка на элемент справочника (Результат.Ссылка). Именно это значение будет подставлено в поле ввода после выбора.
    • Представление — сюда мы помещаем отформатированную строку, которую увидит пользователь. Мы можем собрать ее из любых полей, полученных запросом, используя, например, функцию СтрШаблон.

Посмотрим на пример реализации в модуле менеджера справочника "Товары":


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

КонецПроцедуры

Таким образом, когда пользователь начнет вводить текст, платформа вызовет эту процедуру, получит от нее готовый, красиво оформленный список и покажет его. Этот подход является наиболее гибким и производительным. Если же требуется вывести дополнительные реквизиты в полноценной таблице выбора, можно изучить способы доработки динамических списков и добавления полей.

Решение 2: Установка начальных параметров при открытии формы выбора

Вторая задача — повлиять на поведение полноценной формы выбора, которая открывается по кнопке "..." или F4. Например, нам нужно заранее отфильтровать список или установить курсор на определенную позицию. Для этого используется обработчик события НачалоВыбора для поля ввода на клиентской форме.

Существует два основных сценария.

Сценарий А: Фильтрация списка (установка отбора)

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

Рассмотрим, как это реализовать. В обработчике НачалоВыбора мы формируем структуру отбора и передаем ее в параметры открываемой формы.


&НаКлиенте
Процедура ТоварНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    // Отменяем стандартное открытие формы, чтобы открыть ее со своими параметрами.
    СтандартнаяОбработка = Ложь;
    
    // Создаем структуру для хранения отборов.
    // Ключ структуры - это имя реквизита, по которому фильтруем (например, "ЭтоГруппа").
    // Значение - это значение для фильтра.
    ПараметрыОтбора = Новый Структура("Родитель", ЭтаФорма.НужнаяГруппаНоменклатуры);

    // Создаем структуру параметров формы.
    // В ней указываем, что хотим передать именно отбор.
    ПараметрыФормы = Новый Структура("Отбор", ПараметрыОтбора);
    
    // Открываем форму выбора, передавая ей наши параметры.
    ОткрытьФорму("Справочник.Товары.ФормаВыбора", ПараметрыФормы, Элемент);
    
КонецПроцедуры

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

Сценарий Б: Позиционирование в списке (установка начального значения)

Этот вариант нужен, когда мы не хотим фильтровать список, а хотим лишь помочь пользователю, установив курсор на наиболее вероятный для выбора элемент. Для этого мы передаем в форму выбора параметр ТекущаяСтрока.

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


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

КонецПроцедуры

В этом случае СтандартнаяОбработка остается Истина. Мы лишь "подсказываем" платформе, на какой строке нужно сфокусироваться при открытии, а сам процесс открытия она выполняет сама.

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

← На главную