ПолучитьДанныеВыбора

1. AlexeyShiganov 28.06.24 09:58 Сейчас в теме
Здравствуйте. Столкнулся с проблемой: в выпадающем списке поля ввода выпадают ненужные данные.

Сразу оговорюсь: это не попытка подсунуть свои значения в выпадающий список, это попытка заставить работать стандартную обработку.

Во всех (в т.ч. составных) полях ввода, к примеру с данными типа СправочникСсылка.Пользователи , при наборе текста выпадает список с пользователями с Недействителен=Истина. Залез в Модуль менеджера Справочника Пользователи, там чётко указано:
Если НЕ Параметры.Отбор.Свойство("Недействителен") Тогда
	Параметры.Отбор.Вставить("Недействителен", Ложь);
КонецЕсли;

Конфигуратором вывел значение Параметры, в Отбор действительно попадает Недействителен. Попробовал добавить в отбор ещё и ПометкаУдаления=Ложь, результат тот же: отбор полностью игнорируется в выпадающем списке. Попробовал добавить в ПараметрыВыбора у поля ввода нужный отсев - в отборе он появился, но результат тот же. Вызвал ПолучитьДанныеВыбора(), дабы убедиться, что это не какой-нибудь другой код, нет - именно ПолучитьДанныеВыбора с данными Параметры выдают такой список.

Самое интересное в этой ситуации то, что в выпадающем списке поля ввода отбор игнорируется, а в списке выбора (F4) у того же самого поля отбор работает.

Вопрос: как заставить выпадающий список или ПолучитьДанныеВыбора() понимать отбор?
Может где-то есть переопределение этой функции или что-то подобное?
Всем спасибо заранее.

Модуль 1С:CRM 3 (3.1.28.14) + 1С:Комплексная автоматизация 2 (2.5.16.107)
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. AlexeyShiganov 01.07.24 08:01 Сейчас в теме
Пока решил так:
&После("ОбработкаПолученияДанныхВыбора")
Процедура XD_ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
	Если НЕ Параметры.Свойство("Рекурсия") Тогда
		Параметры.Вставить("Рекурсия");
		Если Параметры.Свойство("Отбор") Тогда
			СтандартнаяОбработка = Ложь;
			СтандартныйСписок = ПолучитьДанныеВыбора(Параметры);
			Индекс = СтандартныйСписок.Количество() - 1;
			Пока Индекс >= 0 Цикл
				Эл = СтандартныйСписок.Получить(Индекс);
				Для Каждого ЭлОтбора Из Параметры.Отбор Цикл	
					Если НЕ Эл.Значение[ЭлОтбора.Ключ] = ЭлОтбора.Значение Тогда
						СтандартныйСписок.Удалить(Эл);
						Прервать;
					КонецЕсли;
				КонецЦикла;	
				Индекс = Индекс - 1;
			КонецЦикла;
			ДанныеВыбора = СтандартныйСписок;
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры
Показать

Но это для конкретного справочника (модуль менеджера), а не для всех сразу.
К сожалению, в выпадающих списках выпадают и данные Истории выбора (помимо данных из ПолучитьДанныеВыбора) - с этим придется бороться отдельно (к примеру, очистить пользователям).
3. AlexeyShiganov 01.07.24 09:14 Сейчас в теме
(2) В поисках решения нашёл, что можно добавить Подписку на событие "ОбработкаПолученияДанныхВыбора", а в Источник проставить галочки на нескольких справочниках (составной тип, СправочникМенеджер).
4. SlavaKron 01.07.24 13:23 Сейчас в теме
(2) Вы что-то перепутали, полагая, что платформа игнорирует свойство Отбор. В конфигурации нет других расширений, которые могли бы переопределить ОбработкаПолученияДанныхВыбора?
В любом случае, ваше решение выглядит дико, особенно в строке
Если НЕ Эл.Значение[ЭлОтбора.Ключ] = ЭлОтбора.Значение Тогда
Вы же понимаете, что каждый элемент из списка будет полностью считан из БД и сериализован в прикладной объект? Не слишком ли жирно для такого действия? Я уже не говорю, что значением отбора может выступать массив и ваш код не сработает.
5. AlexeyShiganov 01.07.24 13:38 Сейчас в теме
(4) Дело именно в ПолучитьДанныеВыбора(), он уже с такими параметрами/отбором возвращает совершенно не отобранный список. ОбработкаПолученияДанныхВыбора всего лишь передаёт это дальше.
К сожалению, я пишу то, что вижу: если использовать код без доработки, то возвращаются, к примеру, пользователи с любым значением Недействителен, хотя в отборе Недействителен=Ложь. Добавляются ли в ПолучитьДанныеВыбора() данные из истории выбора - я не знаю, поэтому и спрашиваю опытных программистов.

По поводу жирности - подскажите, как это написать проще? Кажется, читал где-то, что выборка в этот список всё равно невелика.

По поводу массива в Отбор - благодарю, что подсказали, посмотрел справку, действительно там всё, что угодно.
6. SlavaKron 01.07.24 14:30 Сейчас в теме
(5) Надо искать не пути обхода, а разобраться, почему не работает платформенный механизм.
История выбора не добавляется в ПолучитьДанныеВыбора(). Ограничение истории выбора решается через ПараметрыВыбора поля ввода.
Покажите в отладке, где в параметрах есть отбор ("Недействителен", Ложь), а в ПолучитьДанныеВыбора есть недействительный пользователь.
ОбработкаПолученияДанныхВыбора всего лишь передаёт это дальше.
При желании ПолучитьДанныеВыбора() может быть переопределен в расширении через ОбработкаПолученияДанныхВыбора, поэтому и спросил про другие расширения.
7. AlexeyShiganov 01.07.24 14:44 Сейчас в теме
(6) Первый скрин - до ручного отбора 3 штуки пользователей, второй скрин - после ручного отбора, то есть фактически - применения того, что и так должно было быть применено.
Прикрепленные файлы:
8. SlavaKron 01.07.24 15:00 Сейчас в теме
(7) У вас толстый клиент?
9. AlexeyShiganov 01.07.24 15:01 Сейчас в теме
10. SlavaKron 01.07.24 15:05 Сейчас в теме
(9) К сожалению, нет идей. Я бы в отладке со строки
СтандартныйСписок = ПолучитьДанныеВыбора(ТипЗнч(Источник), Параметры)
шагал по F11, чтобы увидеть, где может переопределяться платформенный метод.
AlexeyShiganov; +1 Ответить
11. AlexeyShiganov 01.07.24 15:19 Сейчас в теме
(10) Большое спасибо, что подсказали. С помощью F11 понял, что Модуль CRM полон вызываемых в данном случае функций, в которых ещё предстоит разобраться, но судя по первому взгляду, отбор на пользователей вполне может тут совсем другим параметром регулироваться ("CRM_...").
Оставьте свое сообщение

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