Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Подмена запросов через vk_hook (число прочтений - 11040 )
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 записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать