новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Отбор по подстроке реквизитов в форме списка справочника в конфигурации 1с7.7 a’la восьмерка с использованием прямых запросов

  • Добавить свою публикацию
  • для этого требуется регистрация

Задача: требуется в форме подбора настроить отбор по подстроке реквизитов в форме подбора справочника «Номенклатура».

Исходные данные: конфигурация – измененная ТиС ред. 9.2 на базе MS SQL Server 2000, используется 1cpp.dll.

Описание решения: 

  • Добавляем на форму подбора справочника "Номенклатура" два реквизита: «Строка отбора»(Строка(30))(Мегафильтр()), «Список отбора»(Поле со списком)(ПереходНаСтрокуОтбора()) и кнопку сброса фильтра «Х»( Мегафильтр(0)). Обрамляем их рамкой «Фильтр».

Изображение

  • Добавляем в «Список отбора» реквизиты, по которым будем делать отбор:
    СписокОтбора.ДобавитьЗначение("Наименование");
	СписокОтбора.ДобавитьЗначение("Артикул");
	СписокОтбора.ДобавитьЗначение("Марка");
	СписокОтбора.ДобавитьЗначение("Модель");
	СписокОтбора.ДобавитьЗначение("Производитель");
  • Процедура ПереходНаСтрокуОтбора() будет просто позиционировать нас на реквизит «СтрокаОтбора».
 
//************************************************ 
Процедура ПереходНаСтрокуОтбора()
	НеЗакрывать = "СтрокаОтбора";
	Форма.Закрыть();
КонецПроцедуры
//************************************************ 
Процедура ПриЗакрытии()
    Если НеЗакрывать  "" Тогда
        Активизировать(СтрокаОтбора);
        СтатусВозврата(0);
    КонецЕсли;
КонецПроцедуры
  • Процедура Мегафильтр() устанавливает/уточняет/отменяет фильтр. Она вызывается при вводе в строку отбора. В зависимости от выбранного реквизита возвращается текст запроса функцией ТекстЗапросаМегафильтр(). Кнопка «Х» передает в качестве параметра 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

 
0
Читайте также
Восстановление потерянных реквизитов документов v 7.7
В ранее записанных и проведённых документах пропали некоторые реквизиты. В отчётах полный бардак. Как я решил эту проблему.
Консоль компоновки данных – практические приемы работы.Часть 1.
Поменять реквизит документа быстро, загрузить в базу данные из файла, осуществить разные переброски - приемы работы
Разработки
Доступ к реквизитам справочника в 1с7.7 для каждого пользователя
Разработка разграничивает доступ к реквизитам справочника в 1С 7.7
Заполнение Статьи движения денежных средств в документах
Позволяет проставить реквизит в шапке документа
Расчет резерва отпусков
"Обработка для расчета резерва отпусков"
Еще от автора
≡ к списку статей