Хранимые процедуры MS SQL (как достать информацию из 1С)

1. Tym1980 04.12.24 11:34 Сейчас в теме
Есть сервер с MSSQL, также есть сторонний клиент который пишет в БД MSSQL.
На самом сервере MSSQL есть хранимая процедура.

Как из 1с получить некоторую информацию которую выдает эта процедура

в наличии:
Адрес сервера
Имя процедуры
Логин и пароль
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. MissionOnly 8 04.12.24 11:40 Сейчас в теме
Подключиться к базе через "строку соединения". При подключении указать пароль и логин. Выполнить метод execute() с названием процедуры/функции (передаем параметры, как в запрос, получаем результат).
3. Tym1980 04.12.24 12:41 Сейчас в теме
(2)
Верно ли я понял?
Соеденение = Новый COMObject("V83.COMConnector");
	
	Попытка
		
		СтрокаПодключения = "АдресПодключения";
		УдаленнаяБаза = Соеденение.Connect(СтрокаПодключения);		
	Исключение
		Сообщить("Неудачная попытка подключения к базе-приемнику");
		Возврат;
	КонецПопытки;

Результат = УдаленнаяБаза.execute("ПолучитьОстатки");

Показать
4. MissionOnly 8 04.12.24 12:51 Сейчас в теме
Это "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();
5. Tym1980 04.12.24 13:07 Сейчас в теме
(4)
СтрокаПодключения = "Provider=sqloledb;Server=" + ИмяСервера + ";Database=" +ИмяБазы + ";User ID=" + ПользовательБазы;
Коннекшн = Новый COMОбъект("ADODB.Connection");
БазаКоманда = Новый COMОбъект("ADODB.Command");
Коннекшн.ConnectionTimeout = 20;
Коннекшн.CursorLocation = 1;
Коннекшн.Mode = 1;
Коннекшн.Open(СтрокаПодключения);
БазаКоманда.ActiveConnection = Коннекшн;
БазаКоманда.CommandText = "ПРОЦЕДУРА";
БазаКоманда.Execute();


Все супер, подключился.
А как мне в процедуру передать имя и значение параметра, например:
Имя - ДатаОстатков
Значение 01.09.2024
6. user1863362 04.12.24 13:19 Сейчас в теме
(5)
А как мне в процедуру передать имя и значение параметра
Следующий вопрос будет "а что мне делать с результатом"...
7. MissionOnly 8 04.12.24 13:32 Сейчас в теме
(5) Можно вместо "ПРОЦЕДУРА" передать "EXEC dbo.Добавить_поставщика 'Иванов Интернэшнл', '333-33-33', 'Адерс', 'Иванов'"", где "Добавить_поставщика" - имя процедуры, а дальше параметры.
8. VZyryanov 04.12.24 14:36 Сейчас в теме
//В общем модуле
Функция 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Коннект=Неопределено;
	КонецЕсли;
КонецПроцедуры
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот