Как изменить представление элемента справочника в выпадающем списке выбора в 1С 8.3

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

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

Почему не подходит процедура ОбработкаПолученияПредставления

Первое решение, которое часто приходит на ум при необходимости изменить текст ссылки, — переопределить процедуру ОбработкаПолученияПредставления в модуле менеджера справочника. Однако данный подход имеет существенные ограничения:

  1. Глобальное действие: Метод ОбработкаПолученияПредставления меняет представление объекта во всей системе — во всех журналах, документах, отчетах и формах выбора.
  2. Отсутствие контекста вызова: Платформа не передает в эту процедуру информацию о том, из какой именно формы, колонки или элемента управления был вызван запрос представления.
  3. Кэширование представлений: Сформированные платформой представления ссылок кэшируются на стороне клиента. Попытки передать контекст вызова через параметры сеанса или глобальные переменные не сработают корректно, так как обработчик вызывается далеко не при каждом отображении ссылки.

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

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

Этот способ позволяет изменить подсказывающий выпадающий список при вводе по строке и быстром выборе без отключения стандартного платформенного механизма подбора.

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

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

Способ 2. Заполнение кастомного списка выбора на клиенте

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

Рассмотрим последовательность настройки:

  1. У элемента формы устанавливаем свойство РежимВыбораИзСписка = Истина.
  2. В событии ПриОткрытии формы или НачалоВыбораИзСписка заполняем коллекцию СписокВыбора элемента формы:
    
    &НаКлиенте
    Процедура ТабличнаяЧастьНоменклатураНачалоВыбораИзСписка(Элемент, СтандартнаяОбработка)
        
        СтандартнаяОбработка = Ложь;
        Список = Элемент.СписокВыбора;
        Список.Очистить();
        
        // Получаем данные с сервера и заполняем список
        ЗаполнитьСписокВыбораНаСервере(Список);
    
    КонецПроцедуры
    
  3. На сервере формируем список элементов, где в качестве значения передается ссылка, а в качестве представления — скорректированная строка с нужными реквизитами.

Как сохранить произвольное представление в ячейке после выбора

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

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

← На главную