Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Подмена запросов через vk_hook (число прочтений - 11038 )
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Подмена запросов через vk_hook
20. Декабря 2012 :: 09:59
Печать  
Добрый день.
Понадобилось для бухгалтерии изменить РазделительУчета с ЮрЛица на фирмы. Этот процесс в принципе понятен и реализуется стандартными 1С средствами.
Но появилась необходимость формировать бух движения и итоги по СпискуЗначений.
Помятуя о подмене запросов попытался это действо совершить с помощью vk_hook :)

Код того, что отправляется на SQL во время генерации ОСВ
[code]Select * from _1SACCS(NOLOCK INDEX=CODE) where PLANID=? order by PLANID,SCHKOD
Select COUNT(*) from _1SACCS(NOLOCK) where PLANID=? and SCHKOD<=?
SELECT ACCID,CURRID,FLAGS=MAX(FLAGS),SUM_=SUM(SUM_),CURSUM=SUM(CURSUM)
FROM
(
SELECT ACCID,CURRID,FLAGS,SUM_=CASE KIND WHEN '4' THEN SD ELSE 0 END,CURSUM=CASE KIND WHEN '5' THEN SD ELSE 0 END
FROM _1SBKTTL BKTTL(NOLOCK)
WHERE DATE='20120101' AND PLANID=7984 AND SP32733=? AND (KIND = '4' OR KIND = '5')
) AS SD
GROUP BY ACCID,CURRID
HAVING SUM(SUM_)<>0 OR SUM(CURSUM)<>0!
!SELECT M(CURSUMDT),CURSUMKT=SUM(CURSUMKT)
FROM
(
SELECT ACCID,CURRID,FLAGS,DATE=CONVERT( DATETIME, '20120101' ),SUMDT=CASE KIND WHEN '4' THEN OBDT1 ELSE 0 END,SUMKT=CASE KIND WHEN '4' THEN OBKT1 ELSE 0 END,CURSUMDT=CASE KIND WHEN '5' THEN OBDT1 ELSE 0 END,CURSUMKT=CASE KIND WHEN '5' THEN OBKT1 ELSE 0 END
FROM _1SBKTTL BKTTL(NOLOCK)

WHERE DATE='20120101' AND PLANID=7984 AND SP32733=? AND KIND>='4' AND KIND<='6') AS OB
GROUP BY ACCID,CURRID,DATE
HAVING SUM(SUMDT)<>0 OR SUM(SUMKT)<>0 OR SUM(CURSUMDT)<>0 OR SUM(CURSUMKT)<>0 ORDER BY DATE[/code]

В общем то в нем все понятно. Добавил подмену запроса:
[code]
vk_hook.НовыйSQL="
|create table #P1 (val varchar(9))
|insert into #P1 values('     F   ')
|--insert into #P1 values('     6   ')
|
|SELECT ACCID,CURRID,FLAGS=MAX(FLAGS),SUM_=SUM(SUM_),CURSUM=SUM(CURSUM)
|FROM
|(
|SELECT ACCID,CURRID,FLAGS,SUM_=CASE KIND WHEN '4' THEN SD ELSE 0 END,CURSUM=CASE KIND WHEN '5' THEN SD ELSE 0 END
|FROM _1SBKTTL BKTTL(NOLOCK)
|WHERE DATE='20120101' AND PLANID=7984 AND (SP32733 in (SELECT val from #P1)) AND (KIND = '4' OR KIND = '5')
|) AS SD
|GROUP BY ACCID,CURRID
|HAVING SUM(SUM_)<>0 OR SUM(CURSUM)<>0
|
|drop table #P1
|";
[/code]
и
[code]
vk_hook.НовыйSQL="
|create table #P1 (val varchar(9))
|insert into #P1 values('     F   ')
|--insert into #P1 values('     6   ')
|
|SELECT M(CURSUMDT),CURSUMKT=SUM(CURSUMKT)
| FROM
| (
|SELECT ACCID,CURRID,FLAGS,DATE=CONVERT( DATETIME, '20121001' ),SUMDT=CASE KIND WHEN '4' THEN OBDT1+OBDT2+OBDT3 ELSE 0 END,SUMKT=CASE KIND WHEN '4' THEN OBKT1+OBKT2+OBKT3 ELSE 0 END,CURSUMDT=CASE KIND WHEN '5' THEN OBDT1+OBDT2+OBDT3 ELSE 0 END,CURSUMKT=CASE KIND WHEN '5' THEN OBKT1+OBKT2+OBKT3 ELSE 0 END
|FROM _1SBKTTL BKTTL(NOLOCK)
|WHERE DATE>='20121001' AND DATE<='20121001' AND PLANID=7984 AND (SP32733 in (SELECT val from #P1)) AND KIND>='4' AND KIND<='6') AS OB
| GROUP BY ACCID,CURRID,DATE
|HAVING SUM(SUMDT)<>0 OR SUM(SUMKT)<>0 OR SUM(CURSUMDT)<>0 OR SUM(CURSUMKT)<>0 ORDER BY DATE
|
|drop table #P1
|";
[/code]

но в результате получил ошибку :(
[img]http://logofree.ru/other/errorcount.jpg[/img]

Я предполагаю, что возможно нужно еще и второй запрос из 4х подменять, но на что?
подскажите пожалуйста, как завести сей паровоз? :)

  
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подмена запросов через vk_hook
Ответ #1 - 20. Декабря 2012 :: 10:31
Печать  
выкини создание временных табличек, верни обратно запрос , какой и был (весь целиком) + воткни условие:
.....AND (SP32733 in ('     F   ','     6   '))

всё

  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #2 - 20. Декабря 2012 :: 10:56
Печать  
Eprst писал(а) 20. Декабря 2012 :: 10:31:
выкини создание временных табличек, верни обратно запрос , какой и был (весь целиком) + воткни условие:
.....AND (SP32733 in ('     F   ','     6   '))

всё


так же самая ошибка в таком случае.

Проблема решилась так. Необходимо обязательно использовать переданный параметр и использовать его.

Добавил в новом запросе
Код
Выбрать все
declare @tmp varchar(9)
set @tmp=? 



и все заработало Улыбка

Спасибо за внимание, пока вот не написал сюда не додумался Улыбка
  
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подмена запросов через vk_hook
Ответ #3 - 20. Декабря 2012 :: 11:03
Печать  
Че то не видно этого параметра в исходном запросе..
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #4 - 20. Декабря 2012 :: 11:07
Печать  
такая ошибка возникает при выполнении параметризированного запроса, когда количество параметров в запросе не соответствует количеству устанавливаемых
  

1&&2&&3
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #5 - 20. Декабря 2012 :: 11:47
Печать  
Eprst писал(а) 20. Декабря 2012 :: 11:03:
Че то не видно этого параметра в исходном запросе..


...AND SP32733=? AND...
и в первом и во втором запросе.

trad писал(а) 20. Декабря 2012 :: 11:07:
такая ошибка возникает при выполнении параметризированного запроса, когда количество параметров в запросе не соответствует количеству устанавливаемых


Спасибо, именно это и было моей ошибкой.
  
Наверх
www  
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #6 - 24. Декабря 2012 :: 09:38
Печать  
Продолжу Печаль
Чего-то сюда http://www.1cpp.ru/forum/YaBB.pl?num=1356083562 отвечать никто не хочет.

Запрос приходит, я его нормально, как мне кажется заменяю, но все равно в SQL уходит оригинальный.
Причем при тестировании на журнале и справочниках все срабатывает правильно, а вот на отчете не хочет.
Можно ли подменять запросы с помощью 1C++ ?
  
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подмена запросов через vk_hook
Ответ #7 - 24. Декабря 2012 :: 09:46
Печать  
Дык замену ромикс сделал вроде как только в списках журналов и справочников, чтоб чсвои отборы можно было понавешивать

В отчетах то занафига ?
Улыбка)

лепи свои отчеты.
Ну, можешь и БухгалтерскиеИтоги подменить своим классом..только, проще переписать на аккаунтРекордсет от Ивана Берездецкого и привет.
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #8 - 24. Декабря 2012 :: 10:00
Печать  
Есть куча отчетов в бухии использующих РазделительУчета. Они работают замечательно и всех все устаривает кроме того, что нельзя в разделителе использовать СписокЗначений.
Как уже писал выше подменить получается и корректно работает, осталось только в SQL отправить эту конструкцию, вот тут то затык и вышел.
Причем запрос перехватывается, а вот дальше почем-то не меняется.

>>Дык замену ромикс сделал вроде как только в списках журналов и справочников

Судя по перехвату, ловится SQLPrepare и SQLExecute, и тут уже не важно, по идее, откуда это вызвано.
  
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подмена запросов через vk_hook
Ответ #9 - 24. Декабря 2012 :: 10:08
Печать  
Дык поймай Ромикса и поспрошай его.
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #10 - 24. Декабря 2012 :: 10:39
Печать  
Eprst писал(а) 24. Декабря 2012 :: 10:08:
Дык поймай Ромикса и поспрошай его.

Координаты для ловли подскажешь? Улыбка

И все же, в 1С++ есть перехват запросов или нет?
  
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подмена запросов через vk_hook
Ответ #11 - 24. Декабря 2012 :: 10:57
Печать  
Нету, и как бэ оно там и не нужно вовсе.
  
Наверх
 
IP записан
 
ev-kov
God Member
*****
Отсутствует



Сообщений: 694
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #12 - 22. Января 2013 :: 16:24
Печать  
MaxPiter удобен ли на практике vkhook?
  

Информация - то, что снижает неопределенность в какой-либо области и очень важно не ошибиться областью в наш информационный век!
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #13 - 22. Января 2013 :: 18:30
Печать  
ev-kov писал(а) 22. Января 2013 :: 16:24:
MaxPiter удобен ли на практике vkhook?

Я его использую для устранения блокировок и предотвращения загрузки процессора. http://infostart.ru/public/83504/
И переписал под себя для подмены запросов.
По поводу удобно, мне нравится, конфликтов с 1С++ и другими компонентами не обнаружено, с поставленными задачами справляется Улыбка
  
Наверх
www  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #14 - 23. Января 2013 :: 04:41
Печать  
to MaxPiter.
Добрый день! Напишу еще сюда вопрос - не сможете ли доработать vk_hook для работы с секретным релизом без понижения уровня совместимости? Если нужна оплата - пишите в icq 201216890.
  
Наверх
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #15 - 23. Января 2013 :: 06:22
Печать  
leshik писал(а) 23. Января 2013 :: 04:41:
to MaxPiter.
Добрый день! Напишу еще сюда вопрос - не сможете ли доработать vk_hook для работы с секретным релизом без понижения уровня совместимости? Если нужна оплата - пишите в icq 201216890.

Добрый день. Я в личку, еще в тот же день ответил Улыбка
Почему то с форума не приходят письма о личных сообщениях.
Отвечу сюда еще тогда. Что именно нужно? Если все что описано в http://technet.microsoft.com/ru-ru/library/bb510680(v=sql.100).aspx то даже не возьмусь, если только некоторые, то нужно посмотреть.
  
Наверх
www  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #16 - 23. Января 2013 :: 07:13
Печать  
Нет - не все конечно - только SQLDirect или что там используется для sleep?
  
Наверх
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #17 - 23. Января 2013 :: 07:28
Печать  
leshik писал(а) 23. Января 2013 :: 07:13:
Нет - не все конечно - только SQLDirect или что там используется для sleep?

Не понимаю что вы хотите.
vk_hook можно цеплять к 1С на SQL с любым уровнем совместимости.
vk_hook перехватывает SQLPrepare, SQLExecDirect, содержит метод sleep, который в цикле ждет когда SQL_STILL_EXECUTING вернет значение <> 2 (запрос выполняется)
Если в режиме совместимости (90) и выше SQL_STILL_EXECUTING при завершении запроса возвращает именно 2, то тогда vk_hook действительно нужно переписывать, но как-то это маловероятно.

У вас сейчас vk_hook не работает с SQL (90) ? или что происходит?
  
Наверх
www  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #18 - 23. Января 2013 :: 08:33
Печать  
Именно так - сейчас vk_hook для секретного релиза не работает с 9.0 при выполнении метода
     vk_hook.ПерехватSQLExecDirect();
сваливается с ошибкой.
  
Наверх
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #19 - 23. Января 2013 :: 08:39
Печать  
leshik писал(а) 23. Января 2013 :: 08:33:
Именно так - сейчас vk_hook для секретного релиза не работает с 9.0 при выполнении метода
     vk_hook.ПерехватSQLExecDirect();
сваливается с ошибкой.

Ясно, но это не связано с 9.0, это в самой компоненте ошибка.
Я ее у себя уже поправил (но на 9.0 не тестил). Вот прямо сейчас с ней еще кое какие действия ваяю. Надеюсь сегодня закончу и вышлю для теста.
  
Наверх
www  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #20 - 23. Января 2013 :: 08:42
Печать  
Огромное спасибо.
почта: a.kamenets@portal-z.ru
  
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Подмена запросов через vk_hook
Ответ #21 - 23. Января 2013 :: 10:06
Печать  
Лучше уж тут прикрепите, для истории
  
Наверх
 
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #22 - 23. Января 2013 :: 12:48
Печать  
Eprst писал(а) 23. Января 2013 :: 10:06:
Лучше уж тут прикрепите, для истории

Вот как-то так.
Добавлен метод:
vk_hook.ВключитьПодмену = 1 или 0;

Основное отличие от подмены от Romix, это подмена не всего запроса, а по вхождению.
т.е. вставлю пример из конфигурации

Код
Выбрать все
		vk_hook.ВключитьПодмену = 1;
		vk_hook.ТекстSQL = глПолеРазделительУчетаВИБ+"=?";

		ИДОбъектов = "";
		Для й=1 По глСписокФирмДляРазделителяУчета.РазмерСписка() Цикл
			ИДОбъектов = ачение(й))+"'";
			Если й<>глСписокФирмДляРазделителяУчета.РазмерСписка() Тогда
				ИДОбъектов = ИДОбъектов + ",";
			КонецЕсли;
		КонецЦикла;
		vk_hook.НовыйSQL = ""+глПолеРазделительУчетаВИБ+" in ("+ИДОбъектов+") and ''<>?";
		vk_hook.УстановитьЗаменуSQL(); 



данный код сообщает библиотеке, что нужно в запросах искать "SP3111=?" и заменять на "SP3111 in ('1','5','10') and ''<>?"

если не нужно больше подменять, выполняем
Код
Выбрать все
vk_hook.ВключитьПодмену = 0; 

  

vk_Hook1C.zip ( 70 KB | Загрузки )
Наверх
www  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #23 - 23. Января 2013 :: 13:21
Печать  
А с понижением уровня получилось исправить?
  
Наверх
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #24 - 23. Января 2013 :: 13:22
Печать  
leshik писал(а) 23. Января 2013 :: 13:21:
А с понижением уровня получилось исправить?

Можете скрин ошибки выслать?
  
Наверх
www  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #25 - 23. Января 2013 :: 14:38
Печать  
Вот скрин
  

____________.png ( 7 KB | Загрузки )
____________.png
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #26 - 23. Января 2013 :: 14:38
Печать  
А вот текстовое описание скрина:
  

_____________.txt ( 0 KB | Загрузки )
Наверх
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #27 - 24. Января 2013 :: 21:18
Печать  
leshik писал(а) 23. Января 2013 :: 14:38:
А вот текстовое описание скрина:

К сожалению даже не представляю от чего может сыпаться такая ошибка Улыбка
Ошибка вываливается сразу после метода vk_hook.ПерехватSQLExecDirect(); ?
  
Наверх
www  
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #28 - 24. Января 2013 :: 22:14
Печать  
Да, сразу после вызова данного метода.
  
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #29 - 24. Января 2013 :: 22:17
Печать  
Напомню Ваш же комментарий на ИС
Цитата:
(51) без "секретного релиза" 1С не запустится на 7ке и 2008 винде без изменения 1С'ных библиотек.
(52)
по идее нужно найти как называется функция перехвата для 2005 и 2008 sql.
для 2000 она называется SQLExecDirectA и SQLPrepareA.
----
хотя не факт, что получится, т.к. нужно разбирать эту самую функцию придется.
  
Наверх
IP записан
 
MaxPiter
Full Member
***
Отсутствует


I Love 1C++

Сообщений: 187
Местоположение: Санкт-Петербург
Зарегистрирован: 20. Ноября 2008
Пол: Мужской
Re: Подмена запросов через vk_hook
Ответ #30 - 25. Января 2013 :: 05:24
Печать  
leshik писал(а) 24. Января 2013 :: 22:17:
Напомню Ваш же комментарий на ИС
Цитата:
(51) без "секретного релиза" 1С не запустится на 7ке и 2008 винде без изменения 1С'ных библиотек.
(52)
по идее нужно найти как называется функция перехвата для 2005 и 2008 sql.
для 2000 она называется SQLExecDirectA и SQLPrepareA.
----
хотя не факт, что получится, т.к. нужно разбирать эту самую функцию придется.

vk_hook перехватывает SQLExecDirectA и SQLPrepareA в ODBC32.dll и это не должно влиять на режим совместимости.
Хотя есть свои но:
1) если ODBC32.dll имеет более новую версию, в которой эти функции имеют другое количество параметров
2) при режиме совместимости 9.0 используются другие библиотеки
то тут не чем помочь не смогу, по крайне мере, сейчас мыслей на эту тему нет.

upd: или "секретный релиз" тоже что-то меняет в этих функциях.
Если есть возможность, попробуйте запустить 1С с vk_hook без "секретного релиза" но в режиме совместимости SQL 9.0
« Последняя редакция: 25. Января 2013 :: 06:41 - MaxPiter »  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать