Заполнить данные выбора автоподбора по странам.
Функция ЗаполнитьДанныеВыбораАвтоподбораПоСтранам(Знач Параметры) Экспорт
ДанныеВыбора = Новый СписокЗначений;
// Будем имитировать поведение платформы - поиск по всем доступным полям поиска с формированием подобного списка.
// Подразумеваем, что поля справочника и классификатора совпадают, за исключением отсутствующего в классификаторе поля "Ссылка".
Запрос = Новый Запрос;
ПрефиксПараметраОтбора = "ПараметрыОтбора";
ПоляОтбора = Новый Массив;
ПоляОтбора.Добавить("Код");
ПоляОтбора.Добавить("Наименование");
// Общий отбор по параметрам
Отборы = Новый Массив;
Для Каждого КлючЗначение Из Параметры.Отбор Цикл
ЗначениеПоля = КлючЗначение.Значение;
ИмяПоля = КлючЗначение.Ключ;
ИмяПараметра = ПрефиксПараметраОтбора + ИмяПоля;
Если ТипЗнч(ЗначениеПоля) = Тип("Массив") Или ТипЗнч(ЗначениеПоля) = Тип("ФиксированныйМассив") Тогда
Отборы.Добавить(" %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
///////////////////////////////////////////////////////////////////////////////////////////////////////
ОбработкаПолученияДанныхВыбора (БСП)
ДанныеКлассификатораСтранМираПоНаименованию (БСП)
СтранаМираОбработкаВыбора (БСП)
ДанныеКлассификатораСтранМираПоКоду (БСП)
СтранаМираПоДаннымКлассификатора (БСП)