Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Пара вопросов по польз. функциям/процедурам (число прочтений - 3650 )
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Пара вопросов по польз. функциям/процедурам
19. Февраля 2007 :: 09:28
Печать  
Привет о мудрый АЛЛ!

В своем недалеком развитии дошел до применения пользовательских процедур и функций в базе 1С на SQL2000 в целях разгрузки своих очень худых клиентов и др..
Есть несколько вопросов, ответы на которые не отыскал в библии или в конференции.
Подскажите, плз:

1. Есть ли разница в быстродействии польз. процедуры и польз. функции (в смысле, что польз. функции аналогично процедурам проходят этапы подготовки, оптимизации и т.д.) ?
2. Есть ли какая либо существенная разница между использованием процедуры иди функции?
3. При операции загрузки данных в базу 1С хранимые в ней процедуры полность уничтожаются и формируются по новому? Уничтожаются ли при этом хранимые пользовательские процедуры?  Уничтожаются ли при этом хранимые пользовательские функции?
4. Почему так происходи с "set nocount on":
Если не использовать хранимую процедуру, а формировать прямой запрос только средствами 1С++,
то такое ессно проходит:
Код
Выбрать все
ТекстЗапроса="
|set nocount on
|declare @docum7 char(23)
|set @docum7 = ?
|select ... 


а если формировать польз. функцию, то такое нет:
Код
Выбрать все
ТекстЗапроса="CREATE FUNCTION dbo.fn_estnn (@docum char(23))
	|RETURNS smallint
	|AS
	|BEGIN
	|declare @est smallint
	|set @est = (
	|set nocount on
	|select ... 


- ругается на "set nocount on"
И нужен ли в этом случае этот "set nocount on" в том смысле, что если он работает в прямом запросе, то нужен ли тут в пользовательской функции?
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Пара вопросов по польз. функциям/процедурам
Ответ #1 - 21. Февраля 2007 :: 11:40
Печать  
Наверное совсем про глупости спросил...  Печаль
  
Наверх
ICQ  
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Пара вопросов по польз. функциям/процедурам
Ответ #2 - 21. Февраля 2007 :: 12:00
Печать  
набери в поиске этого ресурса set nocount on у увидишь кучу ссылок, а гооришь ничего нет ничег ов конференции...
внутренний голос подсказывает, что эта "директива" должна быть 1-й строкой твоего запроса...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Пара вопросов по польз. функциям/процедурам
Ответ #3 - 21. Февраля 2007 :: 13:22
Печать  
Гм, больше интересуют первые три вопроса. Особенно третий...
  
Наверх
ICQ  
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Пара вопросов по польз. функциям/процедурам
Ответ #4 - 21. Февраля 2007 :: 13:54
Печать  
Kapet писал(а) 21. Февраля 2007 :: 13:22:
Гм, больше интересуют первые три вопроса. Особенно третий...

да, уничтожаются
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Пара вопросов по польз. функциям/процедурам
Ответ #5 - 21. Февраля 2007 :: 14:12
Печать  
Kapet писал(а) 21. Февраля 2007 :: 13:22:
Гм, больше интересуют первые три вопроса. Особенно третий...


Нет, 1С удаляет только свои процедуры и только свои таблицы, все остальное остается. Хотя єто проверял только для таблиц, сейчас проверю для процедур.
Если конечно загрузка происходит в ту базу, где были эти процедуры и таблицы. Но сам 1С конечно же выгружает только свои таблицы, ну и процедуры создает только те что есть в DDS, и если в базе есть какие то другие таблицы или процдеры - то они остаются.
  
Наверх
IP записан
 
pvase
God Member
*****
Отсутствует



Сообщений: 923
Местоположение: Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Пара вопросов по польз. функциям/процедурам
Ответ #6 - 21. Февраля 2007 :: 14:23
Печать  
Проверил, остаютса без проблем. Ну конечно 1С же их не выгружает и не загружает в новую базу (если вдруг надо будет загрузить в новую базу SQL с другим именем, то придется делать копию или средствами SQL или занова создавать "свои" процедуры вручную ну или черзе DTS, что тоже средства SQL сервера).
  
Наверх
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Пара вопросов по польз. функциям/процедурам
Ответ #7 - 22. Февраля 2007 :: 07:43
Печать  
Спасибо, уже легче...
  
Наверх
ICQ  
IP записан
 
Славко
Senior Member
****
Отсутствует



Сообщений: 467
Местоположение: Украина, г. Днепропетровск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Пара вопросов по польз. функциям/процедурам
Ответ #8 - 22. Февраля 2007 :: 12:52
Печать  
Вася, ен вводи человека в заблуждение, если уже и говоришь об неудаляемых процедурах и функциях, так говори как их правильно для этого создать... если он их привяжет к 1С базе, то при первом же измении структуры или хотя бы словаря от этих процедур и следа не останется...
  

Ламер, самый обычный ламер...    сначала мы ...   а потом мы ...
Наверх
wwwICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Пара вопросов по польз. функциям/процедурам
Ответ #9 - 23. Февраля 2007 :: 09:52
Печать  
Спасибо, это хуже, но конечно не смертельно если под рукой осталась свежая обработка по внесению польз. функций...

И всетаки по set nocount on:
- зачем это надо - по ссылкам давно прочитал. Вопрос был в другом: как в польз. функции в теле запроса после Begin вставить set nocount on. Так, как ниже, скуль на "set nocount on" ругается:
|Create Function...
...
|BEGIN
|declare @est smallint
|set @est = (
|set nocount on
|select ...

Урезаный рабочий пример обработки по внесению польз. функций с закомментированным set nocount on:
Код
Выбрать все
Перем _rs;
//-----
Процедура УдалитьФункцию(ИмяФункции)
	_rs.executeStatement("
	|if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].["+ИмяФункции+"]') and xtype in (N'FN', N'IF', N'TF'))
	|begin drop function [dbo].["+ИмяФункции+"] end");
КонецПроцедуры
Процедура СформироватьПользФункции()
// 1. Есть ли налоговая накладная у документа ЧекКА для журнала Чеки
	ИмяФункции="fn_estnn";
	УдалитьФункцию(ИмяФункции);
	ТекстЗ="create function dbo."+ИмяФункции+" (@docum char(23))
	|returns smallint
	|as
	|begin
	|declare @est smallint
	|set @est =
	|(
	//|set nocount on
	|select
	|	max(V._status)
	|from
	|	(select
	|		_status = case
	|				when D.Cl = 1 then 12
	|				when (D.Cl = 0 and D.Mr = 0) then 10
	|				when D.Mr = 1 then 7
	|			else 0
	|			end
	|	from
	|		(select
	|			j.iddoc _Doc,
	|			j.iddocdef _Doc_вид,
	|			j.closed&1 Cl,
	|			j.ismark Mr
	|		from _1scrdoc Подч(nolock)
	|			inner join _1sjourn j(nolock) on Подч.childid = j.iddoc
	|		where
	|			j.iddocdef = $ВидДокумента.НалоговаяНакладная and
	|			Подч.mdid = 0 and
	|			Подч.parentval = @docum
	|		) D
	|	) V
	|)
	|return (@est)
	|end";
	_rs.executeStatement(ТекстЗ);
// 2. Табличная часть Счета для журнала "Счета"
	ИмяФункции="fn_tovar_scheta";
...
	Сообщить("Загрузка пользовательских функций закончена!");
КонецПроцедуры
//-----
_rs=СоздатьОбъект("ODBCRecordset"); 


И еще. Можно ли загнать содержимое СформироватьПользФункции() в транзакцию 1С, и если да, то как отлавливать ошибочную ситуацию _rs.executeStatement(ТекстЗ), например при ошибке парсинга или др.?
« Последняя редакция: 23. Февраля 2007 :: 11:09 - Kapet »  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Пара вопросов по польз. функциям/процедурам
Ответ #10 - 26. Февраля 2007 :: 07:57
Печать  
Сам по чуть-чуть дошел...
Транзакция 1С здесь не работает. Наверно надо открывать транзакцию в ОДБС соединении.
Ошибочную ситуацию можно отлавливать, если вместо _rs.executeStatement() получать результат выполнения запроса в _rs.execute()

Спасибо всем!
  
Наверх
ICQ  
IP записан
 
Mikeware
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 262
Зарегистрирован: 27. Июля 2006
Пол: Мужской
Re: Пара вопросов по польз. функциям/процедурам
Ответ #11 - 26. Февраля 2007 :: 15:59
Печать  
А почему бы не добавить проверку и создание пользовательских функций в  ПриНачалеРаботы() ?
  
Наверх
ICQ  
IP записан
 
Kapet
Senior Member
****
Отсутствует


Ламер - вансист

Сообщений: 262
Местоположение: Ukraine, Kyiv
Зарегистрирован: 27. Декабря 2006
Пол: Мужской
Re: Пара вопросов по польз. функциям/процедурам
Ответ #12 - 26. Февраля 2007 :: 17:17
Печать  
Mikeware писал(а) 26. Февраля 2007 :: 15:59:
А почему бы не добавить проверку и создание пользовательских функций в  ПриНачалеРаботы() ?


Ессно сделал сразу, как сумел. Если снесло все функции идет проверка на существование хотя бы одной обязательной:

Код
Выбрать все
ПриНачалеРаботыСистемы()
...
_rsgl=createobject("ODBCRecordset");
if _rsgl.executeScalar("
|select case when exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[fn_svost_chekka]') and xtype in (N'FN', N'IF', N'TF'))
|then 1 else 0 end")=0 then
	Kont=1;
	OpenForm("Отчет#",Kont,IBDir()+"\ExtForms\UniProcs\Формирование пользовательских функций.ert");
endif;
_rsgl=0;
...
 


Здесь Kont=1 есть признак неинтерактивного запуска обработки со всеми вытекающими: СтатусВозврат(0) и без сообщений...
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать