Показать сообщение отдельно
Старый 26.07.2018, 09:16   #15  
ena_ax is offline
ena_ax
Участник
 
254 / 46 (2) +++
Регистрация: 06.12.2006
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Вы бы сделали хотя бы поиск по данному форуму по ключевому слову "ComDispFunction". Есть масса примеров его использования.

В данном конкретном случае решение будет выглядеть так:

Сначала коллекция листов (рабочая книга. Файл Excel)

X++:
// Метод getWorkSheets()
private COM getWorkSheets()
{
    ComVariant  varRet;
    ComDispFunction funcGet;
    ;

    if (!comWorkSheets && m_comDocument)
    {
        try
        {
            /*
            comWorkSheets = m_comDocument.worksheets();
            */
            funcGet = new ComDispFunction(m_comDocument, "worksheets", COMDispContext::PropertyGet);
            varRet  = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_DISPATCH);
            funcGet.call(varRet);
            comWorkSheets = COM::createFromInterface(varRet.iDispatch());
        }

        catch (Exception::Error)
        {
            throw error("@GEE6043");
        }
    }

    return comWorkSheets;
}
Теперь собственно один лист

X++:
private COM getWorkSheet(anytype _workSheetID)
{
    COM comRet;
    ComVariant  varRet;
    ComDispFunction funcGet;
    COMVariant varArgStr;
    COMVariant varArgInt;
    ;

    if (m_comDocument)
    {
        try
        {
            this.getWorkSheets();
            /*
            comRet = comWorkSheets.item(_workSheetID);
            */
            funcGet = new ComDispFunction(comWorkSheets, "item", COMDispContext::PropertyGet);
            varRet  = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_DISPATCH);

            switch (typeOf(_workSheetID))
            {
            case types::String :
                        varArgStr = new COMVariant(COMVariantInOut::In, COMVariantType::VT_BSTR);
                        varArgStr.bStr(_workSheetID);
                        funcGet.call(varArgStr, varRet);
                        break;
        
            case types::Integer :
                        varArgInt = new COMVariant(COMVariantInOut::In, COMVariantType::VT_INT);
                        varArgInt.int(_workSheetID);
                        funcGet.call(varArgInt, varRet);
                        break;

            default :
                        throw error('Не корректный тип параметра');
                        break;
            }   // switch (typeOf(_workSheetID))
    
            comRet = COM::createFromInterface(varRet.iDispatch());

        }

        catch (Exception::Error)
        {
            throw error("@GEE6043");
        }
    }

    return comRet;
}

Коллеги, данный изменение методов решило проблему timeout при работе отчетов модуля "Генератор Российских отчетов". см мою ссылку по теме

Axapta 2009. str2IntOk

Есть два вопроса:
1. На сколько это решение является универсальным? Какие могут быть исключения?
2. Почему данный подход не реализован в стандартном функционале?