Как отобразить наименование и штрихкод в списке выбора поля формы в 1С?

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

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

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

Представим ситуацию: в документе есть табличная часть с полем Номенклатура. Нам нужно, чтобы при наборе текста в этом поле в выпадающем списке отображалось «Наименование (Штрихкод)», но при этом само представление ссылки в системе оставалось прежним (только наименование).

Типичная ошибка начинающего разработчика заключается в попытке передать в список выбора простую строку, а затем вручную обрабатывать выбор на форме, пытаясь «подсунуть» ссылку вместо строки. Давайте разберем, почему конструкция Элемент = Ссылка в событии ОбработкаВыбора не работает. Переменная Элемент в данном контексте является объектом типа ПолеФормы, а не данными, которые в это поле записаны. Прямое присваивание ссылочного типа объекту интерфейса программно некорректно.

Лучшее решение: Использование модуля менеджера

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

Для начала нам необходимо переопределить стандартную обработку в процедуре ОбработкаПолученияДанныхВыбора. Мы установим флаг СтандартнаяОбработка = Ложь и сформируем свой собственный СписокЗначений.

Важный нюанс: Чтобы система правильно восприняла выбор, каждый элемент СпискаЗначений должен содержать в качестве Значения ссылку на объект, а в качестве Представления — ту самую строку, которую должен увидеть пользователь.

Рассмотрим пример кода в модуле менеджера справочника Номенклатура:


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

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

Альтернативный вариант: Обработка события на форме

Если по каким-то причинам вы решили формировать список строк и обрабатывать их на клиенте (что менее предпочтительно), важно правильно завершить выбор. Рассмотрим ситуацию, когда в ДанныеВыбора попали строки, а не ссылки.

Проанализируем процедуру ОбработкаВыбора на форме. Чтобы подставить нужное значение, мы должны модифицировать параметр ВыбранноеЗначение и позволить платформе завершить стандартный процесс, либо явно присвоить значение реквизиту объекта.


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

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

Тонкости оптимизации и производительности

Разберем несколько важных моментов, которые помогут сделать поиск быстрым и удобным:

  1. Индексация данных: При использовании оператора ПОДОБНО поиск может замедляться на больших справочниках. Убедитесь, что поля, по которым идет поиск, индексированы. Если поиск идет по штрихкоду, поле штрихкода в регистре сведений должно быть индексировано.
  2. Ограничение количества: Всегда используйте конструкцию ВЫБРАТЬ ПЕРВЫЕ в запросе. Выпадающий список не предназначен для просмотра сотен записей. Оптимальное число — от 20 до 50 элементов.
  3. Учет отборов: В параметрах процедуры ОбработкаПолученияДанныхВыбора передается структура Параметры.Отбор. Если на поле формы установлены фильтры (например, по владельцу или виду номенклатуры), их обязательно нужно добавить в условия запроса, иначе пользователь увидит в списке выбора товары, которые не соответствуют бизнес-логике формы.
  4. Полнотекстовый поиск: Для очень больших баз данных (свыше 1 млн наименований) вместо оператора ПОДОБНО стоит рассмотреть использование механизма полнотекстового поиска 1С, который работает значительно быстрее с морфологией и вхождениями слов.

Использование ФорматированнойСтроки для визуального выделения

Для улучшения читаемости в современных версиях платформы 8.3 можно пойти дальше и использовать объект ФорматированнаяСтрока в представлении списка выбора. Это позволит, например, выделить название жирным шрифтом, а штрихкод — серым цветом или курсивом.

Посмотрим, как изменить цикл заполнения списка:


Пока Выборка.Следующий() Цикл
    
    ТекстПредставления = Новый Массив;
    ТекстПредставления.Добавить(Выборка.Наименование);
    ТекстПредставления.Добавить(Новый ФорматированнаяСтрока(" [" + Выборка.Штрихкод + "]", 
                                Новый Шрифт(,,Истина), 
                                WebЦвета.Серый));
    
    Представление = Новый ФорматированнаяСтрока(ТекстПредставления);
    СписокВыбора.Добавить(Выборка.Ссылка, Представление);
    
КонецЦикла;

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

← На главную