В поле ввода изменить представление выводимых значений

1. Johney20 25.02.22 10:30 Сейчас в теме
Как сейчас:

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

Может, есть примеры подобного функционала? Как это реализовать?
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SlavaKron 25.02.22 10:55 Сейчас в теме
(1) Примерно также, как реализовано у вас представление с выводом кода, судя по всему. В модуле менеджера справочника "Пользователи ресурсов":
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	Представление = Данные.Наименование + " (" + СокрП(Данные.Код) + ") " + Данные.Владелец;

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

Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
		
	СтандартнаяОбработка = Ложь;
	Поля.Добавить("Наименование");
	Поля.Добавить("Код");
	Поля.Добавить("Владелец");

КонецПроцедуры
Показать
Но имейте в виду, такое решение может сильно замедлить работу в динамических списках и прочих формах, где выводится ссылка на пользователя ресурсов.
user823999; +1 Ответить
3. Johney20 01.03.22 11:47 Сейчас в теме
(2) Спасибо, но это не совсем то. Такая реализация делает представление для уже выбранного значения. А необходимо, чтобы представление менялось именно в списке выводимых совпадений.

Я использовала другую процедуру, и, вроде бы, все хорошо, отображение работает правильно, но теперь проблема в вызове метода "ПолучитьДанныеВыбора". Из-за рекурсивности вылетает ошибка. Как ограничить этот рекурсивный вызов?

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

По поводу рекурсивности, вам надо понимать вызван обработчик ОбработкаПолученияДанныхВыбора при интерактивном поиске в поле ввода или программным вызовом ПолучитьДанныеВыбора.Для это перед вызовом ПолучитьДанныеВыбора добавьте какой-нибудь флаг в Параметры, указывающий, что это программный вызов и нужно выполнить стандартную обработку. В ОбработкаПолученияДанныхВыбора проверяйте наличие этого флага – если он есть, то ничего не делаем, иначе СтандартнаяОбработка = Ложь и т.д.
Прикрепленные файлы:
5. Johney20 01.03.22 13:29 Сейчас в теме
(4) Поняла, что Вы имеете ввиду, спасибо. Но пытаюсь добавить свой элемент отбора, но ошибка: "обращение к процедуре объекта как к функции (вставить)" Почему не удается добавить свой элемент отбора??

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
	
	
	Если Не Параметры.Отбор.Свойство("ПрограммныйВызов") Тогда
		
		ДанныеВыбора = ПолучитьДанныеВыбора(Параметры.Отбор.Вставить("ПрограммныйВызов"));
		
	Иначе
		
		СтандартнаяОбработка = Ложь;
		
	КонецЕсли;
		
	Если Не ДанныеВыбора = Неопределено Тогда
		
		МассивЗначений = Новый Массив;
		
		Для Каждого Стр Из ДанныеВыбора Цикл 
			
			МассивЗначений.Добавить(Стр.Значение);
			
		КонецЦикла;
		
		МассивСтруктур = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивЗначений,"Ссылка, Наименование, Код, Владелец");
		
		Для Каждого Стр Из МассивСтруктур Цикл     
			
			ЭлСпискаЗначений = ДанныеВыбора.НайтиПоЗначению(Стр.Ключ);	
			
			ЗначениеСтруктуры = Стр.Значение;
			
			ЭлСпискаЗначений.Представление = СтрШаблон("%1 (%2) (%3)", ЗначениеСтруктуры.Наименование, ЗначениеСтруктуры.Код, ЗначениеСтруктуры.Владелец);
			
		КонецЦикла;
			
	КонецЕсли;   
	
КонецПроцедуры
Показать
6. SlavaKron 01.03.22 13:33 Сейчас в теме
(5) Попробуйте вставлять флаг не в Отбор, а прямо в Параметры.
7. Johney20 01.03.22 13:37 Сейчас в теме
(6) Изначально в параметры и добавляла, но результат тот же - ошибка.
8. Sam13 364 25.03.24 12:35 Сейчас в теме
У меня прекрасно работает так:
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
	
	Если Параметры.Свойство("ПрограммныйВызов") Тогда   
		СтандартнаяОбработка = Истина;
	Иначе
		СтандартнаяОбработка = ЛОЖЬ;
		Параметры.Вставить("ПрограммныйВызов", Истина);
        ДанныеВыбора = ПолучитьДанныеВыбора(Параметры);
	     Если Не ДанныеВыбора = Неопределено Тогда
	        МассивЗначений = Новый Массив;

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


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

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот