В поле ввода изменить представление выводимых значений
Как сейчас:
Есть справочник "Пользователи ресурсов". Для каждого пользователя ресурсов соответствует свой ресурс (владелец этого справочника Справочник "Ресурсы") в местах, где есть реквизит с данным типом при ручном вводе фамилии отображаются все пользователи ресурсов по найденному совпадению. Однако, так как может быть несколько пользователей ресурсов с одинаковыми ФИО, необходимо в представление выводимых значений добавить в скобках название ресурса, к которому относится пользователь.
Может, есть примеры подобного функционала? Как это реализовать?
Есть справочник "Пользователи ресурсов". Для каждого пользователя ресурсов соответствует свой ресурс (владелец этого справочника Справочник "Ресурсы") в местах, где есть реквизит с данным типом при ручном вводе фамилии отображаются все пользователи ресурсов по найденному совпадению. Однако, так как может быть несколько пользователей ресурсов с одинаковыми ФИО, необходимо в представление выводимых значений добавить в скобках название ресурса, к которому относится пользователь.
Может, есть примеры подобного функционала? Как это реализовать?
Прикрепленные файлы:

По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Примерно также, как реализовано у вас представление с выводом кода, судя по всему. В модуле менеджера справочника "Пользователи ресурсов": Но имейте в виду, такое решение может сильно замедлить работу в динамических списках и прочих формах, где выводится ссылка на пользователя ресурсов.
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Представление = Данные.Наименование + " (" + СокрП(Данные.Код) + ") " + Данные.Владелец;
КонецПроцедуры
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Поля.Добавить("Наименование");
Поля.Добавить("Код");
Поля.Добавить("Владелец");
КонецПроцедуры
Показать
(2) Спасибо, но это не совсем то. Такая реализация делает представление для уже выбранного значения. А необходимо, чтобы представление менялось именно в списке выводимых совпадений.
Я использовала другую процедуру, и, вроде бы, все хорошо, отображение работает правильно, но теперь проблема в вызове метода "ПолучитьДанныеВыбора". Из-за рекурсивности вылетает ошибка. Как ограничить этот рекурсивный вызов?
Я использовала другую процедуру, и, вроде бы, все хорошо, отображение работает правильно, но теперь проблема в вызове метода "ПолучитьДанныеВыбора". Из-за рекурсивности вылетает ошибка. Как ограничить этот рекурсивный вызов?
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
//ДанныеВыбора = ПолучитьДанныеВыбора(Параметры);
ДанныеВыбора = ПолучитьДанныеВыбора_(Параметры);
Если Не ДанныеВыбора = Неопределено Тогда
МассивЗначений = Новый Массив;
Для Каждого Стр Из ДанныеВыбора Цикл
МассивЗначений.Добавить(Стр.Значение);
КонецЦикла;
МассивСтруктур = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивЗначений,"Ссылка, Наименование, Код, Владелец");
Для Каждого Стр Из МассивСтруктур Цикл
ЭлСпискаЗначений = ДанныеВыбора.НайтиПоЗначению(Стр.Ключ);
ЗначениеСтруктуры = Стр.Значение;
ЭлСпискаЗначений.Представление = СтрШаблон("%1 (%2) (%3)", ЗначениеСтруктуры.Наименование, ЗначениеСтруктуры.Код, ЗначениеСтруктуры.Владелец);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Показать
(3)
По поводу рекурсивности, вам надо понимать вызван обработчик ОбработкаПолученияДанныхВыбора при интерактивном поиске в поле ввода или программным вызовом ПолучитьДанныеВыбора.Для это перед вызовом ПолучитьДанныеВыбора добавьте какой-нибудь флаг в Параметры, указывающий, что это программный вызов и нужно выполнить стандартную обработку. В ОбработкаПолученияДанныхВыбора проверяйте наличие этого флага – если он есть, то ничего не делаем, иначе СтандартнаяОбработка = Ложь и т.д.
Такая реализация делает представление для уже выбранного значения.
Странно, у меня такая реализация выводит представление именно в списке выбора.
По поводу рекурсивности, вам надо понимать вызван обработчик ОбработкаПолученияДанныхВыбора при интерактивном поиске в поле ввода или программным вызовом ПолучитьДанныеВыбора.Для это перед вызовом ПолучитьДанныеВыбора добавьте какой-нибудь флаг в Параметры, указывающий, что это программный вызов и нужно выполнить стандартную обработку. В ОбработкаПолученияДанныхВыбора проверяйте наличие этого флага – если он есть, то ничего не делаем, иначе СтандартнаяОбработка = Ложь и т.д.
Прикрепленные файлы:

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