Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Отбор по нескольким реквизитам в журнале (число прочтений - 4532 )
Cutter
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 5
Зарегистрирован: 08. Июля 2008
Отбор по нескольким реквизитам в журнале
08. Июля 2008 :: 08:48
Печать  
Существуют примеры для отбора в общем журнале документов через подмену SQL-запросов DLL-кой vk_Hook1C.dll. Но эти примеры для одой графы отбора. Я знаком с SQL слабо, но попробовал сделать отбор по нескольким графам отбора и общим реквизитам. Заранее прошу не пинать, так как новичек. Я создал в общес журнале на форме реквизиты для отбора: ВыбСклад, ВыбКонтрагент, ВыбПроект, ВыбАвтор и ВидДокументаДляОтбора (конфигурация на основе стандартной ТиС). При выборе какого либо реквизита вызывается процедура с таким кодом
Код
Выбрать все
	Мета=СоздатьОбъект("MetaDataWork");

	стр="";
    Если ПустоеЗначение(ВыбКонтрагент)=0 Тогда  
   		Если ПустоеЗначение(ВыбСклад)=0 Тогда  
   			стр=стр+"left join ";
   		Иначе
   			стр=стр+"inner join ";
   		КонецЕсли;
		ИДГрафы=Мета.ИДОбъекта(Метаданные.ГрафаОтбора("Контрагент"));  
		ИДКонтра=Мета.ЗначениеВСамуюДлиннуюСтрокуБД(ВыбКонтрагент);
        стр=стр+"_1SCRDOC as q ON q.CHILDID=_1SJOURN.IDDOC and q.MDID = "+ИДГрафы+" AND q.PARENTVAL = '"+ИДКонтра+"' ";
    КонецЕсли;
    Если ПустоеЗначение(ВыбСклад)=0 Тогда    
		ИДГрафы=Мета.ИДОбъекта(Метаданные.ГрафаОтбора("Склад"));  
		ИДСклада=Мета.ЗначениеВСамуюДлиннуюСтрокуБД(ВыбСклад);
        стр=стр+"INNER JOIN _1SCRDOC as w ON _1SJOURN.IDDOC = w.CHILDID  where w.MDID = "+ИДГрафы+" AND w.PARENTVAL = '"+ИДСклада+"'";
		Если ПустоеЗначение(ВыбКонтрагент)=0 Тогда  
			стр=стр+" and q.CHILDID=w.CHILDID ";
		КонецЕсли;
	КонецЕсли;    
	Если ВыбПроект.Выбран()=1 Тогда
		Если стр="" Тогда
			стр=стр+" where ";
		Иначе
			стр=стр+" and ";
		КонецЕсли;
		стр=стр+" _1SJOURN.SP798='"+глПолучитьИД(ВыбПроект)+"'";  
	КонецЕсли;
	Если ВыбАвтор.Выбран()=1 Тогда
		Если стр="" Тогда
			стр=стр+" where ";
		Иначе
			стр=стр+" and ";
		КонецЕсли;
		стр=стр+" _1SJOURN.SP74='"+глПолучитьИД(ВыбАвтор)+"'";  
	КонецЕсли;
	Если ПустоеЗначение(ВидДокументаДляОтбора)=0 Тогда
		Если стр="" Тогда
			стр=стр+" where ";
		Иначе
			стр=стр+" and ";
		КонецЕсли;  
		бора));
		стр=стр+" IDDOCDEF='"+ИДДока+"'";  
	КонецЕсли;
                    
	Если Стр<>"" Тогда
		vk_hook.ТекстSQL="Select * from _1SJOURN(NOLOCK INDEX=ACDATETIME) where DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC<=? order by DATE_TIME_IDDOC";
		vk_hook.УдалитьЗаменуSQL();      
		vk_hook.ТекстSQL="Select COUNT(*) from _1SJOURN(NOLOCK) where  (DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC<=?) and DATE_TIME_IDDOC<=?";
		vk_hook.УдалитьЗаменуSQL();      

		//контр и склад
		vk_hook.ТекстSQL="Select * from _1SJOURN(NOLOCK INDEX=ACDATETIME) where DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC<=? order by DATE_TIME_IDDOC";
		vk_hook.НовыйSQL="SELECT * FROM _1SJOURN "+стр+" and _1SJOURN.DATE_TIME_IDDOC>=? and _1SJOURN.DATE_TIME_IDDOC<=? order by DATE_TIME_IDDOC";
		vk_hook.УстановитьЗаменуSQL();

		vk_hook.ТекстSQL="Select COUNT(*) from _1SJOURN(NOLOCK) where  (DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC<=?) and DATE_TIME_IDDOC<=?";
		//vk_hook.НовыйSQL="Select COUNT(*) from _1SJOURN "+стр+" and (w.CHILD_DATE_TIME_IDDOC >=? AND w.CHILD_DATE_TIME_IDDOC <=?) and w.CHILD_DATE_TIME_IDDOC <=?";
		vk_hook.НовыйSQL="Select COUNT(*) from _1SJOURN "+стр+" and (DATE_TIME_IDDOC>=? and DATE_TIME_IDDOC<=?) and DATE_TIME_IDDOC<=?";
		vk_hook.УстановитьЗаменуSQL();	        
	КонецЕсли;
	                    
	УстановитьОтбор("Фирма", 0);
	УстановитьОтбор("");
	ВидыОтбора("*");
 



