ЗаполнитьДанныеВыбораАвтоподбораПоСтранам (БСП)

Автор: 1С
ОбщийМодуль.РаботаСАдресами
БСП

Заполнить данные выбора автоподбора по странам.

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Рекомендации

Похожие публикации

ОбработкаПолученияДанныхВыбора (БСП)

ДанныеСтраныМира (БСП)

ДанныеКлассификатораСтранМираПоНаименованию (БСП)

СтранаМираОбработкаВыбора (БСП)

ДанныеКлассификатораСтранМираПоКоду (БСП)

СтранаМираПоДаннымКлассификатора (БСП)

КоллекцияСтранМираПоДаннымКлассификатора (БСП)

АвтоподборАдреса (БСП)

ЗаполнитьСписокВыбораДляРассмотретьПосле (БСП)

1С Менеджер конфигураций