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