Задача: требуется в форме подбора настроить отбор по подстроке реквизитов в форме подбора справочника «Номенклатура».
Исходные данные: конфигурация – измененная ТиС ред. 9.2 на базе MS SQL Server 2000, используется 1cpp.dll.
Описание решения:
СписокОтбора.ДобавитьЗначение("Наименование"); СписокОтбора.ДобавитьЗначение("Артикул"); СписокОтбора.ДобавитьЗначение("Марка"); СписокОтбора.ДобавитьЗначение("Модель"); СписокОтбора.ДобавитьЗначение("Производитель");
//************************************************ Процедура ПереходНаСтрокуОтбора() НеЗакрывать = "СтрокаОтбора"; Форма.Закрыть(); КонецПроцедуры //************************************************ Процедура ПриЗакрытии() Если НеЗакрывать "" Тогда Активизировать(СтрокаОтбора); СтатусВозврата(0); КонецЕсли; КонецПроцедуры
//************************************************ Процедура МегаФильтр(Фл=1) Если (Фл = 0) или (СокрЛП(СтрокаОтбора) = "") Тогда ИспользоватьСписокЭлементов(); ИерархическийСписок(ИерархическийПоказ,1); ЕстьФильтр = 0; СЗ = ""; СтрокаОтбора = ""; НеЗакрывать = "МногострочнаяЧасть"; Форма.Закрыть(); Возврат; КонецЕсли; ИерархическийПоказ = ИерархическийСписок(); ИерархическийСписок(0,1); рс = СоздатьОбъект("ODBCRecordset"); Если ЕстьФильтр = 1 Тогда Если Лев(СтрокаОтбора,1) = "*" Тогда ТекстЗапроса = ТекстЗапросаМегафильтра(1); рс.УстановитьТекстовыйПараметр("ЗначФильтр","%"+СтрЗаменить(СтрЗаменить(ВРег(СокрЛП(СтрокаОтбора))," *","%"),"*","%")+"%"); рс.УложитьСписокОбъектов(СЗ,"#СписокНоменклатуры"); Иначе ТекстЗапроса = ТекстЗапросаМегафильтра(0); рс.УстановитьТекстовыйПараметр("ЗначФильтр",СтрЗаменить(СтрЗаменить(ВРег(СокрЛП(СтрокаОтбора))," *","%"),"*","%")+"%"); КонецЕсли; Иначе ТекстЗапроса = ТекстЗапросаМегафильтра(0); рс.УстановитьТекстовыйПараметр("ЗначФильтр",СтрЗаменить(СтрЗаменить(ВРег(СокрЛП(СтрокаОтбора))," *","%"),"*","%")+"%"); КонецЕсли; тз = рс.ВыполнитьИнструкцию(ТекстЗапроса); СЗ1 = СоздатьОбъект("СписокЗначений"); тз.Выгрузить(СЗ1,,,"Номенклатура"); СЗ1.Сортировать(); Если СЗ1.РазмерСписка()=0 Тогда глЛегкоеСообщение("Товара, удавлетворяющего параметрам поиска, не найдено!!!"); НеЗакрывать = "СтрокаОтбора"; Форма.Закрыть(); Возврат; КонецЕсли; СЗ = СоздатьОбъект("СписокЗначений"); СЗ1.Выгрузить(СЗ); ИспользоватьСписокЭлементов(СЗ); ЕстьФильтр = 1; НеЗакрывать = "МногострочнаяЧасть"; Форма.Закрыть(); СтрокаОтбора = ""; КонецПроцедуры
//************************************************ Функция ТекстЗапросаМегафильтра(Звездочка=0) Если СписокОтбора.ПолучитьЗначение(СписокОтбора.ТекущаяСтрока())="Наименование" Тогда Если Звездочка = 0 Тогда ТекстЗапроса = "Select Ном.Id [Номенклатура $Справочник.Номенклатура] |From $Справочник.Номенклатура As Ном |Where (UPPER(Ном.Descr) LIKE :ЗначФильтр)"; Иначе ТекстЗапроса = "Select Ном.Id [Номенклатура $Справочник.Номенклатура] |From $Справочник.Номенклатура As Ном |Where (UPPER(Ном.Descr) LIKE :ЗначФильтр) | And (Ном.Id In (Select val From #СписокНоменклатуры))"; КонецЕсли; ИначеЕсли СписокОтбора.ПолучитьЗначение(СписокОтбора.ТекущаяСтрока())="Марка" Тогда Если Звездочка = 0 Тогда ТекстЗапроса = "Select Ном.Id [Номенклатура $Справочник.Номенклатура] |From $Справочник.Номенклатура As Ном |Inner Join $Справочник.Автомобили As Автомобили On $Ном.Автомобиль = Автомобили.Id |Where (UPPER(Автомобили.Descr) LIKE :ЗначФильтр)"; Иначе ТекстЗапроса = "Select Ном.Id [Номенклатура $Справочник.Номенклатура] |From $Справочник.Номенклатура As Ном |Inner Join $Справочник.Автомобили As Автомобили On $Ном.Автомобиль = Автомобили.Id |Where (UPPER(Автомобили.Descr) LIKE :ЗначФильтр) | And (Ном.Id In (Select val From #СписокНоменклатуры))"; КонецЕсли; ИначеЕсли СписокОтбора.ПолучитьЗначение(СписокОтбора.ТекущаяСтрока())="Артикул" Тогда Если Звездочка = 0 Тогда ТекстЗапроса = "Select Ном.Id [Номенклатура $Справочник.Номенклатура] |From $Справочник.Номенклатура As Ном |Where (UPPER($Ном.Артикул) LIKE :ЗначФильтр)"; Иначе ТекстЗапроса = "Select Ном.Id [Номенклатура $Справочник.Номенклатура] |From $Справочник.Номенклатура As Ном |Where (UPPER($Ном.Артикул) LIKE :ЗначФильтр) | And (Ном.Id In (Select val From #СписокНоменклатуры))"; КонецЕсли; ИначеЕсли СписокОтбора.ПолучитьЗначение(СписокОтбора.ТекущаяСтрока())="Производитель" Тогда Если Звездочка = 0 Тогда ТекстЗапроса = "Select Ном.Id [Номенклатура $Справочник.Номенклатура] |From $Справочник.Номенклатура As Ном |Inner Join $Справочник.Контрагенты As Контрагенты On $Ном.Производитель = Контрагенты.Id |Where (UPPER(Контрагенты.Descr) LIKE :ЗначФильтр)"; Иначе ТекстЗапроса = "Select Ном.Id [Номенклатура $Справочник.Номенклатура] |From $Справочник.Номенклатура As Ном |Inner Join $Справочник.Контрагенты As Контрагенты On $Ном.Производитель = Контрагенты.Id |Where (UPPER(Контрагенты.Descr) LIKE :ЗначФильтр) | And (Ном.Id In (Select val From #СписокНоменклатуры))"; КонецЕсли; ИначеЕсли СписокОтбора.ПолучитьЗначение(СписокОтбора.ТекущаяСтрока())="Модель" Тогда Если Звездочка = 0 Тогда ТекстЗапроса = "Select Ном.Id [Номенклатура $Справочник.Номенклатура] |From $Справочник.Номенклатура As Ном |Where (UPPER($Ном.Марка) LIKE :ЗначФильтр)"; Иначе ТекстЗапроса = "Select Ном.Id [Номенклатура $Справочник.Номенклатура] |From $Справочник.Номенклатура As Ном |Where (UPPER($Ном.Марка) LIKE :ЗначФильтр) | And (Ном.Id In (Select val From #СписокНоменклатуры))"; КонецЕсли; КонецЕсли; Возврат ТекстЗапроса; КонецФункции
Как это работает? Выбираем реквизит, по которому будет построен отбор, вводим подстроку реквизита. У нас отключается иерархический просмотр и устанавливается запрет на него. Прямым запросом отбирается список элементов и с помощью метода «ИспользоватьСписокЭлементов» мы получаем искомую выборку по фильтру. Если требуется отфильтроваться по нашему списку, снова выбираем нужный реквизит в поле со списком, а в строке отбора первым символом указываем «*». В итоге получаем более узкую выборку. Кнопка «Х» сбрасывает фильтр и включает доступность иерархического просмотра. Фильтр поддерживает все возможности оператора языка TSQL Like, то есть в подстроке адекватно отрабатывается использование символов «%», «$» и так далее.
Мой блог по 1с: 1c77-1c8x.ru