powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / [игнор отключен] [закрыт для гостей] / Выпольнить запрос SQL из 1С
25 сообщений из 78, страница 1 из 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
25 сообщений из 78, страница 1 из 4
Форумы / [игнор отключен] [закрыт для гостей] / Выпольнить запрос SQL из 1С
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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