Существуют примеры для отбора в общем журнале документов через подмену 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). А при снятых отборах такой поиск работает.
Вопрос номер один: подозреваю, что сделал кривовато, поэтому как исправить, чтоб поиск работал?
Вопрос номер два: мож как-то можно оптимизировать запрос, а то я наверное очень неоптимально сделал?