1C и SQL какие варианты связи?

Форум 1С: Одинэс.Ру

Найти!

1C и SQL какие варианты связи?

Ch Lexa
22.05.2009 - 06:24
Добрый день, ситуация есть программа учета 1С на SQL2005 и производственная программа так же на SQL 2005 (на этом же сервере), есть потребность вытаскивать данные с производственной проги, как я  понимаю существует несколько вариантов один из них ToySQL но в ней используется свой язык запросов, нет ли механизма использующего стандартный SQL  язык запросов. просто очень много запросов которые уже есть не хотелось бы их перелапачивать... подскажите варианты?
К списку тем 1 > К списку форумов

Интересные темы

odines.ru
02.12.2020 - 05:38
Смотри также:
ДЕКЛАРАЦИЯ
Печать в окошке адреса для прозрачного конверта. Есть ли такое?
Обработка для централизованного принудительного завершение работы ​всех пользователей. Что посоветуете?

Re: 1C и SQL какие варианты связи?

Lexusss
1 - 22.05.2009 - 06:29
ADO

Re: 1C и SQL какие варианты связи?

Ch Lexa
2 - 22.05.2009 - 06:31
Lexusss, как это использовать? приемер есть или описание?
* это по моему из 1С - ки MS SQL вызывается и выполняет необходимые функции???

Re: 1C и SQL какие варианты связи?

Musett
3 - 22.05.2009 - 06:31
0-Ch Lexa > Технология ADO
адоДанные=СоздатьОбъект("ADODB.RecordSet");
или:
адоКоманда=СоздатьОбъект("ADODB.Command");
и вперед - запросы на чистом SQL.
 

Re: 1C и SQL какие варианты связи?

Lexusss
4 - 22.05.2009 - 06:32
http://ru.wikipedia.org/wiki/ADO

Re: 1C и SQL какие варианты связи?

Ch Lexa
5 - 22.05.2009 - 06:35
Musett и никаких внешних компанент не надо регистрировать? описание АДО есть?

Интересные темы

odines.ru
02.12.2020 - 05:38
Смотри также:
Поиск фрагмента текста во внешних файлах
Как лучше реализовать вторую табличную часть в документе?
МХ-1

Re: 1C и SQL какие варианты связи?

Musett
6 - 22.05.2009 - 07:09
5-Ch Lexa >В современных операционках (2000, XP и т.д.) ADO входит в состав системы стандартно, никаких внешних компонент использовать не нужно.
Почитать можно здесь: http://www.script-coding.info/ADO.html

Re: 1C и SQL какие варианты связи?

Ch Lexa
7 - 22.05.2009 - 12:08
SQL_SMO = СоздатьОбъект("ADODB.Recordset");
 
ServerName = "MICROSOF-5A7CC4"; // имя или IP-адрес сервера
DSN = "smo";       // имя базы данных
UID = "sa";     // логин пользователя SQL-сервера
PWD = "123456"; // пароль пользователя SQL-сервера  
 
ConnectString = "Provider=SQLOLEDB; Data Source=" + СокрЛП(ServerName) + "; Initial Catalog=" + DSN + "; UID=" + UID + "; PWD=" + PWD ;  
 
SQL_SMO.ActiveConnection = ConnectString;  
SQL_SMO.Source = "select og.* from orders o join orderitem oi on o.idorder = oi.idorder and oi.deleted is null join ordergood og on oi.idorderitem = og.idorderitem where o.deleted is null";
 
SQL_запрос = SQL_SMO.Execute;
КоличествоСтрок = 0;    
 
Пока не(SQL_запрос.EOF) цикл
 
    КоличествоСтрок = КоличествоСтрок + 1;
Сообщить("Строка:" + СокрЛП(КоличествоСтрок));
SQL_запрос.MoveNext;
 
КонецЦикла;

Re: 1C и SQL какие варианты связи?

Ch Lexa
8 - 22.05.2009 - 12:11
Синтаксис ругается на строку: "Пока не(SQL_запрос.EOF) цикл"
и на строку "SQL_запрос.MoveNext;"
 
Какие методы можно использовать для работы с результатами такого запроса?
Как правильно писать запрос в одну строку если его длина более 256 символов, будет работать?
Кроме этого все правильно написано?

Re: 1C и SQL какие варианты связи?

Ch Lexa
9 - 22.05.2009 - 12:46
немного разобрался, теперь затык следующий:
SQL_Результат = SQL_Команда.Execute;
{C:\DOCUMENTS AND SETTINGS\ADMIN\РАБОЧИЙ СТОЛ\ОТЧЕТЫ ДЛЯ РАБОТЫ В БАЗЕ\ПРИМЕР 1.ERT(31)}: Microsoft OLE DB Provider for ODBC Drivers: [Microsoft][ODBC SQL Server Driver]
SQL
Недопустимое имя объекта "orders".

Re: 1C и SQL какие варианты связи?

Ch Lexa
10 - 22.05.2009 - 12:48
текст запроса:
//*******************************************
Процедура Сформировать()
            
 
SQL_SMO = СоздатьОбъект("ADODB.Connection");
 
ServerName = "MICROSOF-5A7CC4"; // имя или IP-адрес сервера
DSN = "smo";       // имя базы данных
UID = "sa";     // логин пользователя SQL-сервера
PWD = "123456"; // пароль пользователя SQL-сервера  
 
ConnectString = "driver={SQL Server}; Server=" + СокрЛП(ServerName) + "; DataBase =" + DSN + "; UID=" + UID + "; PWD=" + PWD ;  
      
Попытка
 
SQL_SMO.Open(ConnectString);
    
Исключение  
 
Предупреждение("Невозможно установить соединение с БД!!!");
 
КонецПопытки;
 
SQL_Команда = СоздатьОбъект("ADODB.Command");
SQL_Команда.ActiveConnection = SQL_SMO;
SQL_Команда.CommandText      = "select idorder,sm from orders ";
    
 
SQL_Результат = СоздатьОбъект("ADODB.RecordSet");
SQL_Результат = SQL_Команда.Execute;
 
SQL_Результат.MoveFirst();
Пока SQL_Результат.EOF() = 0 цикл
 
НомерСтроки = "idorder";
НомерСтроки = "sm";
 
Сообщить("Для заказа " + СокрЛП(SQL_Результат.Fields(НомерСтроки).Value) + " сумма состовляет: " + Окр(Число(SQL_Результат.Fields(НомерСтроки).Value),2));
 
SQL_Результат.MoveNext();
КонецЦикла;
 
КонецПроцедуры

Re: 1C и SQL какие варианты связи?

Ch Lexa
11 - 22.05.2009 - 12:50
тут смотрел: http://www.1csql.ru/materials/articles/develop.html~bfd0f58f-25af-add2-6767-09a5bf664605

Re: 1C и SQL какие варианты связи?

Ch Lexa
12 - 22.05.2009 - 15:50
*

Re: 1C и SQL какие варианты связи?

Gloom
13 - 22.05.2009 - 19:23
(10)Убери лишние пробелы из строки подключения.
 
ЗЫ.Вот эти строки в коде лишние:
1. "SQL_Результат = СоздатьОбъект("ADODB.RecordSet");"
SQL_Команда.Execute как раз и
создаёт рекордсет
 
2. "SQL_Результат.MoveFirst();"
Если рекордсет не пустой, то сразу после открытия он и так на первой записи.
А если пустой, то вообще MoveFirst вызовет исключение.

Re: 1C и SQL какие варианты связи?

DeiMos
14 - 22.05.2009 - 21:14
Пгекратите пеарить РМС!!!
 
http://www.abelov.com/forum/f.php?42946#310

Re: 1C и SQL какие варианты связи?

DeiMos
15 - 22.05.2009 - 21:17
http://www.youtube.com/watch?v=IncJINkJk2o&feature=related

Re: 1C и SQL какие варианты связи?

КонецЦикла
16 - 22.05.2009 - 22:14
Возможно стоит посмотреть в сторону 1С++
Одним запросом делаешь и выборку и типизацию (то есть получаешь ссылки на объекты в 1С)
Ну если надо конечно... мне так очень удобно

Re: 1C и SQL какие варианты связи?

Ch Lexa
17 - 23.05.2009 - 05:35
DeiMos,  я с Краснодара - никого не пиарю, сам пытаюсь разобраться...
Gloom, спасибо, попробую...
КонецЦикла, дело в том что запросы будут делаться к некой производственной базе не 1С, в 1С мне важна лишь таблица с результатом, и поскольку уже существуют написанные ранее запросы то проще  работать с АДО...

Re: 1C и SQL какие варианты связи?

Ch Lexa
18 - 23.05.2009 - 05:43
Gloom, проблы убрал ничего не поменялось.
"SQL_Результат = СоздатьОбъект("ADODB.RecordSet");" без этой строки ошибка та же, до "SQL_Результат.MoveFirst();" продцедура даже не доходит

Re: 1C и SQL какие варианты связи?

Ch Lexa
19 - 23.05.2009 - 06:00
Недопустимое имя объекта "orders". это ошибка как я понимаю варианты:
1. НЕ правильно завел название таблицы.
2. НЕ ошибка в синтаксисе запроса.
3. Возможно нет каких лбо разрешений на таблицу.
4. Пропустил какой то метод.
 
Но по моему все проверил, даже создал новую бд в скл 2005 и забил демо данные, переделал процедуру к этому запросу, и пока ничего... подскажите что еще может быть?

Re: 1C и SQL какие варианты связи?

Ch Lexa
20 - 23.05.2009 - 06:12
Да, кстати, в студии скл запрос "select idorder,sm from orders "; отрабатывает...

Re: 1C и SQL какие варианты связи?

Ch Lexa
21 - 23.05.2009 - 06:38
Программа ругается именно на текст запроса, не знаю что не так, голову уже сломал..

Re: 1C и SQL какие варианты связи?

Ch Lexa
22 - 23.05.2009 - 09:55
*

Re: 1C и SQL какие варианты связи?

Gloom
23 - 23.05.2009 - 10:25
(18)Покажи строку подключения ещё разок.
У тебя в (10) - "; DataBase =" два лишних пробела, соответственно, подключается не твоя база, а master, по-умолчанию. И все запросы выполняются в её контексте, а таблицы orders в master отродясь не было...

Re: 1C и SQL какие варианты связи?

Ch Lexa
24 - 23.05.2009 - 10:52
Gloom, все счастье заработало, спасибо..... действительно один пробел был лишний....
теперь еще вопросик, как правильно работать с результатами запроса, где хелп посмотреть?

Re: 1C и SQL какие варианты связи?

Ch Lexa
25 - 23.05.2009 - 11:19
Сообщить("Для заказа " + СокрЛП(RecordSet.Fields("price").Value));
{C:\DOCUMENTS AND SETTINGS\ADMIN\РАБОЧИЙ СТОЛ\ОТЧЕТЫ ДЛЯ РАБОТЫ В БАЗЕ\ПРИМЕР 1.ERT(55)}: Тип переменой не поддерживается, как иначе получать значения????

Re: 1C и SQL какие варианты связи?

Gloom
26 - 23.05.2009 - 11:42
(25)Типичные грабли для юных подованов.
1цэ(7.7) не поддерживает тип numeric.
Делают так jedi knights настоящие:
select cast(price as money) as price ...

Re: 1C и SQL какие варианты связи?

Ch Lexa
27 - 23.05.2009 - 11:48
какие типы данных надо переводить? и как это делать для других вещественных величин? что то  я не понял... как это на моем запросе будет
выглядеть? плиз....
//*******************************************
Процедура Сформировать()
 
Connection = СоздатьОбъект("ADODB.Connection");
 
ServerName = "MICROSOF-5A7CC4"; // имя или IP-адрес сервера
DSN = "smo";       // имя базы данных
UID = "sa";     // логин пользователя SQL-сервера
PWD = "123456"; // пароль пользователя SQL-сервера  
 
ConnectString = "driver={SQL Server};Server=" + СокрЛП(ServerName) + ";DataBase=" + DSN + ";UID=" + UID + ";PWD=" + PWD;  
 
Попытка
 
Connection.Open(ConnectString);
 
Исключение  
 
Предупреждение("Невозможно установить соединение с БД!!!");
 
КонецПопытки;
 
Command = СоздатьОбъект("ADODB.Command");
Command.ActiveConnection = Connection;
 
ТекстЗапроса = "
|select og.* from orders o
|join orderitem oi on o.idorder = oi.idorder and oi.deleted is null
|join ordergood og on oi.idorderitem = og.idorderitem
|where o.deleted is null";
 

Command.CommandText      = ТекстЗапроса;
 
RecordSet = Command.Execute();
                          
RecordSet.MoveFirst();
Пока RecordSet.EOF() = 0 цикл
 
Сообщить("Для заказа " + СокрЛП(RecordSet.Fields("price").Value));
RecordSet.MoveNext();
 
КонецЦикла;   
Connection.Close();
 
КонецПроцедуры

Re: 1C и SQL какие варианты связи?

Ch Lexa
28 - 23.05.2009 - 11:53
просто очень нужно понять что бы самому дальше ковыряться

Re: 1C и SQL какие варианты связи?

Gloom
29 - 23.05.2009 - 12:07
(27)Какие именно типы 1цэ не поддерживает, можешь выяснить экспериментальным путём. Обычно обламываются на numeric полях.
Обходить этот косяк можно по разному. Например, преобразованием в запросе неподдерживаемых типов к поддерживаемым.
В твоём случае нужно вместо использования * перечислить все необходимые поля через запятую, преобразовывая numeric  к удобоваримому типу как показано в (26).

Re: 1C и SQL какие варианты связи?

Ch Lexa
30 - 23.05.2009 - 12:21
Gloom , ок понятно.. и еще вопросик... к каким типам можно преобразовывать?
 
ТекстЗапроса = "
|select og.price as money from orders o
|join orderitem oi on o.idorder = oi.idorder and oi.deleted is null
|join ordergood og on oi.idorderitem = og.idorderitem
|where o.deleted is null";
 
так будет?

Re: 1C и SQL какие варианты связи?

Gloom
31 - 23.05.2009 - 12:54
(30)Нет, см. (26)

Re: 1C и SQL какие варианты связи?

ЖКК
32 - 23.05.2009 - 13:35
(30)
Вам же про каст сказали.
А что Вы хотите эти запросом получить? По-русски

Re: 1C и SQL какие варианты связи?

Ch Lexa
33 - 24.05.2009 - 13:02
я не понял про каст,(как я понимаю это что то типа перевода из типа которыый 1С - ка не читает в нужный тип), как раз мне это и надо, сразу же вопрос в какие типы можно переводить и синтаксис команды  каст.. а то что мне надо получить это не важно то есть важно научиться отображать инфу с ее получением проблем нет.. для любого запроса, как наиболее корректно это слделать?

Re: 1C и SQL какие варианты связи?

BitNike
34 - 25.05.2009 - 00:42
Качай 1CPP.dll, с ней проще работать!

Re: 1C и SQL какие варианты связи?

BitNike
35 - 25.05.2009 - 01:04
Пример использования 1CPP.dll
 
//Глобальный модуль
 
Перем ГлСоединение Экспорт;
Перем глМетаСПП  Экспорт;
Перем глRS Экспорт;
 
Функция глЗапросСПП(СЗ,Табло="",Соединение=0,Очистить=0) Экспорт    
Если (Соединение=0) Тогда
глRS.УстБД1С();
Иначе
Если СокрЛП(Соединение)="ODBCDatabase" Тогда
глRS.УстБД(Соединение);
Иначе
ConnectionString=Соединение.ConnectionString;
ConnectionString=Сред(ConnectionString,Найти(ConnectionString,"""")+1);
ConnectionString=Лев(ConnectionString,Найти(ConnectionString,"""")-1);
Соединение=СоздатьОбъект("ODBCDatabase");
Если Соединение.Соединение(ConnectionString)=1 Тогда
глRS.УстБД(Соединение);
Иначе
База=Сред(Соединение.ConnectionString,Найти(Соединение.ConnectionString,"DATABASE"));
База=Лев(База,Найти(База,"""")-1);
Сообщить("Не удалось установить соединение:"+База);
Возврат 0;
КонецЕсли;
КонецЕсли;
КонецЕсли;
 
глRS.ВыполнитьИнструкцию(СЗ,Табло,Очистить);
Возврат 1;
КонецФункции
 

Функция УстановитьГлСоединение()
Верн="";
Если МонопольныйРежим()=0 Тогда
ГлСоединение = СоздатьОбъект("ADODB.Connection");
Попытка
ConnectionString = "driver={SQL Server}; server=<Имя сервера>; uid=<имя пользователя>; pwd=<Пароль>; Database =<Имя базы>; Initial Catalog = <Каталог>";
ГлСоединение.ConnectionTimeOut =150;
ГлСоединение.CursorLocation = 3;                      
ГлСоединение.Mode = 1;                      
ГлСоединение.Open(ConnectionString);
Верн="Д";
Исключение  
ГлСоединение = "";
Верн="Н";
КонецПопытки;
КонецЕсли;
Возврат Верн;
КонецФункции
 

Процедура ПриНачалеРаботыСистемы()
 
Если ЗагрузитьВнешнююКомпоненту("1CPP.dll")=0 Тогда
Предупреждение("Не найден необходимый файл 1CPP.dll,
              | работа системы невозможна",5);
СтатусВозврата(0);
Возврат;
КонецЕсли;
 
глМетаСПП=СоздатьОбъект("MetaDataWork");
глRS = СоздатьОбъект("ODBCRecordset");
УстановитьГлСоединение();
...
...
КонецПроцедуры
 
//Пример внешней обработки
Процедура Сформировать()
 
Таб=СоздатьОбъект("ТаблицаЗначений");
Таб.НоваяКолонка("Цена");
Таб.НоваяКолонка("Дат", "Дата");
 
СтрЗапроса="Select
| og.price as money,
| oi.data as [Dat $Дата] /*допустим что в таблице oi есть поле data типа date*/
|From
| orders as o
|inner join
| orderitem as oi on (o.idorder = oi.idorder) and (oi.deleted is null)
|inner join
| ordergood as og on oi.idorderitem = og.idorderitem
|Where
| (o.deleted is null) and
| (oi.data BETWEEN :Дата1 AND :Дата2~)";
 
глRS.УстановитьТекстовыйПараметр("Дата1", Дата1);
глRS.УстановитьТекстовыйПараметр("Дата2", Дата2);
глЗапросСПП(СтрЗапроса, Таб, ГлСоединение);
 
Таб.Выгрузить(ТаблицаФормы);
 
КонецПроцедуры

Re: 1C и SQL какие варианты связи?

Ch Lexa
36 - 25.05.2009 - 12:57
ТекстЗапроса = "
|select cast(og.price as money) as price from orders o
|join orderitem oi on o.idorder = oi.idorder and oi.deleted is null
|join ordergood og on oi.idorderitem = og.idorderitem
|where o.deleted is null";
 
судя из вышесказанного так должно работать, сейчас проверю...но я не понимаю что делает этот каст??? разъесните плиз

Re: 1C и SQL какие варианты связи?

Uho
37 - 25.05.2009 - 12:59
http://msdn.microsoft.com/ru-ru/library/ms187928.aspx

Re: 1C и SQL какие варианты связи?

Ch Lexa
38 - 25.05.2009 - 13:00
Заработало только ерунда какая то вывалилась, суммы не те что в таблице

Re: 1C и SQL какие варианты связи?

Ch Lexa
39 - 25.05.2009 - 13:05
все получилось получается конструкция:
Cast(имяСтолбца as типЗначенияSQL) as имяСтолбца.
получаетя отображать столбец с типом значения скл как столбец...
 
правильно я все понял?

Re: 1C и SQL какие варианты связи?

Ch Lexa
40 - 25.05.2009 - 13:08
все получилось получается конструкция:
Cast(имяСтолбца as типЗначенияSQL) as имяСтолбца.
получаетя отображать столбец с типом значения скл как столбец...
 
правильно я все понял? в какие типы можно использовать в CASt???

Re: 1C и SQL какие варианты связи?

Uho
41 - 25.05.2009 - 13:17
(40) тебя в (37) забанили?
К списку тем 1 > К списку форумов
Тема закрыта и находится в архиве.
Но Вы можете начать новую тему.
« Удаленное рабочее место кассира (v7.7 SQL) Модуль на ровном месте стал выдавать ошибку: "Переменная не определена (СуммТаблицаПроизводствРасходов)" »
© 2009 Форум 1С: Одинэс.Ру