Имя: Пароль:
1C
1С v8
Прямой запрос к SQl - ошибка
0 Courageous
 
09.06.12
08:53
Добрый день форумчане. Очень нужна помощь, ибо у самого теории иссякли. Есть прямой запрос к SQL, который отрабатывает на ура, если вызван из формы документа пользователем, но когда эта форма обрабатывается Автопользователем в рег.задании, - вылетает с ошибкой: "Ошибка при вызове метода контекста (CreateParameter): Плохой тип переменной". Сам текст вызова:
Соединение=Новый COMОбъект("ADODB.Connection");
Соединение.CommandTimeout=Интервал;
Соединение.CursorLocation=Курсор;
Путь="Provider=SQLOLEDB.1;Password=12345;User ID=sa;Initial Catalog=KM;Data Source=db";
Соединение.Open(Путь);
Команда=Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection=Соединение;
Команда.CommandType=1;
Команда.CommandText=ТекстЗапроса;
Команда.CommandTimeout=Интервал;
Команда.Prepared = True;
//Далее заполняем параметры
Для Каждого Параметр Из Параметры Цикл
ПараметрADO=Команда.CreateParameter(Параметр.Имя,Параметр.ТипДанных,Параметр.ВходВыход, Параметр.Длина);
Команда.Parameters.Append(ПараметрADO); //ВОТ ЗДЕСЬ ВЫЛЕТАЕТ С ОШИБКОЙ
ПараметрADO.Value=Параметр.Значение;
КонецЦикла;

Может кто сталкивался с подобным... Очень похоже что на сервере приложений чего-то не хватает, т.к. через тестовый СП все отрабатывает нормально даже под Автопользователем, но вот что именно я никак не могу понять.
1 Courageous
 
09.06.12
12:08
up
2 shamannk
 
09.06.12
12:09
Автопользователем в рег.задании выполнение на сервере , там нет форм
3 Courageous
 
09.06.12
12:52
Да это понятно, просто в запрос передается не форма, а объект, и идет рассчет. Вся проблема в том - что код впринципе рабочий на одном сервере, а на другом уже не хочет. Попробовал переписать работу с параметрами на
   Команда.Parameters.Refresh();    
   Для Каждого Параметр Из Параметры Цикл    
       Ном = Ном+1;
       Команда.Parameters.Item(Ном).Value = Параметр.Значение;
   КонецЦикла;    
Все работает, пока запрос простенький... как только идет запрос с объединением (UNION ALL) то refresh() отрабатывает с ошибкой, а если точнее, то при создании Команды он не определяет что в запросе есть параметры...
4 Courageous
 
09.06.12
12:56
ну т.е. когда передаю запрос:

SELECT  SUM(_AccntReg10196._Fld10220) as OborotPeriod
FROM         _AccntReg10196  INNER JOIN
                     _Reference119 ON _AccntReg10196._Fld10197RRef = _Reference119._IDRRef INNER JOIN
                     _Reference126 ON _AccntReg10196._Fld10198RRef = _Reference126._IDRRef INNER JOIN
                     _Acc10 ON _AccntReg10196._AccountRRef = _Acc10._IDRRef INNER JOIN
                     _Enum536 ON _AccntReg10196._Fld10218RRef =_Enum536._IDRRef INNER JOIN
                     _Reference178 ON _AccntReg10196._Fld10217RRef = _Reference178._IDRRef INNER JOIN
                     _Reference144 ON _AccntReg10196._Fld10216RRef = _Reference144._IDRRef INNER JOIN
                     _Reference54 ON _AccntReg10196._Fld10201_RRRef = _Reference54._IDRRef INNER JOIN
                     _Reference143 ON _AccntReg10196._Fld10202_RRRef = _Reference143._IDRRef
WHERE     (_Acc10._Description = 'Контроль ДС'  ) AND (_Reference119._Description = 'Месячный план для утверждения'
)
AND _AccntReg10196._Period >= CONVERT(DATETIME, '2012-06-01 00:00:00', 102)
AND _AccntReg10196._Period <= CONVERT(DATETIME, '2012-06-30 23:59:59', 102)
AND _AccntReg10196._Correspond='0'
AND _Reference126._Description= ?
AND _Reference178._Description= ?
AND _Reference144._Code<>'00001'
AND _Reference144._Code<>'00079'
AND _Reference54._Description=?
AND _Reference143._Description=?
AND (_AccntReg10196._Active <> 0x00)

все отрабатывает, а если более сложный, то уже нет:


SELECT SUM(OBOROT)as OborotPeriod from
(SELECT  SUM(_AccntReg10196._Fld10220) AS OBOROT
FROM         _AccntReg10196  INNER JOIN
                     _Reference119 ON _AccntReg10196._Fld10197RRef = _Reference119._IDRRef INNER JOIN
                     _Reference126 ON _AccntReg10196._Fld10198RRef = _Reference126._IDRRef INNER JOIN
                     _Acc10 ON _AccntReg10196._AccountRRef = _Acc10._IDRRef INNER JOIN
                     _Enum536 ON _AccntReg10196._Fld10218RRef =_Enum536._IDRRef INNER JOIN
                     _Reference178 ON _AccntReg10196._Fld10217RRef = _Reference178._IDRRef INNER JOIN
                     _Reference144 ON _AccntReg10196._Fld10216RRef = _Reference144._IDRRef INNER JOIN    
                     _Reference54 ON _AccntReg10196._Fld10201_RRRef = _Reference54._IDRRef INNER JOIN
                     _Reference143 ON _AccntReg10196._Fld10202_RRRef = _Reference143._IDRRef    
WHERE     (_Acc10._Description = 'Контроль ДС'  ) AND (_Reference119._Description = 'Факт'
OR _Reference119._Description = 'ДС_Подача Заявки на ДС'
OR _Reference119._Description = 'ДС_Подтверждение факта'
OR _Reference119._Description = 'ДС_Утверждение главным казначеем'
OR _Reference119._Description = 'ДС_Отложенные заявки'
OR _Reference119._Description = 'ДС_Резервирование'
)
AND _AccntReg10196._Period >= CONVERT(DATETIME, '2012-06-01 00:00:00', 102)
AND _AccntReg10196._Period <= CONVERT(DATETIME, '2012-06-30 23:59:59', 102)
AND _AccntReg10196._Correspond='0'
AND (_Enum536._EnumOrder= '9'
OR  _Enum536._EnumOrder= '8'
OR _Enum536._EnumOrder= '7'
OR  _Enum536._EnumOrder= '6')
AND _Reference178._Description= ?
AND _Reference144._Code<>'00001'
AND _Reference144._Code<>'00079'
AND (_AccntReg10196._Active <> 0x00)
UNION ALL
SELECT       -SUM(_AccntReg10196._Fld10220)
FROM         _AccntReg10196  INNER JOIN
                     _Reference119 ON _AccntReg10196._Fld10197RRef = _Reference119._IDRRef INNER JOIN
                     _Reference126 ON _AccntReg10196._Fld10198RRef = _Reference126._IDRRef INNER JOIN
                     _Acc10 ON _AccntReg10196._AccountRRef = _Acc10._IDRRef INNER JOIN
                     _Enum536 ON _AccntReg10196._Fld10218RRef =_Enum536._IDRRef INNER JOIN
                     _Reference178 ON _AccntReg10196._Fld10217RRef = _Reference178._IDRRef INNER JOIN
                     _Reference144 ON _AccntReg10196._Fld10216RRef = _Reference144._IDRRef INNER JOIN    
                     _Reference54 ON _AccntReg10196._Fld10201_RRRef = _Reference54._IDRRef INNER JOIN
                     _Reference143 ON _AccntReg10196._Fld10202_RRRef = _Reference143._IDRRef    
WHERE     (_Acc10._Description = 'Контроль ДС'  ) AND (_Reference119._Description = 'Факт'    
OR _Reference119._Description = 'ДС_Подача Заявки на ДС'
OR _Reference119._Description = 'ДС_Подтверждение факта'
OR _Reference119._Description = 'ДС_Утверждение главным казначеем'
OR _Reference119._Description = 'ДС_Отложенные заявки'
OR _Reference119._Description = 'ДС_Резервирование'
)
AND _AccntReg10196._Period >= CONVERT(DATETIME, '2012-06-01 00:00:00', 102)
AND _AccntReg10196._Period <= CONVERT(DATETIME, '2012-06-30 23:59:59', 102)
AND _AccntReg10196._Correspond='1'
AND (_Enum536._EnumOrder= '9'
OR  _Enum536._EnumOrder= '8'
OR _Enum536._EnumOrder= '7'
OR  _Enum536._EnumOrder= '6')
AND _Reference178._Description= ?
AND _Reference144._Code<>'00001'
AND _Reference144._Code<>'00079'
AND (_AccntReg10196._Active <> 0x00)
) f

Что именно ему не нравиться,я не понимаю....
5 sda553
 
09.06.12
12:59
а где в этом запросе параметры?
6 sda553
 
09.06.12
13:00
а...нашел
7 sda553
 
09.06.12
13:07
короче смотри, ситуация такая, та делать нельзя. Работая с ком объектами, можно работат только с примитивным типам. Передавать другой ком в функцию объекта в качестве параметра никак не удасться.
только строки, числа и т.п. фигня

Так что в данном случае тебе придется избавиться от параметра
8 sda553
 
09.06.12
13:08
обходной путь, заполняй параметры прямо в тексте sql
9 Courageous
 
09.06.12
14:12
Но вопрос в том, что он из приложения отрабатывает, а на сервере нет. Т.е. получается что на сервере придется параметры передавать в текст чтоли.
10 Courageous
 
09.06.12
14:14
Вот этот кусок текста
Команда=Новый COMОбъект("ADODB.Command");
Команда.ActiveConnection=Соединение;
Команда.CommandType=1;
Команда.CommandText=ТекстЗапроса;

после прохождения с простым запросом, в Команда.Parameters есть строки = числу параметров (1 или 4 - неважно), а если сложный запрос, то Команда.Parameters - пустая остается, как будто он не видит этих параметров.
11 Courageous
 
09.06.12
15:42
У меня все же подозрение что какая-то служба неработает на рабочем сервере, или нехватает каких либо разрешений, т.к. на тестовом все запускается...
12 Courageous
 
13.06.12
10:39
ап.
13 eduspec82
 
13.06.12
10:42
уж не мутабельна ли коллекция параметров :)
14 Courageous
 
13.06.12
10:46
это как :)  в параметры передаю текстовые либо числовые значения.
15 eduspec82
 
13.06.12
10:47
коллекция типа список значений мутабельна
16 Courageous
 
13.06.12
10:48
аааа, нет, параметры в ТЗ у меня, делаю ее обход, и приравниваю простые типы.