Последние строки нужны для того, чтоб принудительно вызывать запрос к серверу. Не придумал, как по другому.

В журнале документов есть текстовые колонки (Представление дока, Информация и др.) и колонка с реквизитом (дата документа). Так вот при установленом хотя бы одном отборе проподает поиск по колонке с реквизитом (по дате то бишь. Ну то есть когда встаешь на эту колонку и начинаешь искать док с датой предположим 01.01.07, набираешь 070101). А при снятых отборах такой поиск работает.
Вопрос номер один: подозреваю, что сделал кривовато, поэтому как исправить, чтоб поиск работал?
Вопрос номер два: мож как-то можно оптимизировать запрос, а то я наверное очень неоптимально сделал?
  
Наверх
 
IP записан
 
Cutter
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 5
Зарегистрирован: 08. Июля 2008
Re: Отбор по нескольким реквизитам в журнале
Ответ #1 - 14. Июля 2008 :: 18:12
Печать  
Прошло несколько дней, воз и ныне там. Никто не делал что ли? Все используют составной реквизит?
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Отбор по нескольким реквизитам в журнале
Ответ #2 - 14. Июля 2008 :: 18:15
Печать  
Никто не использует vk_hook. Все используют ТабличноеПоле.
Ю а велкам!
  
Наверх
 
IP записан
 
villy
Senior Member
****
Отсутствует



Сообщений: 287
Зарегистрирован: 24. Мая 2006
Пол: Мужской
Re: Отбор по нескольким реквизитам в журнале
Ответ #3 - 14. Июля 2008 :: 20:52
Печать  
Arta писал(а) 14. Июля 2008 :: 18:15:
Никто не использует vk_hook. Все используют ТабличноеПоле.
Ю а велкам!

+1
  
Наверх
IP записан
 
Cutter
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 5
Зарегистрирован: 08. Июля 2008
Re: Отбор по нескольким реквизитам в журнале
Ответ #4 - 15. Июля 2008 :: 07:37
Печать  
а киньте ссылочкой на примеры журнала с отбором, плиз... а то не нашел
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Отбор по нескольким реквизитам в журнале
Ответ #5 - 15. Июля 2008 :: 11:46
Печать  
Cutter писал(а) 15. Июля 2008 :: 07:37:
а киньте ссылочкой на примеры журнала с отбором, плиз... а то не нашел


http://www.rikcenter.ru/downloads.php?file=6
Правда, не журнал, а справочник. Но принцип тот же.
  
Наверх
 
IP записан
 
Cutter
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 5
Зарегистрирован: 08. Июля 2008
Re: Отбор по нескольким реквизитам в журнале
Ответ #6 - 15. Июля 2008 :: 14:43
Печать  
Скачал тестовую базу, добавил в спр Контров реквизит типа Дата, прописал в запросах, чтоб выводилось. Стало выводиться в таблице но в виде Jul 1 2008 12:00 AM. И ладно бы, это можно было убрать форматированием каким-то, но поиск по этому полю происходит с начала поля, то есть начинает срабатывать при наборе Jul, а не с набора года, как было в журнале по полю типа дата...
  
Наверх
 
IP записан
 
sadovnikov
1c++ power user
Отсутствует


I Love YaBB 2!

Сообщений: 420
Зарегистрирован: 06. Марта 2007
Re: Отбор по нескольким реквизитам в журнале
Ответ #7 - 16. Июля 2008 :: 04:48
Печать  
Cutter писал(а) 15. Июля 2008 :: 14:43:
Скачал тестовую базу, добавил в спр Контров реквизит типа Дата, прописал в запросах, чтоб выводилось. Стало выводиться в таблице но в виде Jul 1 2008 12:00 AM. И ладно бы, это можно было убрать форматированием каким-то, но поиск по этому полю происходит с начала поля, то есть начинает срабатывать при наборе Jul, а не с набора года, как было в журнале по полю типа дата...


Так сначала отформатируй как надо, а потом пробуй контестный поиск.
Если и тогда не устроит, используй событие
ПриБыстромПоиске(чТипБыстрогоПоиска, нДанные, чФСО)
  
Наверх
 
IP записан
 
Cutter
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 5
Зарегистрирован: 08. Июля 2008
Re: Отбор по нескольким реквизитам в журнале
Ответ #8 - 16. Июля 2008 :: 08:07
Печать  
спасибо, попробую..
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать