Хранимые процедуры MS SQL (как достать информацию из 1С)
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2)
Верно ли я понял?
Верно ли я понял?
Соеденение = Новый COMObject("V83.COMConnector");
Попытка
СтрокаПодключения = "АдресПодключения";
УдаленнаяБаза = Соеденение.Connect(СтрокаПодключения);
Исключение
Сообщить("Неудачная попытка подключения к базе-приемнику");
Возврат;
КонецПопытки;
Результат = УдаленнаяБаза.execute("ПолучитьОстатки");
Показать
Это "V83.COMConnector" не поможет. Внешнюю процедуру MS SQL можно запустить механизмами ADO, через DLL провайдер работающий с MS SQL.
СтрокаПодключения = "Provider=sqloledb;Server=" + ИмяСервера + ";Database=" +ИмяБазы + ";User ID=" + ПользовательБазы;
Коннекшн = Новый COMОбъект("ADODB.Connection");
БазаКоманда = Новый COMОбъект("ADODB.Command");
Коннекшн.ConnectionTimeout = 20;
Коннекшн.CursorLocation = 1;
Коннекшн.Mode = 1;
Коннекшн.Open(СтрокаПодключения);
БазаКоманда.ActiveConnection = Коннекшн;
БазаКоманда.CommandText = "ПРОЦЕДУРА";
БазаКоманда.Execute();
СтрокаПодключения = "Provider=sqloledb;Server=" + ИмяСервера + ";Database=" +ИмяБазы + ";User ID=" + ПользовательБазы;
Коннекшн = Новый COMОбъект("ADODB.Connection");
БазаКоманда = Новый COMОбъект("ADODB.Command");
Коннекшн.ConnectionTimeout = 20;
Коннекшн.CursorLocation = 1;
Коннекшн.Mode = 1;
Коннекшн.Open(СтрокаПодключения);
БазаКоманда.ActiveConnection = Коннекшн;
БазаКоманда.CommandText = "ПРОЦЕДУРА";
БазаКоманда.Execute();
(4)
Все супер, подключился.
А как мне в процедуру передать имя и значение параметра, например:
Имя - ДатаОстатков
Значение 01.09.2024
СтрокаПодключения = "Provider=sqloledb;Server=" + ИмяСервера + ";Database=" +ИмяБазы + ";User ID=" + ПользовательБазы;
Коннекшн = Новый COMОбъект("ADODB.Connection");
БазаКоманда = Новый COMОбъект("ADODB.Command");
Коннекшн.ConnectionTimeout = 20;
Коннекшн.CursorLocation = 1;
Коннекшн.Mode = 1;
Коннекшн.Open(СтрокаПодключения);
БазаКоманда.ActiveConnection = Коннекшн;
БазаКоманда.CommandText = "ПРОЦЕДУРА";
БазаКоманда.Execute();
Коннекшн = Новый COMОбъект("ADODB.Connection");
БазаКоманда = Новый COMОбъект("ADODB.Command");
Коннекшн.ConnectionTimeout = 20;
Коннекшн.CursorLocation = 1;
Коннекшн.Mode = 1;
Коннекшн.Open(СтрокаПодключения);
БазаКоманда.ActiveConnection = Коннекшн;
БазаКоманда.CommandText = "ПРОЦЕДУРА";
БазаКоманда.Execute();
Все супер, подключился.
А как мне в процедуру передать имя и значение параметра, например:
Имя - ДатаОстатков
Значение 01.09.2024
//В общем модуле
Функция SQLКоннект() Экспорт
Попытка
SQLСервер="ИмяСервера";
SQLБазаДанных="ИмяБазы";
SQLЛогин="Логин";
SQLПароль="Пароль";
SQLКоннект=Новый COMОбъект("adodb.connection");
SQLКоннект.ConnectionTimeout=600;
SQLКоннект.CommandTimeOut=600;
SQLКоннект.Open("provider=sqloledb;data source="+SQLСервер
+";initial catalog="+SQLБазаДанных
+";user id="+SQLЛогин+";password="+SQLПароль+";");
Возврат SQLКоннект;
Исключение
Сообщить("Ошибка подключения к б/д "+SQLСервер+"."+SQLБазаДанных+". "+ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
//В модуле формы
&НаСервере
Процедура СоставИзделияЗаполнитьНаСервере(SQLКоннект=Неопределено)
Если ТипЗнч(Объект.Изделие)=Тип("Строка") Тогда
Объект.СоставИзделия.Очистить();
Объект.ДатаЗаполнения=ТекущаяДата();
Модифицированность=Истина;
Возврат;
КонецЕсли;
Изделие=Объект.Изделие;
Если Не ЗначениеЗаполнено(Изделие) Тогда
Сообщить("Не задано изделие в разделе ""Основные данные"".");
Возврат;
КонецЕсли;
ЗакрытьКоннект=SQLКоннект=Неопределено;
Если SQLКоннект=Неопределено Тогда
SQLКоннект=КФСервер.SQLКоннект();
КонецЕсли;
Если SQLКоннект=Неопределено Тогда
Возврат;
КонецЕсли;
SQLТекст="";
Попытка
USERLOG=КФСервер.ТекущийПользовательИБ().Имя;
SQLCommand1=Новый COMОбъект("adodb.Command");
SQLCommand1.ActiveConnection=SQLКоннект;
SQLCommand1.CommandTimeout=600;
SQLCommand1.CommandType=1;
Если ТипЗнч(Изделие)=Тип("СправочникСсылка.ИзделияЛоцман") Тогда
SQLТекст="EXEC dbo.LMTMP01FILL1 @CODEART="+Формат(Изделие.Код,"ЧГ=")+",@USERLOG='"+USERLOG+"'";
Иначе
SQLТекст="EXEC dbo.ARTTMP01FILL1 @CODEART="+Формат(Изделие.Код,"ЧГ=");
КонецЕсли;
SQLCommand1.CommandText=SQLТекст;
SQLCommand1.Execute();
SQLЗапрос1=Новый COMОбъект("adodb.recordset");
Если ТипЗнч(Изделие)=Тип("СправочникСсылка.ИзделияЛоцман") Тогда
SQLТекст="SEL ECT *"
+Символы.ПС+"FR OM DBO.AR2$LMTMP01 WITH(NOLOCK)"
+Символы.ПС+"WHERE USERLOG='"+USERLOG+"'"
+Символы.ПС+"ORDER BY LEV,CALC_ISSOSTAV,CODEARTTYPE,ART_NAME,ART_DESIGNATIO,"
+Символы.ПС+"CODEPARTTYPE,PART_NAME,PART_DESIGNATIO";
Иначе
SQLТекст="SEL ECT ARTTMP01.*,'' AS ART_NAME,'' AS ART_DESIGNATIO,"
+Символы.ПС+"PARTTYPE.NAME AS PARTTYPE_NAME,'' AS PART_CODEIMWARE,"
+Символы.ПС+"CASE WHEN ARTTMP01.PARTQTY>0 THEN 1 ELSE 0 END AS CALC_ISSOSTAV,"
+Символы.ПС+"'' AS KPP,0 AS SORTPARENT,0 AS SORT"
+Символы.ПС+"FR OM DBO.ARTTMP01 WITH(NOLOCK),DBO.ARTTYPE PARTTYPE WITH(NOLOCK)"
+Символы.ПС+"WHERE ARTTMP01.USERNAME=SYSTEM_USER"
+Символы.ПС+"AND ARTTMP01.CODEART=0"
+Символы.ПС+"AND ARTTMP01.CODEPARTTYPE=PARTTYPE.CODE"
+Символы.ПС+"UNI ON ALL"
+Символы.ПС+"SEL ECT ARTTMP01.*,ART.NAME AS ART_NAME,ART.DESIGNATIO AS ART_DESIGNATIO,"
+Символы.ПС+"PARTTYPE.NAME AS PARTTYPE_NAME,PART.CODEIMWARE AS PART_CODEIMWARE,"
+Символы.ПС+"CASE WHEN ARTTMP01.PARTQTY>0 THEN 1 ELSE 0 END AS CALC_ISSOSTAV,"
+Символы.ПС+"ISNULL(IM2$IMWARELN.VAL,'') AS KPP,"
+Символы.ПС+"dbo.arSortTypes(ARTTMP01.CODEARTTYPE) AS SORTPARENT,dbo.arSortTypes(ARTTMP01.CODEPARTTYPE) AS SORT"
+Символы.ПС+"FR OM DBO.ARTTMP01 WITH(NOLOCK),DBO.ART WITH(NOLOCK),"
+Символы.ПС+"DBO.ART PART WITH(NOLOCK) LEFT OUTER JOIN dbo.IM2$IMWARELN ON PART.CODEIMWARE=IM2$IMWARELN.CODEIMWARE"
+Символы.ПС+"AND IM2$IMWARELN.IMFIELDS_FLONGNAME='ФОРМА КРР',"
+Символы.ПС+"DBO.ARTTYPE PARTTYPE WITH(NOLOCK)"
+Символы.ПС+"WH ERE ARTTMP01.USERNAME=SYSTEM_USER"
+Символы.ПС+"AND ARTTMP01.CODEART=ART.CODE"
+Символы.ПС+"AND ARTTMP01.CODEPART=PART.CODE"
+Символы.ПС+"AND ARTTMP01.CODEPARTTYPE=PARTTYPE.CODE"
+Символы.ПС+"ORDER BY ARTTMP01.LEV,CALC_ISSOSTAV,CODEARTTYPE,ART_NAME,ART_DESIGNATIO,"
+Символы.ПС+"CODEPARTTYPE,PART_NAME,PART_DESIGNATIO";
КонецЕсли;
SQLЗапрос1.Open(SQLТекст,SQLКоннект,2,3);
Объект.СоставИзделия.Очистить();
Объект.ДатаЗаполнения=ТекущаяДата();
Модифицированность=Истина;
Пока Не SQLЗапрос1.Eof Цикл
Стр=Объект.СоставИзделия.Добавить();
Стр.КодРодителя1=SQLЗапрос1.Fields("CODEART1").Value;
Стр.КодИзделия1=SQLЗапрос1.Fields("CODEPART1").Value;
Стр.КодРодителя=SQLЗапрос1.Fields("CODEART").Value;
Стр.ОбозначениеРодителя=SQLЗапрос1.Fields("ART_DESIGNATIO").Value;
Стр.НаименованиеРодителя=SQLЗапрос1.Fields("ART_NAME").Value;
Стр.КодИзделия=SQLЗапрос1.Fields("CODEPART").Value;
Стр.Обозначение=SQLЗапрос1.Fields("PART_DESIGNATIO").Value;
Стр.Наименование=SQLЗапрос1.Fields("PART_NAME").Value;
Стр.КодРазделаСПРодителя=SQLЗапрос1.Fields("CODEARTTYPE").Value;
Стр.КодРазделаСП=SQLЗапрос1.Fields("CODEPARTTYPE").Value;
Стр.РазделСП=SQLЗапрос1.Fields("PARTTYPE_NAME").Value;
Стр.ЕдиницаИзмерения=SQLЗапрос1.Fields("CODEUNT").Value;
Стр.КоличествоНаЕдиницу=SQLЗапрос1.Fields("QTY").Value;
Стр.Количество=SQLЗапрос1.Fields("QTYALL").Value;
Стр.Покупное=(SQLЗапрос1.Fields("ISPURCHASED").Value>0);
Стр.Импортное=(SQLЗапрос1.Fields("ISIMP").Value>0);
Стр.Составное=(SQLЗапрос1.Fields("CALC_ISSOSTAV").Value>0);
Стр.Состав=SQLЗапрос1.Fields("PARTQTY").Value;
Стр.Уровень=SQLЗапрос1.Fields("LEV").Value;
Стр.КодImbase=SQLЗапрос1.Fields("PART_CODEIMWARE").Value;
Стр.КРР=SQLЗапрос1.Fields("KPP").Value;
Стр.ПозицияСП=SQLЗапрос1.Fields("POSITION").Value;
Стр.ПорядокРодителя=SQLЗапрос1.Fields("SORTPARENT").Value;
Стр.Порядок=SQLЗапрос1.Fields("SORT").Value;
SQLЗапрос1.MoveNext();
КонецЦикла;
Исключение
Сообщить("Ошибка. "+ОписаниеОшибки()+". Запрос "+SQLТекст);
КонецПопытки;
Объект.СоставИзделия.Сортировать("Уровень,Составное Убыв,НаименованиеРодителя,ОбозначениеРодителя,Наименование,Обозначение");
Если ЗакрытьКоннект И SQLКоннект<>Неопределено Тогда
SQLКоннект.Close();
SQLКоннект=Неопределено;
КонецЕсли;
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот