powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / [игнор отключен] [закрыт для гостей] / Выпольнить запрос SQL из 1С
78 сообщений из 78, показаны все 4 страниц
Выпольнить запрос SQL из 1С
    #35872353
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый.

Пытаюсь делать запросы SQL 2005 из 1С8.1
Дошел до вот такого.


Функция ЗапросSQL (SQLServer,Login,Password,ТекстSQL) //Функция выборки данных из SQL сервера и передача во временную таблицу 1С

СтрокаСоединения = (" Provider=SQLOLEDB.1;Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer +
(";UID=") + Login + ("; PWD=") + Password + (";");

СоединениеSQL = Новый ComObject("ADODB.Connection");
СоединениеSQL.ConnectionString=СтрокаСоединения;
Попытка
СоединениеSQL.Open();
Состояние ("Подключение к серверу SQL...");
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;

Состояние ("Выполнение запроса SQL...");
ЗаписиSQL = Новый ComObject("ADODB.RecordSet");
ЗаписиSQL.ActiveConnection = СоединениеSQL;
ЗаписиSQL = СоединениеSQL.Execute (ТекстSQL);
//ЗаписиSQL = СоединениеSQL.Open (ТекстSQL);

Таблица = Новый ТаблицаЗначений;
Состояние ("Заполнение временной таблицы...");
Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл //Создание и добавление колонок во временную таблицу
ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name;
Таблица.Колонки.Добавить(ИмяСтолбца);
Сообщить(ИмяСтолбца);
КонецЦикла;

Пока ЗаписиSQL.EOF=0 Цикл // Заполнение созданной таблицы

НоваяСтрока = Таблица.Добавить();
Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл
НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
//Сообщить ("Test " + ЗаписиSQL.Fields(ИмяСтолбца).Value + ИмяСтолбца);
КонецЦикла;

ЗаписиSQL.MoveNext();

КонецЦикла;

Состояние ("Закрываем соединение с SQL...");
ЗаписиSQL.Close();
СоединениеSQL.Close();

Возврат Таблица; // Возврат таблицы значений запроса SQL

КонецФункции


Эта функция в таком виде работает.
Данная функция выводит в виртуальную таблицу вот такой запрос SQL.
ТекстЗапросаSQL = ("select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы where Линия =1 and ДатаПриход between '") + Формат(НачалоПериода,"ДФ=ггггММдд") + ("' and '") + Формат(КонецПериода,"ДФ=ггггММдд") +("';");

Но как только пытаюсь в запросе SQL объявить переменные и присвоить им значения вот так:
ТекстЗапросаSQL = ("declare @n int
| set @n = 1
| select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы
| where Линия =1 and ДатаПриход between '") + Формат(НачалоПериода,"ДФ=ггггММдд") + ("' and '") + Формат(КонецПериода,"ДФ=ггггММдд") +("';");

Вываливается ошибка
Пока ЗаписиSQL.EOF=0 Цикл // Заполнение созданной таблицы
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.


На другом форуме нашел что метод при помощи которого я обращаюсь к SQL
ЗаписиSQL = СоединениеSQL.Execute (ТекстSQL);
Не подходит для такого запроса.

Помогите, какой метод нужно использовать или как правильно сделать.

Заранее большое спасибо.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35872451
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

В ADO параметризированные запросы не пишутся в тексте запроса. Используйте ADODB.Parameter .
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35872472
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо.

А можете поделится примитивным примером относительно 1С ?
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35872487
Господин ПЖ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на http://script-coding.info/ были
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35872530
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Там такого нет (((.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35872557
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

Я под восьмерку не писал пока еще, боюсь на вскидку не получится.
И кстати, а вам именно параметризированные запросы нужны? Или просто удобная форма записи запросов? Если второе - то смысл огород городить...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
ТекстЗапроса="
|select 
|  Поставщик, 
|  ИмяПоставщика, 
|  КодМаг, 
|  ДатаПриход, 
|  НомНакл, 
|  ДатаНакл 
|from 
|  ankStr..Приходы 
|where 
|  Линия =:Линия
|  and ДатаПриход between :НачалоПериода and :КонецПериода
|";

ТекстSQL=СтрЗаменить(ТекстЗапроса, ":Линия", "1");
ТекстSQL=СтрЗаменить(ТекстСкл, ":НачалоПериода", "'"+Формат(НачалоПериода,"ДФ=ггггММдд")+"'");
ТекстSQL=СтрЗаменить(ТекстСкл, ":КонецПериода", "'"+Формат(КонецПериода,"ДФ=ггггММдд")+"'");

ТаблицаЛиния1=ЗапросSQL(SQLServer,Login,Password,ТекстSQL);

ТекстSQL=СтрЗаменить(ТекстЗапроса, ":Линия", "2");
ТекстSQL=СтрЗаменить(ТекстСкл, ":НачалоПериода", "'"+Формат(НачалоПериода,"ДФ=ггггММдд")+"'");
ТекстSQL=СтрЗаменить(ТекстСкл, ":КонецПериода", "'"+Формат(КонецПериода,"ДФ=ггггММдд")+"'");

ТаблицаЛиния2=ЗапросSQL(SQLServer,Login,Password,ТекстSQL);
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35872656
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Красота ни при чем.

Нужен именно запрос с параметрами.

Если где на примерчик наткнетесь, киньте пожалуйста.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35872658
Господин ПЖ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_maxТам такого нет (((.

http://script-coding.info/ADO.html

чего там нет? Ctrl-C, Ctrl-V ?
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35872659
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тот пример что кинул, полный примитив, задумка более глобальнее.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35872696
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господин ПЖkharkov_maxТам такого нет (((.

http://script-coding.info/ADO.html

чего там нет? Ctrl-C, Ctrl-V ?

Да как бы там нет примерчика запроса с параметрами (((.
Возможно все описано, но примера я не увидел.

т.к. не великий знаток SQL и 1С, по данной статье мне очень тяжело сделать вывод как правильно поступить в моей ситуации. Вот и хочу где нить найти пример.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35872723
Reder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

Стоит поискать книжку Михайлова aka MAV. "1С:Предприятие 7.7/8.0 Системное программирование". А еще проще зайти на MSDN и почитать.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35872781
semyons
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможный вариант:

ado_cm = CreateObject("ADODB.Command");
ado_cm.ActiveConnection = obj_ADOConn;
ado_cm.CommandText = "select * from tbl where tbl.DelDate = :DelDate";

ado_cm.Parameters.Append(ado_cm.CreateParameter("DelDate", 7, 1, , Date('01.01.2009')));
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873232
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max.... Но как только пытаюсь в запросе SQL объявить переменные и присвоить им значения вот так:
ТекстЗапросаSQL = ("declare @n int
| set @n = 1
| select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы
| where Линия =1 and ДатаПриход between '") + Формат(НачалоПериода,"ДФ=ггггММдд") + ("' and '") + Формат(КонецПериода,"ДФ=ггггММдд") +("';");

Вываливается ошибка
Пока ЗаписиSQL.EOF=0 Цикл // Заполнение созданной таблицы
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.


На другом форуме нашел что метод при помощи которого я обращаюсь к SQL
ЗаписиSQL = СоединениеSQL.Execute (ТекстSQL);
Не подходит для такого запроса.

Помогите, какой метод нужно использовать или как правильно сделать.

Заранее большое спасибо.

К объектам ADODB обращаетесь правильно.
Посто запрос был выполнен, вернув несколько объектов типа Recordset.
Попробуйте изменить код:
Код: plaintext
1.
2.
3.
4.
Пока ЗаписиSQL.State= 0  цикл
  ЗаписиSQL = ЗаписиSQL.NextRecordset;
КонецЦикла;
// а уж потом
Пока ЗаписиSQL.EOF= 0  Цикл	// Заполнение созданной таблицы....
Вариант №2:
Вставьте в текст запроса в начало "Set nocount on"
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873338
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем огромное спасибо за помощь.

В данный момент делаю так:

СтрокаСоединения = ("Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer +
(";UID=") + Login + ("; PWD=") + Password + (";");

Подключение = Новый ComObject("ADODB.Connection");
Подключение.ConnectionString=СтрокаСоединения;
Попытка
Подключение.Open(СтрокаСоединения);
Состояние ("Подключение к серверу SQL...");
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;

СоединениеSQL = Новый COMObject("ADODB.Command");
СоединениеSQL.ActiveConnection = Подключение;
СоединениеSQL.NamedParameters = Истина;
СоединениеSQL.CommandType = 4;
Param = СоединениеSQL.CreateParameter("@n",3,1,9,1);
СоединениеSQL.Parameters.Append(Param);
//СоединениеSQL.Execute (ТекстSQL);

Состояние ("Выполнение запроса SQL...");
ЗаписиSQL = Новый ComObject("ADODB.RecordSet");
Сообщить (ТекстSQL);
ЗаписиSQL = СоединениеSQL.Execute (ТекстSQL);

Для запроса:

ТекстЗапросаSQL = ("select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы where Линия = @n and ДатаПриход between '") +
Формат(НачалоПериода,"ДФ=ггггММдд") + ("' and '") + Формат(КонецПериода,"ДФ=ггггММдд") +("';");

Получаю вот такую ошибку:

Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver]Ошибка синтаксиса или нарушение доступа
ЗаписиSQL = СоединениеSQL.Execute (ТекстSQL);
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver]Ошибка синтаксиса или нарушение доступа

Думаю что принцип реализации запроса с параметрами у меня верный, но где то есть бок.
Не пинайте сразу помогите разобраться.

Еще раз огромное спасибо за помощь.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873406
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

попробуйте так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
СоединениеSQL = Новый COMObject("ADODB.Command");
СоединениеSQL.ActiveConnection = Подключение;
СоединениеSQL.CommandText=ТекстSQL;
СоединениеSQL.CommandType =  4 ;
СоединениеSQL.Prepared=Истина;

СоединениеSQL.Parameters.Append(СоединениеSQL.CreateParameter("@n", 3 , 1 , 9 , 1 ));
ЗаписиSQL = СоединениеSQL.Execute();
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873416
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже нашел ошибку. Исправил:

Добавил - СоединениеSQL.CommandText = ТекстSQL;
Исправил - ЗаписиSQL = СоединениеSQL.Execute();
В запросе добавил - объявил переменную @n (declare @n int)

Вроде пробилось дальше, но результат запроса пустой, думаю что дело в

Param = СоединениеSQL.CreateParameter("@n",3,1,9,1);

Как правильно задать параметры переменной для целого числа ?
Подскажите для теста, хочу увидеть что больше нигде нет косяков, а потом буду дальше ковыряться ... с остальным.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873424
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Егоров Александрkharkov_max,

попробуйте так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
СоединениеSQL = Новый COMObject("ADODB.Command");
СоединениеSQL.ActiveConnection = Подключение;
СоединениеSQL.CommandText=ТекстSQL;
СоединениеSQL.CommandType =  4 ;
СоединениеSQL.Prepared=Истина;

СоединениеSQL.Parameters.Append(СоединениеSQL.CreateParameter("@n", 3 , 1 , 9 , 1 ));
ЗаписиSQL = СоединениеSQL.Execute();


Пока писал Вы ответили тоже самое )).
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873502
nicktcher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.1csql.ru/materials/articles/develop.html~bfd0f58f-25af-add2-6767-09a5bf664605
http://www.sql.ru/docs/mssql/adoandsql/index.shtml
ftp://ftp.asu.ru/incoming/Sofi/Data%20Base/ado1.htm
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873613
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

Главное чтобы заработало. :)
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873664
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не работает (((

Думаю что ошибки в параметрах

Есть такие:

Param1 = СоединениеSQL.CreateParameter("@n",3,1,1,1);
СоединениеSQL.Parameters.Append(Param1);

Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС",133,0,8,Формат(НачалоПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param2);

Param3 = СоединениеSQL.CreateParameter("@ДатаПриходаПо",133,0,8,Формат(НачалоПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param3);

Для такого запроса:

("declare @n
|declare @ДатаПриходаС
|declare @ДатаПриходаПо
|select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы
| where Линия = @n and ДатаПриход between @ДатаПриходаС and @ДатаПриходаПо");

Где не верно ?
При выполнении ошибка:
{Форма.Форма(106)}: Ошибка при вызове метода контекста (CreateParameter): Произошла исключительная ситуация (ADODB.Command): Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.
Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС",133,0,8,Формат(НачалоПериода,"ДФ=ггггММдд"));
по причине:
Произошла исключительная ситуация (ADODB.Command): Аргументы имеют неверный тип, выходят за пределы допустимого

Ругается на параметр даты, не могу понять в чем дело, вроде все верно описал ....
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873749
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СоединениеSQL = Новый COMObject("ADODB.Command");
СоединениеSQL.ActiveConnection = Подключение;
СоединениеSQL.CommandText=ТекстSQL;
СоединениеSQL.CommandType = 1; --- вот где проблема, имхо
СоединениеSQL.Prepared=Истина;

СоединениеSQL.Parameters.Append(СоединениеSQL.CreateParameter("@n",3,1,9,1));
ЗаписиSQL = СоединениеSQL.Execute();

И не надо в тексте SQL операторов declare - такой оператор tsql описывает переменные, а не параметры.
строка SQL будет выполняться через системную хранимую процедуру sp_executesql (см описание если интересны детали) .
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873796
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а что подскажете по ошибке в этой строке ?

Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС",133,0,8,Формат(НачалоПериода,"ДФ=ггггММдд"));
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873814
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_maxа что подскажете по ошибке в этой строке ?

Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС",133,0,8,Формат(НачалоПериода,"ДФ=ггггММдд"));
Попробуйте
Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС",200,1,8,Формат(НачалоПериода,"ДФ=ггггММдд"));
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873859
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, по параметрам прошло.

Что за параметр 200 ? Если есть ссылка на эти параметры киньте плиз, почитаю.

Дальше ошибка

{Форма.Форма(113)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server]Необходимо объявить скалярную переменную "@n".
ЗаписиSQL = СоединениеSQL.Execute();
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC SQL Server Driver][SQL Server

Настройки пока в таком состоянии
СоединениеSQL.CommandType = 1;
СоединениеSQL.Prepared = Истина;

Param1 = СоединениеSQL.CreateParameter("@n",3,1,1,1);
СоединениеSQL.Parameters.Append(Param1);

Запрос вот:

("select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы
| where Линия = @n and ДатаПриход between @ДатаПриходаС and @ДатаПриходаПо");

Если я создал параметры, почему их не видит запрос ?
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873876
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если переменные объявляю:
declare @n int
declare @ДатаПриходаС datetime
declare @ДатаПриходаПо datetime

То запрос проходит, выводит столбцы, но строк нет т.е. не выбирает данные.

Пока ЗаписиSQL.EOF = 0 Цикл // Заполнение созданной таблицы

НоваяСтрока = Таблица.Добавить();
Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл
НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
Сообщить ("Test " + ЗаписиSQL.Fields(ИмяСтолбца).Value + ИмяСтолбца);
КонецЦикла;

ЗаписиSQL.MoveNext();

КонецЦикла;

По этому циклу пусто ....
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873973
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю вывод что параметры просто не передаются для моего запроса, т.к. таблица есть а данных нет.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35873977
semyons
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Параметры в запросе вроде указываются как :param, а не как @param. Соответственно, при создании параметра нужно указывать его имя "param".
Не знаю, можно ли в MS SQL использовать неименованные параметры, а в Oracle можно указать вместо имени параметра "?"
И добавлять параметры в том порядке, как они следуют в запросе
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874090
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
semyonsПараметры в запросе вроде указываются как :param, а не как @param. Соответственно, при создании параметра нужно указывать его имя "param".
Не знаю, можно ли в MS SQL использовать неименованные параметры, а в Oracle можно указать вместо имени параметра "?"
И добавлять параметры в том порядке, как они следуют в запросе

Похоже действительно запрос должен выглядеть вот так:
select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы
where Линия = :n and ДатаПриход between :ДатаПриходаС and :ДатаПриходаПо

Т.е. параметры должны идти не через @ а через :
После выполнения запроса в таком виде, начало ругаться на неизвестный параметр.
Вот как теперь мои параметры туда передать .....

Народ помогите пожалуйста, вижу что осталось чуть чуть до решения.
Вот вся функция:

Функция ЗапросSQL (SQLServer,Login,Password,ТекстSQL) //Функция выборки данных из SQL сервера и передача во временную таблицу 1С

СтрокаСоединения = ("Provider=SQLOLEDB;Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer +
(";UID=") + Login + ("; PWD=") + Password + (";");

Подключение = Новый ComObject("ADODB.Connection");
Подключение.ConnectionString=СтрокаСоединения;
Попытка
Подключение.Open(СтрокаСоединения);
Состояние ("Подключение к серверу SQL...");
Исключение
Сообщить(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;

СоединениеSQL = Новый COMObject("ADODB.Command");
СоединениеSQL.ActiveConnection = Подключение;
СоединениеSQL.NamedParameters = Истина;
СоединениеSQL.CommandText = ТекстSQL;
СоединениеSQL.CommandType = 1;
//СоединениеSQL.Prepared = Истина;

Param1 = СоединениеSQL.CreateParameter("n",3,1,1,1);
СоединениеSQL.Parameters.Append(Param1);

Param2 = СоединениеSQL.CreateParameter("ДатаПриходаС",200,1,8,Формат(НачалоПериода,"ДФ=ггггММдд"));//Формат(НачалоПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param2);

Param3 = СоединениеSQL.CreateParameter("ДатаПриходаПо",200,1,8,Формат(КонецПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param3);
//Сообщить (Param3.Value);

Состояние ("Выполнение запроса SQL...");
ЗаписиSQL = Новый ComObject("ADODB.RecordSet");

ЗаписиSQL = СоединениеSQL.Execute();

Таблица = Новый ТаблицаЗначений;
Состояние ("Заполнение временной таблицы...");
Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл //Создание и добавление колонок во временную таблицу
ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name;
Таблица.Колонки.Добавить(ИмяСтолбца);
Сообщить(ИмяСтолбца);
КонецЦикла;

Сообщить (ЗаписиSQL.EOF);

Пока ЗаписиSQL.EOF = 0 Цикл // Заполнение созданной таблицы

НоваяСтрока = Таблица.Добавить();
Для НомерСтолбца = 0 По ЗаписиSQL.Fields.Count-1 Цикл
НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
Сообщить ("Test " + ЗаписиSQL.Fields(ИмяСтолбца).Value + ИмяСтолбца);
КонецЦикла;

ЗаписиSQL.MoveNext();

КонецЦикла;

Состояние ("Закрываем соединение с SQL...");
ЗаписиSQL.Close();
Подключение.Close();

Возврат Таблица; // Возврат таблицы значений запроса SQL
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874117
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СоединениеSQL.Parameters.Count говорит что параметров 0. (((
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874258
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уфф... Вот так должно получиться - я проверял:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
СоединениеSQL = Новый COMObject("ADODB.Command");
СоединениеSQL.ActiveConnection = Подключение;
СоединениеSQL.CommandText = "sp_executesql"
СоединениеSQL.CommandType =  4 ;
ТекстЗапроса="select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы 
where Линия = @n and ДатаПриход between @ДатаПриходаС and @ДатаПриходаПо"
ПараметыЗапроса="@n int,@ДатаПриходаС datetime,@ДатаПриходаПо datetime"

ParamSqlText=СоединениеSQL.CreateParameter(, 130 , 1 , 5000 ,ТекстЗапроса)
СоединениеSQL.Parameters.Append(ParamSqlText);

ParamParamText=СоединениеSQL.CreateParameter(, 130 , 1 , 5000 ,ПараметыЗапроса)
СоединениеSQL.Parameters.Append(ParamParamText);

Param1 = СоединениеSQL.CreateParameter("@n", 3 , 1 , 1 , 1 );
СоединениеSQL.Parameters.Append(Param1);

Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС", 200 , 1 , 8 ,Формат(НачалоПериода,"ДФ=ггггММдд"));//Формат(НачалоПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param2);

Param3 = СоединениеSQL.CreateParameter("@ДатаПриходаПо", 200 , 1 , 8 ,Формат(КонецПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param3);

Оригинальный текст моей программы VBA Accces:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  Dim cmd As ADODB.Command
  Dim Rs As ADODB.Recordset
  Dim CmdStr As String
  Dim CmdPar As String
  Set cmd = New ADODB.Command
  Set cmd.ActiveConnection = CurrentProject.Connection
  cmd.CommandText = "sp_executesql"
  cmd.Prepared = True
  cmd.CommandType =  4 
  CmdStr = "select * from dbo.Журнал where Дата between @D1 and @D2"
  CmdPar = "@D1 datetime,@D2 datetime"
  cmd.Parameters.Append cmd.CreateParameter(, adWChar, adParamInput,  5000 , CmdStr)
  cmd.Parameters.Append cmd.CreateParameter(, adWChar, adParamInput,  5000 , CmdPar)
  cmd.Parameters.Append cmd.CreateParameter("@D1", adChar, adParamInput,  8 , "20070101")
  cmd.Parameters.Append cmd.CreateParameter("@D2", adChar, adParamInput,  8 , "20070101")
  Set Rs = cmd.Execute
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874285
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, не досмотрел - чего это у вас у типа int длина 1?
Param1 = СоединениеSQL.CreateParameter("@n",3,1, 4 ,1);
СоединениеSQL.Parameters.Append(Param1);
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874329
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VladimirKrУфф... Вот так должно получиться - я проверял:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
СоединениеSQL = Новый COMObject("ADODB.Command");
СоединениеSQL.ActiveConnection = Подключение;
СоединениеSQL.CommandText = "sp_executesql"
СоединениеSQL.CommandType =  4 ;
ТекстЗапроса="select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы 
where Линия = @n and ДатаПриход between @ДатаПриходаС and @ДатаПриходаПо"
ПараметыЗапроса="@n int,@ДатаПриходаС datetime,@ДатаПриходаПо datetime"

ParamSqlText=СоединениеSQL.CreateParameter(, 130 , 1 , 5000 ,ТекстЗапроса)
СоединениеSQL.Parameters.Append(ParamSqlText);

ParamParamText=СоединениеSQL.CreateParameter(, 130 , 1 , 5000 ,ПараметыЗапроса)
СоединениеSQL.Parameters.Append(ParamParamText);

Param1 = СоединениеSQL.CreateParameter("@n", 3 , 1 , 1 , 1 );
СоединениеSQL.Parameters.Append(Param1);

Param2 = СоединениеSQL.CreateParameter("@ДатаПриходаС", 200 , 1 , 8 ,Формат(НачалоПериода,"ДФ=ггггММдд"));//Формат(НачалоПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param2);

Param3 = СоединениеSQL.CreateParameter("@ДатаПриходаПо", 200 , 1 , 8 ,Формат(КонецПериода,"ДФ=ггггММдд"));
СоединениеSQL.Parameters.Append(Param3);

Оригинальный текст моей программы VBA Accces:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  Dim cmd As ADODB.Command
  Dim Rs As ADODB.Recordset
  Dim CmdStr As String
  Dim CmdPar As String
  Set cmd = New ADODB.Command
  Set cmd.ActiveConnection = CurrentProject.Connection
  cmd.CommandText = "sp_executesql"
  cmd.Prepared = True
  cmd.CommandType =  4 
  CmdStr = "select * from dbo.Журнал where Дата between @D1 and @D2"
  CmdPar = "@D1 datetime,@D2 datetime"
  cmd.Parameters.Append cmd.CreateParameter(, adWChar, adParamInput,  5000 , CmdStr)
  cmd.Parameters.Append cmd.CreateParameter(, adWChar, adParamInput,  5000 , CmdPar)
  cmd.Parameters.Append cmd.CreateParameter("@D1", adChar, adParamInput,  8 , "20070101")
  cmd.Parameters.Append cmd.CreateParameter("@D2", adChar, adParamInput,  8 , "20070101")
  Set Rs = cmd.Execute


Да действительно работает ...
Уважаемый подскажите пожалуйста почему Вы
ТекстЗапроса="select Поставщик, ИмяПоставщика, КодМаг, ДатаПриход, НомНакл, ДатаНакл from ankStr..Приходы
where Линия = @n and ДатаПриход between @ДатаПриходаС and @ДатаПриходаПо"
ПараметыЗапроса="@n int,@ДатаПриходаС datetime,@ДатаПриходаПо datetime"

ParamSqlText=СоединениеSQL.CreateParameter(,130,1,5000,ТекстЗапроса)
СоединениеSQL.Parameters.Append(ParamSqlText);

ParamParamText=СоединениеSQL.CreateParameter(,130,1,5000,ПараметыЗапроса)
СоединениеSQL.Parameters.Append(ParamParamText);

Добавили в параметры.
Я пол инета перерыл нигде такого не встречал, и в описании нигде нет, если у Вас есть инфа по этому поводу поделитесь пожалуйста.

За запрос огромное спасибо.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874360
semyons
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык он использует выполнение хранимой процедуры sp_executesql, в параметры которой передаются текст запроса, список параметров и параметры.
Эта хранимка возвращает набор записей.
Кстати, не пробывали в CommandType передавать 2 вместо 1?
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874362
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что исследование профайлером показало, что выполнить запрос напрямую с передачей параметров через ADO не получается. Но есть хранимая процедура sp_executesql (См. БОЛ на соседнем форуме). Эта хранимая процедура выполняет tsql текст с параметрами, имея первым параметром строку с tsql текстом,
вторым параметром - строку описания параметров, используемых в тексте, и далее параметры для строки sql-текста. Этакий аналог временной хранимой процедуры.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874372
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ огромное спасибо.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35874381
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
semyons... Кстати, не пробывали в CommandType передавать 2 вместо 1?
Не прокатит. 2 - Это же чтение таблицы напрямую (ADО просто подставит select * from ) к началу текста запроса и попробует выполнить - ну и получит ошибку.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35875972
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый.
Хочу продолжить данную тему ибо опять наткнулся на проблему.
Предыдущий запрос был тестовым, а вот с настоящим:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
if object_id('tempdb..#temp_НомераПриходов') >  0  drop table #temp_НомераПриходов
create table #temp_НомераПриходов (Приход int)

-- выбираем во временную таблицу номера приходов,
-- которые в дальнейшем будем выгружать в 1С
insert into #temp_НомераПриходов (Приход)
select Приход from ankStr..Приходы where 
                        Поставщик = @Поставщик 
                        -- приход от стороннего поставщика
                        and Линия =  1 
                        and ДатаПриход between @ДатаПриходС and @ДатаПриходПо
                        order by Приход

-- выводим шапки приходных накладных
select Приход, Поставщик, ИмяПоставщика, ПрихСумма, ПрихТара, ДатаПриход, РасхТран, РасхДоп, КодМаг, НомНакл, ДатаНакл, НомерСФ, ДатаСФ, НН, Примечание from ankStr..Приходы where Приход in (select * from #temp_НомераПриходов)

Как-то не сростается, моя ошибка в принципе по которому я запрашиваю данные, вот где не могу найти. 
 Спецы уделите мне пожалуйста чуть своего драгоценного времени и подскажите где я делаю не так.
В запросе есть  3  переменные:
@Поставщик int
@ДатаПриходС datetime
@ДатаПриходПо datetime

Я их добавил в Переменные запроса.

            order by Приход

-- выводим табличные части свернутые по ставке НДС
select Приход, sum(ФактШт) as ФактШт, sum(ФактШт*ЦенаПА) as Стоимость, НДС from ankStr..ТоварыПриходов where 
            Приход in (select * from #temp_НомераПриходов)
            -- не учитываем тару (информация о сумме тары идет в шапке приходной накладной)
            and ТараФл =  0 
            group by Приход, НДС
            order by Приход
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35875979
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На нижнюю часть сообщения не обращайте внимание, случайно попало ...
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876032
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

Если я правильно понял вы пытаетесь выполнить несколько команд tsql на одном вызове Execute(). АДО так не работает. Одна команда tsql - один execute. в вашем случае

Код: plaintext
1.
2.
3.
СоединениеSQL.Execute("if object_id... ");
СоединениеSQL.Execute("create table... ");
СоединениеSQL.Execute("insert into... ");
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876043
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще похоже что вам лучше обернуть все в хранимку, возващающей рекордсет. Тогда ваш первоначальный запрос сведется к "exec MyProc1 @in, @ДатаПриходаС, @ДатаПриходаПо";
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876068
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Т.е. в параметрах СоединениеSQL.Execute (""), мне нужно указать Код SQL моего запроса ?
Я вас правильно понял ?

2. А если у меня запросы связаны. Т.е. Результат 2го это данные 1го, а результат 3го это результат 2го.

Я сделаю так

СоединениеSQL.Execute(1й, запрос)
СоединениеSQL.Execute(2й, запрос)
СоединениеSQL.Execute(3й, запрос)

у меня будет результат 3го запроса ?

3. Если до select у меня есть код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
if object_id('tempdb..#temp_НомераПриходов') >  0  drop table #temp_НомераПриходов
						|create table #temp_НомераПриходов (Приход int)
                        |insert into #temp_НомераПриходов (Приход)
						|select Приход from ankStr..Приходы where 
                        |Поставщик = @Поставщик 
                        |and Линия = @Линия
                        |and ДатаПриход between @ДатаПриходС and @ДатаПриходПо
                        |order by Приход


Мой запрос отработает ?

Заранее спасибо.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876246
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мда..
Я не разобравшись в предыдущем сообщении написал чушь...

Не могда бы мне кинуть кусок кода, как можно использовать хранимую процедуру ?
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876604
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разобрался, получилось вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
Функция ЗапросSQL (SQLServer,Login,Password,txtSQL)   //Функция выборки данных из SQL сервера и передача во временную таблицу 1С
	
	СтрокаСоединения = ("Provider=SQLOLEDB;Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer + 
					(";UID=") + Login + ("; PWD=") + Password + (";");
		              
    Подключение = Новый ComObject("ADODB.Connection");
	Подключение.ConnectionString=СтрокаСоединения;
	// Подключение.Mode =  3 ;
		Попытка
			Подключение.Open(СтрокаСоединения);
			Состояние ("Подключение к серверу SQL...");
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат Ложь;
		КонецПопытки;
		
	
	СоединениеSQL = Новый COMObject("ADODB.Command");
	СоединениеSQL.ActiveConnection = Подключение;
	СоединениеSQL.CommandType =  4 ; 
	СоединениеSQL.NamedParameters = True;
	// СоединениеSQL.CommandText = ("sp_executesql");  	// Запуск для select 
	СоединениеSQL.CommandText = (txtSQL[ 0 ][ 0 ]);  		// Имя хранимой процедуры на сервере 	
		
	Для i =  1  По txtSQL.Количество()- 1  Цикл  			// Заполняем запрос SQL переменными
		//Сообщить (txtSQL[i][ 0 ]+" "+txtSQL[i][ 1 ]+ " "+ txtSQL[i][ 2 ]+" "+txtSQL[i][ 3 ]+ " "+ txtSQL[i][ 4 ]);  // Тестовая срока
		СоединениеSQL.Parameters.Append(СоединениеSQL.CreateParameter(txtSQL[i][ 0 ],txtSQL[i][ 1 ],txtSQL[i][ 2 ],txtSQL[i][ 3 ],txtSQL[i][ 4 ])); 
	КонецЦикла;
		
	Состояние ("Выполнение запроса SQL...");
	ЗаписиSQL = Новый ComObject("ADODB.RecordSet");
	ЗаписиSQL = СоединениеSQL.Execute();
				
	Таблица = Новый ТаблицаЗначений;
	Состояние ("Заполнение временной таблицы...");
	Состояние (ЗаписиSQL.Fields.Count);
	Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл 		//Создание и добавление колонок во временную таблицу
		ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name; 
		Таблица.Колонки.Добавить(ИмяСтолбца);
		Сообщить(ИмяСтолбца);
	КонецЦикла;
	
	Сообщить (ЗаписиSQL.Fields.Count());
	Пока ЗаписиSQL.EOF[ 0 ] =  0  Цикл								// Заполнение созданной таблицы
		
		НоваяСтрока =  Таблица.Добавить();
		Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл
			НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
			Сообщить ("Test " + ЗаписиSQL.Fields(ИмяСтолбца).Value + ИмяСтолбца);
		КонецЦикла;
								
		ЗаписиSQL.MoveNext();
		
	КонецЦикла;
	
	Состояние ("Закрываем соединение с SQL...");
    ЗаписиSQL.Close();
	Подключение.Close();
	
	Возврат Таблица;   // Возврат таблицы значений запроса SQL
	
КонецФункции

Но наткнулся на след проблему.
Результат хранимой процедуры есть 2 таблицы.
На данный момент я вычитываю столбцы первой, но не могу прочитать данные
Т.е.
Код: plaintext
1.
Пока ЗаписиSQL.EOF[ 0 ] =  0  Цикл

Не отрабатывает.
Подскажите пожалуйста как правильно обращаться к результату запроса если запрос выдает несколько таблиц ?
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876840
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ ну помогите кто нить.

Убрал из хранимой процедуры 2ю таблицу.

На выходе есть колонки но нет данных Recordset.
В SQL хранимка трабатывает с данными.

Где то я с RecordSet не докрутил....
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35876961
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

Давайте так (если я ошибаюсь - поправьте). Вам надо в 1С получить некий набор данных, который суть импорт данных из другой системы. При этом набор данных полчуается не "прямой выборкой", а результат некоей обработки "первичных" данных по некоему алгоритму, который от структуры и значений данных, хранящихся в 1С, не зависят. Собственно вам тогда лучше сделать процедуру непосредственно на сервере (содержащую те самые create table, insert...into и результирующий select), которая подготавливает полностью данные в том виде, который требуется вам получить в 1С. Из 1Са вам достаточно будет вызвать эту процедуру с необходимымми параметрами. Весь код процедуры будет "внутри" сервера, и в 1С вам не надо будет заморачиваться с вызовом каждой команды через АДО. И код этой процедуры нет необходимости писать в 1С - для этого есть более эффективные инструменты.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877069
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уже так и сделал.
Подключил свою обработку к хранимой процедуре на сервере. Т.е. кода SQL уже в 1С нет.
Смог подключится к серверу из хранимки мне сейчас в 1С передаются колонки моей выборки.
А данных (наполнения) нет.

Я делю вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
СтрокаСоединения = ("Provider=SQLOLEDB;Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer + 
					(";UID=") + Login + ("; PWD=") + Password + (";");
		              
    Подключение = Новый ComObject("ADODB.Connection");
	Подключение.ConnectionString=СтрокаСоединения;
	// Подключение.Mode =  3 ;
		Попытка
			Подключение.Open(СтрокаСоединения);
			Состояние ("Подключение к серверу SQL...");
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат Ложь;
		КонецПопытки;
		
	
	СоединениеSQL = Новый COMObject("ADODB.Command");
	СоединениеSQL.ActiveConnection = Подключение;
	СоединениеSQL.CommandType =  4 ; 
	СоединениеSQL.NamedParameters = True;
	//СоединениеSQL.CommandText = ("sp_executesql");  	// Запуск для select 
	СоединениеSQL.CommandText = (txtSQL[ 0 ][ 0 ], @);  		// Имя хранимой процедуры на сервере 	
		
	Для i =  1  По txtSQL.Количество()- 1  Цикл  			// Заполняем запрос SQL переменными
		Сообщить (txtSQL[i][ 0 ]+" "+txtSQL[i][ 1 ]+ " "+ txtSQL[i][ 2 ]+" "+txtSQL[i][ 3 ]+ " "+ txtSQL[i][ 4 ]);  // Тестовая срока
		СоединениеSQL.Parameters.Append(СоединениеSQL.CreateParameter(txtSQL[i][ 0 ],txtSQL[i][ 1 ],txtSQL[i][ 2 ],txtSQL[i][ 3 ],txtSQL[i][ 4 ])); 
	КонецЦикла;
		
	Состояние ("Выполнение запроса SQL...");
	
	ЗаписиSQL = Новый ComObject("ADODB.RecordSet");
	
	ЗаписиSQL = СоединениеSQL.Execute();
	
				
	Таблица = Новый ТаблицаЗначений;
	Состояние ("Заполнение временной таблицы...");
		
	Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл 		//Создание и добавление колонок во временную таблицу
		ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name; 
		Таблица.Колонки.Добавить(ИмяСтолбца);
		Сообщить(ИмяСтолбца);
	КонецЦикла;
		
	Пока ЗаписиSQL.EOF  =  0  Цикл								// Заполнение созданной таблицы
		
		НоваяСтрока =  Таблица.Добавить();
		Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл
			НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
			Сообщить ("Test " + ЗаписиSQL.Fields(ИмяСтолбца).Value + ИмяСтолбца);
		КонецЦикла;
								
		ЗаписиSQL.MoveNext();
		
	КонецЦикла;


Подскажите что я делаю не верно.

Как я понимаю нужно делать так (при использовании хранимых процедур):
1. Создать соединение ComObject("ADODB.Connection")
2. Создать COMObject("ADODB.Command") и добавить мои переменные
.Parameters.Append(СоединениеSQL.CreateParameter
3. Потом ComObject("ADODB.RecordSet")
и в цикле выбирать данные из Recordset.

Вот вроде все сделал, но не работает, где то ошибся ... (((
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877076
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Этому не пугайтесь:
Код: plaintext
1.
2.
3.
4.
5.
6.
СоединениеSQL.CommandText = (txtSQL[ 0 ][ 0 ]);  		// Имя хранимой процедуры на сервере 	
		
	Для i =  1  По txtSQL.Количество()- 1  Цикл  			// Заполняем запрос SQL переменными
		Сообщить (txtSQL[i][ 0 ]+" "+txtSQL[i][ 1 ]+ " "+ txtSQL[i][ 2 ]+" "+txtSQL[i][ 3 ]+ " "+ txtSQL[i][ 4 ]);  // Тестовая срока
		СоединениеSQL.Parameters.Append(СоединениеSQL.CreateParameter(txtSQL[i][ 0 ],txtSQL[i][ 1 ],txtSQL[i][ 2 ],txtSQL[i][ 3 ],txtSQL[i][ 4 ])); 


Это значения переменных которые необходимы SQL запросу и которые выбираются из массива.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877088
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Плюс паралельный вопрос.
Если хранимая процедура делает выборку 2х таблиц, как правильно через ADO, к ним обращаться и выбирать данные.

Заранее спасибо.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877114
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Скорее всего нет данных потому, что имя процедуры я передаю и запускаю верно, а параметры передаю не верно.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877216
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,


Для нескольких рекордсетов вам уже ответили. С хранимкой надобность в выполнении именно параметризированого запроса отпадает, так как параметры можно указать прямо в тескте запроса, выигрыша от использования sp_executesql уже не будет.

Дабы не молоть чепуху, покажите код вашей процедуры, или хотя бы заголовок с парметрами (от "create procedure" до "as")
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877549
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Егоров Александрkharkov_max,
Для нескольких рекордсетов вам уже ответили....

+1

Вообще, при ADODB чтении выходных данных из процедуры нужно иметь ввиду следующее:
Любая строчка информацонного сообщения порождает закрытый рекордсет (ЗаписиSQL.State=0)
для каждого select в теле ХП возвращается свой рекордсет.
все рекордсеты можно получить методом NextRecordset
В вашем случае лучше всего оформить процедуру так:

Код: plaintext
Create Proc MyProc(...)\nas\nbegin\n  set nocount on -- давим информационные сообщения (не совсем так, но для данного случая)\n  что-то делаем;\n  select данные1\n  ...\n  select данныеN\nend

При чтении делаем следующее:
Код: plaintext
...\n//в вашем случае при set nocout on не будет неоткрытых рекордсетов\n\nЗаписиSQL = СоединениеSQL.Execute();  //читаем результат первого select (данные  1 )\nЗаписиSQL=Записи.NextRecordset(); // читаем результат второго select (данные  2 )
после последнего select метод NextRecordset выдаст ошибку
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877585
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно Вы меня не так поняли.

У меня есть хранимая процедура, в которую я из 1С должен передать данные.
Запускаю в SQL ее вот в таком виде:
exec ЕЕ.dbo.ПН 333,'20090301','20090314'
и она дает результат.

Теперь мне необходимо из 1С обратится к ней со своими переменными не (333,'20090301','20090314' ), а какими нибудь другими...

Т.е. я из 1С должен влиять на результат выполнения хранимой процедуры своими данными 1С.
В данных момент, как я понимаю, я процедуру запускаю, но в нее не передаются параметры, поэтому у меня наименования столбцов есть, а данных нет.

Если вот это:
Код: plaintext
1.
2.
3.
4.
5.
Для i =  1  По txtSQL.Количество()- 1  Цикл  			// Заполняем запрос SQL переменными
		Сообщить (txtSQL[i][ 0 ]+" "+txtSQL[i][ 1 ]+ " "+ txtSQL[i][ 2 ]+" "+txtSQL[i][ 3 ]+ " "+ txtSQL[i][ 4 ]);  // Тестовая срока
		СоединениеSQL.Parameters.Append(СоединениеSQL.CreateParameter(txtSQL[i][ 0 ],txtSQL[i][ 1 ],txtSQL[i][ 2 ],txtSQL[i][ 3 ],txtSQL[i][ 4 ])); 
	КонецЦикла;


не верно, я уберу, только вот вопрос как тогда передать мои параметры в хранимку ?
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877595
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Егоров Александрkharkov_max,


Для нескольких рекордсетов вам уже ответили. С хранимкой надобность в выполнении именно параметризированого запроса отпадает, так как параметры можно указать прямо в тескте запроса, выигрыша от использования sp_executesql уже не будет.

Дабы не молоть чепуху, покажите код вашей процедуры, или хотя бы заголовок с парметрами (от "create procedure" до "as")

Код: plaintext
\nUSE [eee]\nGO\n\nSET ANSI_NULLS ON\nGO\nSET QUOTED_IDENTIFIER ON\nGO\nALTER PROCEDURE [dbo].[ПН] \n\t\t@Поставщик int,\n\t\t@ДатаПриходС datetime,\n\t\t@ДатаПриходПо datetime\nAS\n
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877799
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел ошибку....

Для упрощения проверки работы обработки, вставил период за который не было документов, соответственно мне поля выводило а данные нет. ))

Извините что по этому поводу вам голову морочил.
В данный момент процедура имеет такой вид:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
Функция ЗапросSQL (SQLServer,Login,Password,txtSQL)   //Функция выборки данных из SQL сервера и передача во временную таблицу 1С
	
	СтрокаСоединения = ("Provider=SQLOLEDB;Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer + 
					(";UID=") + Login + ("; PWD=") + Password + (";");
		              
    Подключение = Новый ComObject("ADODB.Connection");
	Подключение.ConnectionString=СтрокаСоединения;
	// Подключение.Mode =  3 ;
		Попытка
			Подключение.Open(СтрокаСоединения);
			Состояние ("Подключение к серверу SQL...");
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат Ложь;
		КонецПопытки;
		
	
	СоединениеSQL = Новый COMObject("ADODB.Command");
	СоединениеSQL.ActiveConnection = Подключение;
	СоединениеSQL.CommandType =  4 ; 
	СоединениеSQL.NamedParameters = True;
	//СоединениеSQL.CommandText = ("sp_executesql");  	// Запуск для select 
	СоединениеSQL.CommandText = (txtSQL[ 0 ][ 0 ]);  		// Имя хранимой процедуры на сервере 	
		
	Для i =  1  По txtSQL.Количество()- 1  Цикл  			// Заполняем запрос SQL переменными
		//Сообщить (txtSQL[i][ 0 ]+" "+txtSQL[i][ 1 ]+ " "+ txtSQL[i][ 2 ]+" "+txtSQL[i][ 3 ]+ " "+ txtSQL[i][ 4 ]);  // Тестовая срока
		СоединениеSQL.Parameters.Append(СоединениеSQL.CreateParameter(txtSQL[i][ 0 ],txtSQL[i][ 1 ],txtSQL[i][ 2 ],txtSQL[i][ 3 ],txtSQL[i][ 4 ])); 
	КонецЦикла;
		
	Состояние ("Выполнение запроса SQL...");
	ЗаписиSQL = Новый ComObject("ADODB.RecordSet");
	ЗаписиSQL = СоединениеSQL.Execute();
				
	Таблица = Новый ТаблицаЗначений;
	Состояние ("Заполнение временной таблицы...");
		
	Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл 		//Создание и добавление колонок во временную таблицу
		ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name; 
		Таблица.Колонки.Добавить(ИмяСтолбца);
		//Сообщить(ИмяСтолбца);
	КонецЦикла;
	
	Если ЗаписиSQL.EOF = Ложь Тогда
		
		Пока ЗаписиSQL.EOF  =  0  Цикл								// Заполнение созданной таблицы
		
			НоваяСтрока =  Таблица.Добавить();
			Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл
				НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
				//Сообщить ("Test " + ЗаписиSQL.Fields(ИмяСтолбца).Value + ИмяСтолбца);
			КонецЦикла;
								
			ЗаписиSQL.MoveNext();
		КонецЦикла;
		
		Состояние ("Закрываем соединение с SQL...");
	    ЗаписиSQL.Close();
		Подключение.Close();
	   	Возврат Таблица;   // Возврат таблицы значений запроса SQL

	Иначе
		
		Сообщить ("Нет Данных для обработки....");
		Состояние ("Закрываем соединение с SQL...");
	    ЗаписиSQL.Close();
		Подключение.Close();
        Возврат Ложь;
		
	КонецЕсли;
			
КонецФункции


И она работает....
Параметры для передачи в хранимую процедуру, необходимы!!!

Осталась одна проблема.
Хранимая процедура выводит 2 таблицы, как мне получить данные из этих таблиц.
Как я понимаю мне необходимо Recordset установить в нужную таблицу и провести цикл?
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35877820
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max...В данных момент, как я понимаю, я процедуру запускаю, но в нее не передаются параметры, поэтому у меня наименования столбцов есть, а данных нет.

Раз наименования столбцов есть - значит параметры передаются, но, возможно, не те.

Приведите параметы вызова CreateParameter для дат. У вас, видимо, ошибка при создании типов параметров и передаются неправильные значения. Я боюсь, что дату из албанского языка передать как datetime будет сложно благодаря уникальной внутренней стрктуре даты в 1С.

(в примере с sp_execute дата передается как varchar(8), а уж sp_execute сам преобразует дату в datetime).

Объявите даты-параметры как varchar(8) в хранимой процедуре - при сравнении с датами строка yyyymmdd преобразуется к дате неяво, и передавайте даты как строки (см пример с sp_execute)
Если ошибки - посмотрите профайлером, что передается при вызове execute.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878184
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_maxИ она работает....
Параметры для передачи в хранимую процедуру, необходимы!!!

Ну, главное чтобы работало. :)
По поводу параметров. Они нужны когда вам нужно быстро и много раз выполнять один и тот же запрос с разными условиями. Использование параметров позволяет в этом случае более эффективно использовать ресурсы сервера. У вас же - открывается соединение, исполняется единственный раз запрос и соединение закрывается. Использование параметризированных запросов теряет всякий смысл. А раз так - много проще сфоримровать готовую строку запроса внутри 1С.

kharkov_max
Осталась одна проблема.
Хранимая процедура выводит 2 таблицы, как мне получить данные из этих таблиц.
Как я понимаю мне необходимо Recordset установить в нужную таблицу и провести цикл?

ну ведь уже было. Я так понимаю вам надо как-то так:
Код: plaintext
...\nПока ЗаписиSQL.EOF= 0  Цикл \n  // заполнение первой таблицы\nКонецЦикла;\n\nЗаписиSQL=ЗаписиSQL.NextRecordset;\n\nПока ЗаписиSQL.EOF= 0  Цикл \n  // заполнение второй таблицы\nКонецЦикла;\n...
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878191
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Егоров Александрkharkov_maxИ она работает....

[quot kharkov_max]
Осталась одна проблема.
Хранимая процедура выводит 2 таблицы, как мне получить данные из этих таблиц.
Как я понимаю мне необходимо Recordset установить в нужную таблицу и провести цикл?

ну ведь уже было. Я так понимаю вам надо как-то так:
Код: plaintext
...\nПока ЗаписиSQL.EOF= 0  Цикл \n  // заполнение первой таблицы\nКонецЦикла;\n\nЗаписиSQL=ЗаписиSQL.NextRecordset;\n\nПока ЗаписиSQL.EOF= 0  Цикл \n  // заполнение второй таблицы\nКонецЦикла;\n...


Такое
ЗаписиSQL=ЗаписиSQL.NextRecordset;
Не понимает, ошибка ....

Если кто знает как, подскажите пожалуйста.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878202
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

А ошибку не прведете? в васике используется
Код: plaintext
 set  objRs=objRs.NextRecordset
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878210
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

И еще... вам бы это в отдельную процедуру выделить, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Процедура ПолучитьТЗИзРекордсета(ЗаписиSQL, Таб)
  Состояние ("Заполнение временной таблицы...");

  Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл
    ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name; 
    Таб.Колонки.Добавить(ИмяСтолбца);
  КонецЦикла;
	
  Пока ЗаписиSQL.EOF  =  0  Цикл		
    НоваяСтрока =  Таб.Добавить();
    Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл
      НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
    КонецЦикла;
    ЗаписиSQL.MoveNext();
  КонецЦикла;
КонецПроцедуры
Тогда в коде будет красивее :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Функция ЗапросSQL
...
  ЗаписиSQL = СоединениеSQL.Execute();

  ТЗ1 = Новый Таблица;
  ПолучитьТЗИзРекордсета(ЗаписиSQL, ТЗ1);

  ЗаписиSQL=ЗаписиSQL.NextRecordset;

  ТЗ2 = Новый Таблица;
  ПолучитьТЗИзРекордсета(ЗаписиSQL, ТЗ2);
...
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878217
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде вот так
ЗаписиSQL = ЗаписиSQL.NextRecordset();

Работает ))

Буду ковырять дальше.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878218
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

Ой! Извините, на работе запарка.... скобки забыл! Это же метод, а не свойство! на скобки только васику наплевать... :)
Код: plaintext
ЗаписиSQL.NextRecordset () ;
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878219
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Егоров Александрkharkov_max,

И еще... вам бы это в отдельную процедуру выделить, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Процедура ПолучитьТЗИзРекордсета(ЗаписиSQL, Таб)
  Состояние ("Заполнение временной таблицы...");

  Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл
    ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name; 
    Таб.Колонки.Добавить(ИмяСтолбца);
  КонецЦикла;
	
  Пока ЗаписиSQL.EOF  =  0  Цикл		
    НоваяСтрока =  Таб.Добавить();
    Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл
      НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
    КонецЦикла;
    ЗаписиSQL.MoveNext();
  КонецЦикла;
КонецПроцедуры
Тогда в коде будет красивее :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Функция ЗапросSQL
...
  ЗаписиSQL = СоединениеSQL.Execute();

  ТЗ1 = Новый Таблица;
  ПолучитьТЗИзРекордсета(ЗаписиSQL, ТЗ1);

  ЗаписиSQL=ЗаписиSQL.NextRecordset;

  ТЗ2 = Новый Таблица;
  ПолучитьТЗИзРекордсета(ЗаписиSQL, ТЗ2);
...


Где то так и хочу сделать ))
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878221
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В итоге хочу получить на выходе функции массив таблиц

Т.е. если в другой хранимке их будет 5
то получится Т1,Т2,Т3 .....
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878223
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

Ну можно результат функции возвращать как СписокЗначений, или как оно сейчас в 8-ке называется? :)
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878396
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Продолжая тему...
А как узнать количесво мной получаемых объектов Recordset ?

Нужно для цикла по объектам ...
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878672
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не уже ли никто не знает?
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878691
Егоров Александр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

в АДО вроде нет счетчика рекордсетов, но могу и ошибаться...
попробуйте так (правда код семерки):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
СписокТаблиц=СоздатьОбъект("СписокЗначений");
...
ЗаписиSQL = СоединениеSQL.Execute();
Пока ПустоеЗначение(ЗаписиSQL)= 0  Цикл
  // в рекордсете что-то есть
  тз=СоздатьОбъект("Таблица");
  ПолучитьТЗИзРекордсета(ЗаписиSQL, тз);
  СписокТаблиц.ДобавитьЗначение(тз);

  ЗаписиSQL=ЗаписиSQL.NextRecordset;
КонецЦикла
...
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878846
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пока ПустоеЗначение(ЗаписиSQL)=0 Цикл
Сообщить (ЗаписиSQL.Properties.Count);
ЗаписиSQL=ЗаписиSQL.NextRecordset();
КонецЦикла;

Так не работает, буду искать дальше..
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878873
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kharkov_max,

счетчиков NextRecordset нет.
поэтому нужно оборачивать вызов NextRecordset в "попытка;исключение;КонецПопытки"
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878888
VladimirKr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, и не надо этого - Записи.Close().
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35878912
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне цикл нужен

Как это дело реализовать ?
Может цикл с выходом по ошибке ?
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35879047
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал..
вроде работает ...
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35879115
kharkov_max
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
После долгих вояний вот что получилось.
Функция универсальна, может кому нить пригодится.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
Функция ЗапросSQL (SQLServer,Login,Password,txtSQL)   //Функция выборки данных из SQL сервера и передача в массив временных таблиц 1С
	СтрокаСоединения = ("Provider=SQLOLEDB;Driver={SQL Server}; Deleted=No; Data Source = ") + SQLServer + 
					(";UID=") + Login + ("; PWD=") + Password + (";");
	Подключение = Новый ComObject("ADODB.Connection");
	Подключение.ConnectionString=СтрокаСоединения;
	// Подключение.Mode =  3 ;
		Попытка
			Подключение.Open(СтрокаСоединения);
			Состояние ("Подключение к серверу SQL...");
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат Ложь;
		КонецПопытки;
	СоединениеSQL = Новый COMObject("ADODB.Command");
	СоединениеSQL.ActiveConnection = Подключение;
	СоединениеSQL.CommandType =  4 ; 
	СоединениеSQL.NamedParameters = True;
	//СоединениеSQL.CommandText = ("sp_executesql");  					// Запуск для select 
	СоединениеSQL.CommandText = (txtSQL[ 0 ][ 0 ]);  						// Имя хранимой процедуры на сервере 	
	Для i =  1  По txtSQL.Количество()- 1  Цикл  							// Заполняем запрос SQL переменными
		//Сообщить (txtSQL[i][ 0 ]+" "+txtSQL[i][ 1 ]+ " "+ txtSQL[i][ 2 ]+" "+txtSQL[i][ 3 ]+ " "+ txtSQL[i][ 4 ]);  // Тестовая срока
		СоединениеSQL.Parameters.Append(СоединениеSQL.CreateParameter(txtSQL[i][ 0 ],txtSQL[i][ 1 ],txtSQL[i][ 2 ],txtSQL[i][ 3 ],txtSQL[i][ 4 ])); 
	КонецЦикла;
	Состояние ("Выполнение запроса SQL...");
	ЗаписиSQL = Новый ComObject("ADODB.RecordSet");
	ЗаписиSQL = СоединениеSQL.Execute();
	
	k= 0 ;
	МассТаб = Новый Массив;
	Пока k= 0  Цикл
	// 	Сообщить (ЗаписиSQL.Properties.Count);  						// Тестовая строка
				
			Таблица = Новый ТаблицаЗначений;
			Состояние ("Заполнение временной таблицы...");
	
			Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл 		//Создание и добавление колонок во временную таблицу
				
				ИмяСтолбца =ЗаписиSQL.Fields.Item(НомерСтолбца).Name; 
				Таблица.Колонки.Добавить(ИмяСтолбца);
				//Сообщить(ИмяСтолбца);     							// Тестовая строка
				
			КонецЦикла;
			
			Пока ЗаписиSQL.EOF  =  0  Цикл								// Заполнение созданной таблицы
				НоваяСтрока =  Таблица.Добавить();
				Для НомерСтолбца =  0  По ЗаписиSQL.Fields.Count- 1  Цикл
					НоваяСтрока.Установить(НомерСтолбца,ЗаписиSQL.Fields(НомерСтолбца).Value);
					//Сообщить ("Test " + ЗаписиSQL.Fields(НомерСтолбца).Value +  ЗаписиSQL.Fields(НомерСтолбца).Name);
				КонецЦикла;
				ЗаписиSQL.MoveNext();
			КонецЦикла;
				    				
		МассТаб.Добавить(Таблица);	
		ЗаписиSQL=ЗаписиSQL.NextRecordset();							 // Выбираем следующий select
		Попытка 
			i = ЗаписиSQL.Properties.Count; 							 // Проверка на доступность объекта RecordSet.
		Исключение 
		k =  1 
		КонецПопытки;
		
	КонецЦикла;
			
	Состояние ("Закрываем соединение с SQL...");
	Подключение.Close();
	Возврат МассТаб;  													 // Возврат массива таблиц значений запроса SQL
	
	КонецФункции

Данная функция использует переменные SQL запроса которые описываются тут:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Функция СтрокаЗапросаSQL (НомерЗапроса)  				// Функция возвращает текст запроса SQL
	Если НомерЗапроса =  1  Тогда	// Данные для ПН
		    					
			ИмяХранимойПроцедуры = "*.dbo.ПН";
						
			Масс = Новый Массив( 4 , 5 ); 					 //Массив переменных для SQL запроса, вторая размерность всегда равна  5 
			Масс[ 0 ][ 0 ]=ИмяХранимойПроцедуры;Масс[ 0 ][ 1 ]="";Масс[ 0 ][ 2 ]="";Масс[ 0 ][ 3 ]="";Масс[ 0 ][ 4 ]=""; 							// В стоке можно добавить еще  3  параметра				
			Масс[ 1 ][ 0 ]="@ДатаПриходС";Масс[ 1 ][ 1 ]= 200 ;Масс[ 1 ][ 2 ]= 1 ;Масс[ 1 ][ 3 ]= 8 ;Масс[ 1 ][ 4 ]=Формат(НачалоПериода,"ДФ=ггггММдд");  // Переменные запроса SQL
			Масс[ 2 ][ 0 ]="@ДатаПриходПо";Масс[ 2 ][ 1 ]= 200 ;Масс[ 2 ][ 2 ]= 1 ;Масс[ 2 ][ 3 ]= 8 ;Масс[ 2 ][ 4 ]=Формат(КонецПериода,"ДФ=ггггММдд");  //
			Масс[ 3 ][ 0 ]="@Поставщик";Масс[ 3 ][ 1 ]= 3 ;Масс[ 3 ][ 2 ]= 1 ;Масс[ 3 ][ 3 ]= 5000 ;Масс[ 3 ][ 4 ]= 4 ;                                     //
						
		Возврат Масс;
					
	Иначе
		
		Возврат False;
		
	КонецЕсли;
	
КонецФункции

Возможно кривовато выглядит, но работает.
Всем спасибо, думаю тему можно закрывать...
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #35879251
tester2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Апну тему. В строке поиска в виндах вбейте *ADO*.chm (лениво полный путь приводить) и получите полное руководство по методам и свойствам ADO. Это снимет многие ваши вопросы в дальнейшем.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #36368848
xKIA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, за то что сюда вклиниваюсь, но у меня проблема с RecordSet.
Ситуация такая, надо после получения данных запроса вывести ProgressBar в 1С в последующей работе с результатами запроса, соотвественно, я добавил в запрос select @@ROWCOUNT и на выходе у меня получилось два RecordSet. Проблема в том, что данные из второго мне нужны до начала обработки результатов первого. И вот такая вещь, не срабатывает:
Код: plaintext
1.
2.
3.
ЭлементыФормы.Индикатор.МаксимальноеЗначение=ЗаписиSQL.NextRecordset().Fields( 0 ).Value;
Пока ЗаписиSQL.EOF= 0  Цикл
...
То есть, я же не делаю ЗаписиSQL=ЗаписиSQL.NextRecordset(), но тем не менее, при комментировании первой строчки этого фрагмента работоспособность восстанавливается, то есть, что-то не то. подозреваю, что происходит-таки переключение на следующий recordSet, тогда вопрос -как вернуть взад или на входе получить recordSet'ы наоборот, ни или хотя бы что-то вроде: Recordset(1).Fields(0).value.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #36369625
xKIA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, я немного наколол народ, на самом деле Value берётся через переменную:
Код: plaintext
1.
tmp=ЗаписиSQL.NextRecordSet()
tmp.fields( 0 ).Value
Если писать в одну строчку, ругается, что Value потеряло актуальность. Иными слвами, РекордСет уже другой после Next'а, даже если всё в одну строчку.
Нашёл кое каие доки и напал на след, там вообще указывается, что NextRecordSet ОЧИЩАЕТ РекордСет и выполняет следующую часть запроса (Select), то есть вернуться вряд ли получиться. Второй момент, что там описывается, это возможность двигаться в двух направлениях и вообще море возможностей, типа поиска, получаения, удаления, добавления строк, столбцов и даже сортировка и фильтры или Save в XML. Правда я, уже интуитивно, пробовал PreviousRecordSet, но это не сработало. Так вот, там сказано, что работать всё-таки - будет, надо только указать в параметре открытия как-то OpenStatic, что немного замедлит работу. И самое главное - будет возможность получить RecordCount, что вообще решает все мои проблемы. Ну и ещё какой-то метод Clone(), как запасной вариант.
Замечу ещё, что кроме EOF ставится и флаг BOF, так что можно проверять отсутствие записей, если оба этих флага, одновременно True.
Осталось формализовать строчку отрытия.. если кто знает, напишите пожалуйста, у меня с такими элементарными вещами, всегда много мороки - только изучаю всё.
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #36369963
xKIA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ничего у меня не получается, пишу и просто
СоединениеSQL.Open("Driver={SQL Server Native Client 10.0};Server=SQLVIRTUAL\SQLEXPRESS;Database=EVE;Trusted_Connection=Yes;CursorType=adOpenStatic");
и без CyrsorType, вроде бы не ругается, вроде бы разрешает сделать ParamCount, но результат всегда -1 и вот что написано в хелпе:

"Свойство Recordset.RecordCount нормально функционирует только для курсоров типа Static и Keyset. Для курсоров типа ForwardOnly и Dynamic оно возвращает (-1), поскольку драйвер подключения не может определить количество записей."

Ну прямо хоть Requery() делай или тупо забить целый столбец значением количества строк... :(
...
Рейтинг: 0 / 0
Выпольнить запрос SQL из 1С
    #36370208
xKIA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашёл прекрасную доку и всё заработало .
Ошибка была в том, что установить тип курсора можно только в двух местах: в обработчике Willexecute, который вызывается перед вызовом метода Execute объекта recordSet (что-то там многовато параметров, возможно, они не обязательные, но меня - очень напугало, тем более, что не совсем понятно само это всё будет вызваться или всё-таки надо вызывать.. так и вьются в голове CallBack и Overload procedure)

Либо в самом ObjRecordSet.CursorType=3, но уже с последующим RecordSet.Open("запрос", ObjConnections);

Слегка подрезаный реальный код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
СоединениеSQL = Новый ComObject("ADODB.Connection");
СоединениеSQL.Open("Driver={SQL Server Native Client 10.0};Server=SQLVIRTUAL\SQLEXPRESS;Database=BASE;Trusted_Connection=Yes");
ЗаписиSQL = Новый ComObject("ADODB.RecordSet");
ЗаписиSQL.CursorType =  3 ;
ЗаписиSQL.ActiveConnection = СоединениеSQL;
ЗаписиSQL.Open ("select *",СоединениеSQL);
ЭлементыФормы.ИндикаторЗаполнения.МаксимальноеЗначение=ЗаписиSQL.RecordCount;
Пока ЗаписиSQL.EOF= 0  Цикл 
...


ParamCount заработал - Ура!
Всем спасибо.
...
Рейтинг: 0 / 0
78 сообщений из 78, показаны все 4 страниц
Форумы / [игнор отключен] [закрыт для гостей] / Выпольнить запрос SQL из 1С
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]