Имя: Пароль:
1C
1С v8
получение данных из sql
0 Ученик2012
 
04.10.18
13:15
Добрый день.
В веб-сервисе 1С пытаюсь получить данные из sql и сохранить в таблицу данных XDTO, но выходит Ошибка:"Произошла исключительная ситуация (ADODB.Recordset): Operation is not allowed when the object is closed." на строке DateTable.Close();. Подключение проходит хорошо. У программиста, который писал хранимую процедуру, в sql видит таблицу, которая должна быть у меня и которую я пытаюсь перебрать.

Вот мой код:
cmd = Новый COMОбъект("ADODB.Command");
cmd.ActiveConnection = Подключение;
cmd.CommandText = "SFForSAP";
cmd.CommandType = 4;

prm = cmd.CreateParameter("@intWhs", 3, 1,, Whs);
cmd.Parameters.Append(prm);

prm = cmd.CreateParameter("@dtStartDate",7, 1,, StartDate);
cmd.Parameters.Append(prm);

prm = cmd.CreateParameter("@dtEndDate ",7, 1,, EndDate);
cmd.Parameters.Append(prm);

DateTable = Новый COMОбъект("ADODB.Recordset");    

Попытка
DateTable = cmd.Execute();
    
Пока DateTable.Eof()=0 Цикл
            
Строка = ФабрикаXDTO.Создать("RF_ObmenLat", "DateRowGetSF");

Строка.Nomenclature = DateTable.Fields("Nomenclature").Value;
Строка.Count = DateTable.Fields("Count").Value;
Строка.DatePlan = DateTable.Fields("DatePlan").Value;
Строка.WarehouseID = DateTable.Fields("WarehouseID").Value;
            
РезультатТаблица.Добавить(Строка);
DateTable.MoveNext();

КонецЦикла;

Исключение
КонецПопытки;

cmd = Неопределено;
DateTable.Close();

Подключение.Close();        
        
Подскажите, пожалуйста, куда копать? что почитать и посмотреть?
1 Cool_Profi
 
04.10.18
13:21
У тебя хранимка не возвращает таблицу.
Процедура написана криво
2 vitkhv
 
04.10.18
13:27
В строк еподключения ошибка.
cmd.ActiveConnection = Подключение;
3 vitkhv
 
04.10.18
13:29
Еще в начало хранимки обязательно поставь
SET NOCOUNT ON
4 novichok79
 
04.10.18
13:32
внешними источниками данных попробуйте подцепиться, там в OBDC видно что 1С отправляет необходимые команды.
5 МихаилМ
 
04.10.18
13:42
знак @ лишний
6 vitkhv
 
04.10.18
14:05
толькочто создал хранимку:
USE [optimaUPP]
GO
/****** Object:  StoredProcedure [dbo].[Get_ВыходныеИзделия]    Script Date: 04.10.2018 14:03:25 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Get_ВыходныеИзделия]
    
     @Спецификация binary(16), @Номенклатура binary(16), @ХарактеристикаНоменклатуры binary(16)
AS
BEGIN
    
    SET NOCOUNT ON;

    DROP TABLE IF EXISTS #ОсновноеИзделие

SELECT TOP 1
    ВыходныеИзделия.НомерСтроки AS НомерСтроки
INTO #ОсновноеИзделие
FROM
    (SELECT --*,
        ВыходныеИзделияСХарактеристикой.НомерСтроки AS НомерСтроки,
        1 AS Приоритет
    FROM
        [Справочник.СпецификацииНоменклатуры.ВыходныеИзделия] AS ВыходныеИзделияСХарактеристикой
    WHERE --[ВыходныеИзделияСХарактеристикой].[Ссылка] = 0xaa9d001e67d6040711e793bb66a30c55
        ВыходныеИзделияСХарактеристикой.Ссылка = @Спецификация
        AND ВыходныеИзделияСХарактеристикой.Номенклатура = @Номенклатура
        AND ВыходныеИзделияСХарактеристикой.ХарактеристикаНоменклатуры = @ХарактеристикаНоменклатуры
    
    UNION ALL
    
    SELECT
        ВыходныеИзделияБезХарактеристики.НомерСтроки,
        2
    FROM
        [Справочник.СпецификацииНоменклатуры.ВыходныеИзделия] AS ВыходныеИзделияБезХарактеристики
    WHERE
        ВыходныеИзделияБезХарактеристики.Ссылка = @Спецификация
        AND ВыходныеИзделияБезХарактеристики.Номенклатура = @Номенклатура
        AND ВыходныеИзделияБезХарактеристики.ХарактеристикаНоменклатуры = dbo.ЗНАЧЕНИЕ(N'Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка')
    
    UNION ALL
    
    SELECT
        ВыходныеИзделияБезХарактеристики.НомерСтроки,
        3
    FROM
        [Справочник.СпецификацииНоменклатуры.ВыходныеИзделия] AS ВыходныеИзделияБезХарактеристики
    WHERE
        ВыходныеИзделияБезХарактеристики.Ссылка = @Спецификация
        AND ВыходныеИзделияБезХарактеристики.Номенклатура = @Номенклатура) AS ВыходныеИзделия

ORDER BY
    ВыходныеИзделия.Приоритет,
    НомерСтроки
;


SELECT
    СпецификацииНоменклатурыВыходныеИзделия.Ссылка AS Ссылка,
    СпецификацииНоменклатурыВыходныеИзделия.НомерСтроки AS НомерСтроки,
    CASE
        WHEN @Номенклатура = NULL
                AND @ХарактеристикаНоменклатуры = NULL
            THEN CASE
                    WHEN СпецификацииНоменклатурыВыходныеИзделия.НомерСтроки = 1
                        THEN 0x00
                    ELSE 0x01
                END
        ELSE CASE
                WHEN ОсновноеИзделие.НомерСтроки = NULL
                    THEN 0x01
                ELSE 0x00
            END
    END AS СопутствующееИзделие,
    СпецификацииНоменклатурыВыходныеИзделия.НомерОперацииМаршрута AS НомерОперацииМаршрута,
    СправочникНоменклатура.НоменклатурнаяГруппа AS НоменклатурнаяГруппа,
    СпецификацииНоменклатурыВыходныеИзделия.Номенклатура AS Номенклатура,
    CASE
        WHEN ОсновноеИзделие.НомерСтроки <> NULL--ЕСТЬ НЕ NULL
                AND @ХарактеристикаНоменклатуры <> NULL
            THEN @ХарактеристикаНоменклатуры
        ELSE СпецификацииНоменклатурыВыходныеИзделия.ХарактеристикаНоменклатуры
    END AS ХарактеристикаНоменклатуры,
    СпецификацииНоменклатурыВыходныеИзделия.Количество AS Количество,
    CASE
        WHEN СпецификацииНоменклатурыВыходныеИзделия.ЕдиницаИзмерения = dbo.ЗНАЧЕНИЕ(N'Справочник.ЕдиницыИзмерения.ПустаяСсылка')
            THEN СправочникНоменклатура.ЕдиницаХраненияОстатков
        ELSE СпецификацииНоменклатурыВыходныеИзделия.ЕдиницаИзмерения
    END AS ЕдиницаИзмерения,

    СправочникЕдиницыИзмерения.[Коэффициент],
    СпецификацииНоменклатурыВыходныеИзделия.МинимальнаяПартия AS МинимальнаяПартия,
    СпецификацииНоменклатурыВыходныеИзделия.Кратность AS Кратность,
    СпецификацииНоменклатурыВыходныеИзделия.ДоляСтоимости AS ДоляСтоимости,
    СпецификацииНоменклатурыВыходныеИзделия.ТочкаМаршрута AS ТочкаМаршрута,
    ISNULL(СправочникТочкиМаршрута.Подразделение, dbo.ЗНАЧЕНИЕ(N'Справочник.ЕдиницыИзмерения.ПустаяСсылка')) AS Подразделение,
    ISNULL(СправочникТочкиМаршрута.РабочийЦентр, NULL) AS РабочийЦентр
FROM
    [Справочник.СпецификацииНоменклатуры.ВыходныеИзделия] AS СпецификацииНоменклатурыВыходныеИзделия
        LEFT JOIN #ОсновноеИзделие AS ОсновноеИзделие
        ON СпецификацииНоменклатурыВыходныеИзделия.НомерСтроки = ОсновноеИзделие.НомерСтроки
        LEFT JOIN [Справочник.ТочкиМаршрута] СправочникТочкиМаршрута
        ON СправочникТочкиМаршрута.Ссылка = СпецификацииНоменклатурыВыходныеИзделия.ТочкаМаршрута
        LEFT JOIN [Справочник.Номенклатура] СправочникНоменклатура
        ON СправочникНоменклатура.Ссылка = СпецификацииНоменклатурыВыходныеИзделия.Номенклатура
        LEFT JOIN [Справочник.ЕдиницыИзмерения] СправочникЕдиницыИзмерения
        ON CASE WHEN (СпецификацииНоменклатурыВыходныеИзделия.[ЕдиницаИзмерения] = dbo.ЗНАЧЕНИЕ(N'Справочник.ЕдиницыИзмерения.ПустаяСсылка')) THEN СправочникНоменклатура.ЕдиницаХраненияОстатков ELSE СпецификацииНоменклатурыВыходныеИзделия.[ЕдиницаИзмерения] END = СправочникЕдиницыИзмерения.Ссылка
WHERE
    СпецификацииНоменклатурыВыходныеИзделия.Ссылка = @Спецификация

  
END


и вызвал ее по адо таким образом:

мADOСоединение = ADOСоединениеНаСервере();
    Если мADOСоединение = Ложь Тогда
        Возврат ;
    КонецЕсли;

ТекстЗапросаТоваров = "EXECUTE Get_ВыходныеИзделия @Спецификация = 0xAA9D001E67D6040711E793BB66A30C55, @Номенклатура =NULL , @ХарактеристикаНоменклатуры =NULL";
    
    ADOНаборДанныхТовары  = Новый COMОбъект("ADODB.RecordSet");
    ADOНаборДанныхТовары.Open(ТекстЗапросаТоваров, мADOСоединение);

Пока НЕ ADOНаборДанныхТовары.eof() Цикл
        UID = ADOНаборДанныхТовары.Fields(0).Value;
        Сообщить(UID);

ADOНаборДанныхТовары.MoveNext();
КонецЦикла;
мADOСоединение.Close();


все четко отработало.
Ищите косяк в соединении.
7 Ученик2012
 
04.10.18
14:46
(6) правильно ли тогда вот так написать?
ТекстЗапроса = "EXECUTE SFForSAP @intWhs = " + Whs +", @dtStartDate = "+StartDate+" , @dtEndDate = " +EndDate;
8 wondkind
 
04.10.18
15:15
(6) Вы закрываете АДО соединение.
А посмотрите, что закрывает Ученик2012 )
9 vitkhv
 
04.10.18
15:22
(7) ну а почему нет?
10 Ученик2012
 
04.10.18
15:34
(8) я же закрываю его после того как переберу таблицу и получу желаемую таблицы XDTO. Это не верно?