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

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

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

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

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


Показать
4. MissionOnly 3 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 3 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Коннект=Неопределено;
    КонецЕсли;
КонецПроцедуры

Показать
Оставьте свое сообщение

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