Добрый день!
Помогите разобраться. Создала внешнюю обработку, которая должна будет создать трассировку. Однако при вызове метода RecordSet.Open() вылетает ошибка:
{ВнешняяОбработка.СтатистикаЗапросовПоБД.Форма.Форма.Форма(48)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Неправильный синтаксис около конструкции ",".

Подскажите, в чем проблема?

Код:

```1c
    Попытка
    ADOСоединение = Новый COMОбъект("ADODB.Connection");
    ADOСоединение.ConnectionString = СтрокаСостояния;
    ADOСоединение.Open();
    Исключение
    Сообщить(ОписаниеОшибки());
    КонецПопытки;

    Command = Новый COMObject("ADODB.Command");
    Command.ActiveConnection = ADOСоединение;
    Command.NamedParameters = Истина;
    ТекстЗапроса = "exec sp_trace_create, 'C:\Projects'";
    Command.CommandText = ТекстЗапроса;
    Command.CommandType = 4;

    RecordSet = Новый COMObject("ADODB.RecordSet");
    RecordSet.ActiveConnection = ADOСоединение;
    RecordSet.CursorType = 3;
    RecordSet.LockType = 2;

    Попытка
    RecordSet.Open(ТекстЗапроса, ADOСоединение);
    Таблица = Новый ТаблицаЗначений;
    КолКолонок = RecordSet.Fields.Count;
    Пока RecordSet.Eof()= 0 Цикл
    Для Инд = 0 По КолКолонок - 1 Цикл
    Таблица.ЗагрузитьКолонку(RecordSet.Fields(Инд).Value, RecordSet.Fields(Инд).Name);
    КонецЦикла;
    RecordSet.MoveNext();
    КонецЦикла;

    Исключение
    Сообщить(ОписаниеОшибки());
    КонецПопытки;
```
---
Если речь идет о sp_trace_create, то первый параметр у нее выходной

sp_trace_create [ @traceid = ] trace_id OUTPUT
          , [ @options = ] option_value
          , [ @tracefile = ] 'trace_file'
     [ , [ @maxfilesize = ] max_file_size ]
     [ , [ @stoptime = ] 'stop_time' ]
     [ , [ @filecount = ] 'max_rollover_files'

т.e. вызов ХП в может выглядеть так:

file="С:\trace.trc"

com = New COMОбъект("ADODB.Command");
com.ActiveConnection=conn;
com.CommandText ="sp_trace_create";
com.CommandType=4;
com.Parameters.Append (com.CreateParameter("@TraceID", 3, 3,4));
com.Parameters.Append (com.CreateParameter("@options", 3, 1,4));
com.Parameters(1).value =6;
com.Parameters.Append (com.CreateParameter("@tracefile", 130, 1,245));
com.Parameters(2).value =file;
com.Prepared = true;
com.Execute();
//Возвращаем значение @TraceID
id=com.Parameters(0).value;
---
Видимо строка подключения некорректная. Покажите ее
---
```1c
    ADOСоединение.ConnectionString = "Provider=SQLOLEDB.1; Trusted_Connection=yes; Initial Catalog = srv001; Data Source=Lenovo-PC";
```
---
ТекстЗапроса
Неправильный текст запроса - ТекстЗапроса = "exec sp_trace_create, 'C:\Projects'";
---
А как правильно написать запрос? Может параметры не правильно задала?
---
Ну, типа такого:

```1c
    ADOСоединение = Новый COMОбъект("ADODB.Connection");

    Попытка
    ADOСоединение.Open("DRIVER=SQLite3 ODBC Driver;Database=C:\1C\PG\PR\PriceGrabber\db.dat;LongNames=0;Timeout=1000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;");

    Исключение
    Сообщить("ААААА!!!!!!");
    КонецПопытки;

    ДатаНачалаЗапроса = НачалоДня(ТекущаяДата());

    command = Новый COMОбъект("ADODB.Command");
    command.ActiveConnection = ADOСоединение;

    command.CommandText ="SELECT
    | pg_list.ID AS КодПрайса,
    | pg_list.PVID AS PVID,
    | datetime(pg_list.PRICEDTE + julianday("1899-12-30")) as Дата,
    | pg_list.DESCR as ИмяПостовщика
    |FROM
    | pg_list
    |WHERE
    | datetime(pg_list.PRICEDTE + julianday("1899-12-30")) >= datetime(julianday("" + Формат(ДатаНачалаЗапроса,"ДФ='yyyy-MM-dd HH:mm:ss'") + ""))";

    Попытка
    результат = command.Execute();
    Исключение

    Сообщить("ООООООО!!!!!!!!!!!!");

    КонецПопытки;

    Вр = 1;
    // Перебор данных

    Если НЕ результат.EOF() Тогда
    результат.MoveFirst();
    Пока результат.EOF() = 0 Цикл

    Сообщить(Вр);
    результат.MoveNext();
    Вр = Вр + 1;
    КонецЦикла;
    КонецЕсли;
```

:-)))
---
И, если у Вас стоит exec - то это вызов какой - то хранимой процедуры?
---
да, это хранимая процедура sql, которая создает трассировку.
---
Я делаю так:

Результат = ADOConnection1.Execute('Set NoCount On Declare @ResultParam int Exec @ResultParam = ' + ProcName + ' Select @ResultParam As ResultParam');
---
Пример вызова хранимой процедуры, возвращающей набор данных

```1c
    Function Example(god,dtk)

    com = New COMОбъект("ADODB.Command");
    Try
    com.ActiveConnection=ADOСоединение;
    com.CommandText ="sp_storedproc";
    com.CommandType=4;
    com.Parameters.Append (com.CreateParameter("@igod", 3, 1,4));
    com.Parameters(0).value = god;
    com.Parameters.Append(com.CreateParameter("@rdtn", 135, 1,8));
    com.Parameters(1).value = dtk;
    com.Prepared = true;
    RS=com.Execute();
    return RS;
    Except
    return undefined;
    EndTry;
    EndFunction
```

Параметры функции CreateParameter:

Function CreateParameter([Name As String], [Type As DataTypeEnum = adEmpty], [Direction As ParameterDirectionEnum = adParamInput], [Size As ADO_LONGPTR], [Value]) As Parameter

Name - имя параметра хранимой процедуры
Type - тип параметра ( 3 - целое, 135 - дата, полный список типов в документации по MS ADODB)
Direction - направление передачи параметров 1 - входной, 3 - выходной
Size - размерность в байтах.
---
полный список типов в документации по MS ADODB
А можете поделиться ссылочкой на документацию с полным описанием типов параметров ХП?
Перерыла гугл, ничего толкового не попадается(
---
Два варианта: "теоретический" и "практический".

1. https://docs.microsoft.com/ru-ru/sql/ado/reference/ado-api/ado-code-examples
2. Открываете книгу Excel, переходите в редактор VB (Alt+F11). Затем меню Tools -> References устанавливаете ссылку на Мicrosoft ActiveX Data Objects 2.8 Library.
Далее вызываете Оbject Browser (меню View -> Оbject Browser или F2). В списке "Project / Library выбираете ADODB.
---
Добавила параметры по примеру:

```1c
    Command.Parameters.Append(Command.CreateParameter("@options", 3, 1, 4));
    Command.Parameters(0).value = 6;
```

Но, вылетает ошибка:
{ВнешняяОбработка.СтатистикаЗапросовПоБД.Форма.Форма.Форма(36)}: Ошибка при вызове метода контекста (Execute): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Процедура ожидает параметр "@options" типа "int".

Что может быть не так? Перепробовала разные типы для целых чисел, ошибка одна и та же каждый раз вылетает...((
---
Если речь идет о sp_trace_create, то первый параметр у нее выходной

sp_trace_create [ @traceid = ] trace_id OUTPUT
          , [ @options = ] option_value
          , [ @tracefile = ] 'trace_file'
     [ , [ @maxfilesize = ] max_file_size ]
     [ , [ @stoptime = ] 'stop_time' ]
     [ , [ @filecount = ] 'max_rollover_files'

т.e. вызов ХП в может выглядеть так:

file="С:\trace.trc"

com = New COMОбъект("ADODB.Command");
com.ActiveConnection=conn;
com.CommandText ="sp_trace_create";
com.CommandType=4;
com.Parameters.Append (com.CreateParameter("@TraceID", 3, 3,4));
com.Parameters.Append (com.CreateParameter("@options", 3, 1,4));
com.Parameters(1).value =6;
com.Parameters.Append (com.CreateParameter("@tracefile", 130, 1,245));
com.Parameters(2).value =file;
com.Prepared = true;
com.Execute();
//Возвращаем значение @TraceID
id=com.Parameters(0).value;
---
Спасибо большое! Все получилось)
Однако, еще одна загвоздка: мне необходимо следом вызвать еще одну ХП sp_trace_setevent, но вылетает ошибка, что для данной процедуры слишком много аргументов, хотя в описании к этой ХП они все указаны. Подскажите, пжл, в чем может быть проблема? И как лучше задать значения параметров, если значений должно быть несколько (например, для параметра 1 и 2)?

```1c
    Попытка
    Command.ActiveConnection = ADOСоединение;
    Command.CommandText = "sp_trace_setevent";
    Command.CommandType = 4;
    Command.Parameters.Append(Command.CreateParameter("@TraceID", 3, 1, 4));
    Command.Parameters(0).Value = id;
    Command.Parameters.Append(Command.CreateParameter("@eventid", 3, 1, 255));
    Command.Parameters(1).Value = 10;
    Command.Parameters.Append(Command.CreateParameter("@columnid", 3, 1, 255));
    Command.Parameters(2).Value = 1;
    Command.Parameters.Append(Command.CreateParameter("@on", 11, 1, 1));
    Command.Parameters(3).Value = 1;
    Command.Prepared = Истина;
    Command.Execute();
    Исключение
    Сообщить(ОписаниеОшибки());
    КонецПопытки;
```
---
но вылетает ошибка
Parameters of all SQL Trace stored procedures (sp_trace_xx) are strictly typed. If these parameters are not called with the correct input parameter data types, as specified in the argument description, the stored procedure will return an error.
Параметры 1 и 2 имеют тип int и должны задаваться со значениями (3,1,4).

 И как лучше задать значения параметров, если значений должно быть несколько (например, для параметра 1 и 2)?
Users must execute sp_trace_setevent for each column added for each event. During each execution, if @on is set to 1, sp_trace_setevent adds the specified event to the list of events of the trace. If @on is set to 0, sp_trace_setevent removes the specified event from the list.
---
Параметры 1 и 2 имеют тип int и должны задаваться со значениями (3,1,4).
Поправила, но ошибка все равно повторяется((
Может параметр @TraceID не надо указывать?

(22) Users must execute sp_trace_setevent for each column added for each event. During each execution, if @on is set to 1, sp_trace_setevent adds the specified event to the list of events of the trace. If @on is set to 0, sp_trace_setevent removes the specified event from the list.
Т.е. получается необходимо вызывать эту процедуру, каждый раз добавляя в значение параметра по событию и столбцу к этому событию?
типа так:

```1c
    Попытка
    Command.ActiveConnection = ADOСоединение;
    Command.CommandText = "sp_trace_setevent";
    Command.CommandType = 4;
    Command.Parameters.Append(Command.CreateParameter("@TraceID", 3, 1, 4));
    Command.Parameters(0).Value = ID;
    Command.Parameters.Append(Command.CreateParameter("@eventid", 3, 1, 4));
    Command.Parameters(1).Value = 10;
    Command.Parameters.Append(Command.CreateParameter("@columnid", 3, 1, 4));
    Command.Parameters(2).Value = 13;
    Command.Parameters.Append(Command.CreateParameter("@on", 11, 1, 1));
    Command.Parameters(3).Value = 1;
    Command.Prepared = Истина;
    Command.Execute();
    Исключение
    Сообщить(ОписаниеОшибки());
    КонецПопытки;
```
---
Поправила, но ошибка все равно повторяется((
Мне не удалось получить эту ошибку. На sql 2005 и 2008 процедура отрабатывает без ошибок. @TraceID - дескриптор сеанса трассировки и он нужен для sp_trace_setevent.

Т.е. получается необходимо вызывать эту процедуру, каждый раз добавляя в значение параметра по событию и столбцу к этому событию?
Да.
---
Мне не удалось получить эту ошибку. На sql 2005 и 2008 процедура отрабатывает без ошибок. @TraceID - дескриптор сеанса трассировки и он нужен для sp_trace_setevent.
А чему параметр @TraceID долен быть равен? Значению, которое мы получили вот тут:
(20) id=com.Parameters(0).value;
Может быть я не правильно значение этому параметру задала?
---
XП sp_trace_create создает экземпляр трассировки и возвращает указатель на этот экземпляр (@TraceID). Этот указатель должен быть передан в XП sp_trace_setevent, для того, чтобы она "знала" с какой трассировкой она работает.

Пример:

DECLARE @RC int, @TraceID int, @on BIT
EXEC @rc = sp_trace_create @TraceID output, 0, N'C:\SampleTrace'

-- Select the return code to see if the trace creation was successful.
SELECT RC = @RC, TraceID = @TraceID

-- Set the events and data columns you need to capture.
SELECT @on = 1

-- 10 is RPC:Completed event. 1 is TextData column.
EXEC sp_trace_setevent @TraceID, 10, 1, @on
---
Попробуйте следующий вариант:

1. Создайте свою ХП обертку в MS-Sql:

2. В 1С сделайте вызов данной ХП:

file="C:\test";
len=strlen(file);

com = New COMОбъект("ADODB.Command");
com.ActiveConnection = con;
com.CommandText = "myTrace";
com.CommandType = 4;
com.Parameters.Append (com.CreateParameter("@pFile", 130, 1,len));
com.Parameters(0).value =file;
com.Prepared = Истина;
com.Execute();
---
```1c
    Попытка
    ADOСоединение = Новый COMОбъект("ADODB.Connection");
    ADOСоединение.ConnectionString = СтрокаСостояния;
    ADOСоединение.Open();

    Command = Новый COMObject("ADODB.Command");
    Command.ActiveConnection = ADOСоединение;
    ТекстЗапроса = "exec sp_trace_create 'C:\Projects'";
    Command.CommandText = ТекстЗапроса;
    Command.CommandType = 4;

    RecordSet = Command.Execute();

    Таблица = Новый ТаблицаЗначений;
    КолКолонок = RecordSet.Fields.Count;
    Пока RecordSet.Eof()= 0 Цикл
    Для Инд = 0 По КолКолонок - 1 Цикл
    Таблица.ЗагрузитьКолонку(RecordSet.Fields(Инд).Value, RecordSet.Fields(Инд).Name);
    КонецЦикла;
    RecordSet.MoveNext();
    КонецЦикла;

    Исключение
    Сообщить(ОписаниеОшибки());
    КонецПопытки;
```
---
У вас CommandType установлен в 4 - вызов хранимой процедуры. Зачем тогда exec?
Перед первым параметром запятая не нужна

То есть должно быть примерно вот так

```1c
    ТекстЗапроса = "sp_trace_create 'C:\Projects'";
```

Можно еще передавать каталог как параметр
---
нет, не вышло, вылетает теперь ошибка:
{ВнешняяОбработка.СтатистикаЗапросовПоБД.Форма.Форма.Форма(48)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Выполнение запроса процедура "sp_trace_create" окончилось неудачно, так как "sp_trace_create" является объектом процедура.
---
Достаточно активно работаю с ХП. И написал для этого определенное количество строк кода. В итоге, моя работа сводится к инициализации параметров. Типа так:

```1c
    ПарамХП = МодульБД.ИнициализироватьХП(ИмяПроцедурыСохраненияСообщения(), Соединение);
```

И выполнению ХП. Типа так:

```1c
    МодульБД.ВыполнитьХранимуюПроцедуру(ПарамХП, Соединение,
    Новый Структура("XML, profile_id", Текстовка, Перечисления.НазначенияПочтовыхПрофилей.ПолучитьИдентификатор(НазначениеПрофиля)),
    ДопПараметры
    );
```

Инициализирую отдельно для того, чтобы закэшировать созданные объекты параметров и команды ХП. Просто если одну процедуру много раз выполнить в каком-то цикле (и каждый раз ее создавать), то по замерам времени видим, что очень большие затраты происходят именно на создании процедуры параметров. При несложных ХП, эти затраты превышают время выполнения самой ХП.
Хотел выложить публикацией код. Но нужно код из общего модуля повыдергивать и вставить, например, во внешку. На это нет времени.
В неприбранном виде могу и сюда запостить.
---
Я так понимаю, функции, представленные выше, вы сами писали?
Учитывая то, что я только начинаю знакомиться с ХП, то в такие тонкости мне вникать еще рано)
Сейчас моя задача, правильно передать параметры в процедуру sp_trace_create, в том коде, который я уже написала. Судя по всему, ошибка вылетает именно из-за неправильных параметров...
Если сможете помочь разобраться с передачей параметров в ХП sp_trace_create, буду признательна)
---
В вашем примере вы же исполняете запрос (вместе с exec и параметрами). И тогда должно сработать Command.CommandType = 1. Попробуйте сначала так.