Имя: Пароль:
1C
1C 7.7
v7: Внешние компоненты для 1с 7.7
0 алекс_87
 
03.12.14
22:21
Здравствуйте. Пишу компоненту для 1с7.7 на c#,подключаю в 1с все нормально, но когда хочу вызвать методы или свойства для 1с, пишет"поле агрегатного объекта не обнаружено",через отладчик выяснил что методы интерфейса ILanguageExtender не вызываются,после реализации интерфейса IInitDone опять вызывается конструктор классы компоненты,по теории написания внешний компоненты 1С ,вк должна реализовывать, по крайней мере, два интерфейса – IInitDone и ILanguageExtender, я их реализую, но не могу понять в чем проблема.Может у кого-то есть идеи???
1 Lionee
 
03.12.14
22:34
(0) выкладывай потестим
2 алекс_87
 
03.12.14
22:38
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.EnterpriseServices;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using MyComponent.ServiceReference1;

namespace AddIn
{
    [Guid(@"90F1DA23-648B-4AE9-9436-B0AC7B1EC194")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface ILanguageExtender
    {                
        void RegisterExtensionAs(
         [MarshalAs(UnmanagedType.BStr)]
         ref string extensionName);
        void GetNProps(ref int plProps);
        void FindProp(string bstrPropName, ref int plPropNum);
        void GetPropName(int lPropNum, int lPropAlias, ref string pbstrPropName);
        void GetPropVal(int lPropNum, ref object pvarPropVal);
        void SetPropVal(int lPropNum, ref object varPropVal);
        void IsPropReadable(int lPropNum, ref bool pboolPropRead);
        void IsPropWritable(int lPropNum, ref bool pboolPropWrite);
        void GetNMethods(ref int plMethods);
        void FindMethod(string bstrMethodName, ref int plMethodNum);
        void GetMethodName(int lMethodNum, int lMethodAlias, ref string pbstrMethodName);
        void GetNParams(int lMethodNum, ref int plParams);
        void GetParamDefValue(int lMethodNum, int lParamNum, ref object pvarParamDefValue);
        void HasRetVal(int lMethodNum, ref bool pboolRetValue);
        void CallAsProc(int lMethodNum, [MarshalAs(UnmanagedType.SafeArray)] ref System.Array paParams);
        void CallAsFunc(int lMethodNum, ref object pvarRetValue, [MarshalAs(UnmanagedType.SafeArray)] ref System.Array paParam);
    }

    [Guid(@"AB634001-F13D-11D0-A459-004095E1DAEA"),
     InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IInitDone
    {
        void Init([MarshalAs(UnmanagedType.IDispatch)] Object pConnection);
        void Done();
        void GetInfo([MarshalAs(UnmanagedType.SafeArray,
                SafeArraySubType = VarEnum.VT_VARIANT)] ref Object[] pInfo);
    }

    [Guid(@"AB634004-F13D-11D0-A459-004095E1DAEA"),
     InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IAsyncEvent
    {
        void SetEventBufferDepth(Int32 depth);
        void GetEventBufferDepth(ref Int32 depth);
        void ExternalEvent([MarshalAs(UnmanagedType.BStr)] String source,
                           [MarshalAs(UnmanagedType.BStr)] String message,
                           [MarshalAs(UnmanagedType.BStr)] String data);
        void CleanBuffer();
    }

    /* Component implementation */
    [ComVisible(true),
     ProgId(@"AddIn.APIEfacturaMD"),
     Guid(@"73d61140-e6b2-47df-9d8c-6a2f788d0a53"),
     ClassInterface(ClassInterfaceType.AutoDispatch)]
    public class AddInObj : IInitDone,ILanguageExtender
    {
        public ServiceClient _client;
        const string c_AddinName = "APIEfacturaMD";    
        #region "Переменные"
        string username;
        string password;
        string fiscalcode;
        #endregion

        public AddInObj()
        {
            /* Constructor */
        }
        #region "IInitDone implementation"
        public void Init([MarshalAs(UnmanagedType.IDispatch)] Object pConnection)
        {

           //new Exception("Created");
        //   V7Data.V7Object = pConnection;
           this.username = "supplier";
           this.password = "supplier";
           this.fiscalcode = "";
        }

        public void Done()
        {
            
        }


        public void GetInfo([MarshalAs(UnmanagedType.SafeArray,
                             SafeArraySubType = VarEnum.VT_VARIANT)] ref Object[] pInfo)
        {
            pInfo.SetValue(2000,0); // Required

        }
        #endregion

        public void RegisterExtensionAs(
             [MarshalAs(UnmanagedType.BStr)]
             ref string extensionName)
            {
                extensionName = c_AddinName;
              /*  if (c_AddinName != null)
                {
                    extensionName = c_AddinName;
                   // throw new Exception(c_AddinName);
                }
                else
                {
                    throw new Exception("Не указано имя компоненты");
                }*/
            }
        #region "Свойства"
            enum Props
            {   //Числовые идентификаторы свойств нашей внешней компоненты
                 propUserName = 0,
                 propPassword = 1,
                 propFiscalCode = 2,
                 LastProp = 2
            }

            public void GetNProps(ref int plProps)
            {    //Здесь 1С получает количество доступных из ВК свойств
                plProps = (int)Props.LastProp;
            }

            public void FindProp(string bstrPropName, ref int plPropNum)
            {    //Здесь 1С ищет числовой идентификатор свойства по его текстовому имени
               switch (bstrPropName)
                {
                    case "UserName":
                    case "ИмяПользователя":
                        plPropNum = (int)Props.propUserName;
                        break;
                    case "Password":
                    case "Пароль":
                        plPropNum = (int)Props.propPassword;
                        break;
                    case "FiscalCode":
                    case "ФискальныйКод":
                        plPropNum = (int)Props.propFiscalCode;
                        break;
                    default:
                        plPropNum = -1;
                        break;
                }
            }

            public void GetPropName(int lPropNum, int lPropAlias, ref string pbstrPropName)
            {    //Здесь 1С (теоретически) узнает имя свойства по его идентификатору. lPropAlias - номер псевдонима
                pbstrPropName = "";
            }

            public void GetPropVal(int lPropNum, ref object pvarPropVal)
            {    //Здесь 1С узнает значения свойств
                pvarPropVal = null;
                switch (lPropNum)
                {
                    case (int)Props.propUserName:
                        pvarPropVal = username;
                        break;
                    case (int)Props.propPassword:
                        pvarPropVal = password;
                        break;
                    case (int)Props.propFiscalCode:
                       pvarPropVal = fiscalcode;
                        break;
                }
            }

            public void SetPropVal(int lPropNum, ref object varPropVal)
            {    //Здесь 1С изменяет значения свойств

                switch (lPropNum)
                {
                    case (int)Props.propUserName:
                        username = (string)varPropVal;
                        break;
                    case (int)Props.propPassword:
                        password = (string)varPropVal;
                        break;
                   case (int)Props.propFiscalCode:
                       fiscalcode = (string)varPropVal;
                        break;

                }
            }

            public void IsPropReadable(int lPropNum, ref bool pboolPropRead)
            {    //Здесь 1С узнает, какие свойства доступны для чтения
                pboolPropRead = true; // Все свойства доступны для чтения
            }

            public void IsPropWritable(int lPropNum, ref bool pboolPropWrite)
            {    //Здесь 1С узнает, какие свойства доступны для записи
                pboolPropWrite = true; // Все свойства доступны для записи
            }
            #endregion

        #region "Методы"

            enum Methods
            {    //Числовые идентификаторы методов (процедур или функций) нашей внешней компоненты
                methGetNameTaxPayer = 0,
                LastMethod = 1
            }

            public void GetNMethods(ref int plMethods)
            {    //Здесь 1С получает количество доступных из ВК методов
                plMethods = (int)Methods.LastMethod;
            }

            public void FindMethod(string bstrMethodName, ref int plMethodNum)
            {    //Здесь 1С получает числовой идентификатор метода (процедуры или функции) по имени (названию) процедуры или функции
             plMethodNum = -1;
                switch (bstrMethodName)
                {
                    case "GetNameTaxPayer":
                    case "ПолучитьИмяНалогоПлат":
                        plMethodNum = (int)Methods.methGetNameTaxPayer;
                        break;
                }
            }

            public void GetMethodName(int lMethodNum, int lMethodAlias, ref string pbstrMethodName)
            {    //Здесь 1С (теоретически) получает имя метода по его идентификатору. lMethodAlias - номер синонима.
                pbstrMethodName = "";
              
            }

            public void GetNParams(int lMethodNum, ref int plParams)
            {    //Здесь 1С получает количество параметров у метода (процедуры или функции)
                switch (lMethodNum)
                {
                    //case (int)Methods.methMessageBoxShow:
                     //   plParams = 2;
                     //   break;
                    case (int)Methods.methGetNameTaxPayer:
                        plParams = 0;
                        break;
                }
            }

            public void GetParamDefValue(int lMethodNum, int lParamNum, ref object pvarParamDefValue)
            {    //Здесь 1С получает значения параметров процедуры или функции по умолчанию
                pvarParamDefValue = null; //Нет значений по умолчанию
            }

            public void HasRetVal(int lMethodNum, ref bool pboolRetValue)
            {    //Здесь 1С узнает, возвращает ли метод значение (т.е. является процедурой или функцией)
                pboolRetValue = true;  //Все методы у нас будут функциями (т.е. будут возвращать значение).
            }

            public void CallAsProc(int lMethodNum, ref System.Array paParams)
            {    //Здесь внешняя компонента выполняет код процедур. А процедур у нас нет.
            }

            public string GetTaxPayerName(string username, string password,string fiscalcode)
            {  
                _client = new ServiceClient();
                _client.ClientCredentials.UserName.UserName = "supplier";
                _client.ClientCredentials.UserName.Password = "supplier";
                string newid=Guid.NewGuid().ToString();
                 var request = new TaxpayersRequest {FiscalCodes = new[]{fiscalcode}, RequestId = newid};
                 var response = _client.GetTaxpayersInfo(request);
                 string name = "";
                 foreach (var info in response.Results)
                 {
                    name=info.Name;
                 }
                 return name;

            }

            public void CallAsFunc(int lMethodNum, ref object pvarRetValue, ref System.Array paParams)
            {    //Здесь внешняя компонента выполняет код функций.
                pvarRetValue = 0; //Возвращаемое значение метода для 1С

                switch (lMethodNum) //Порядковый номер метода
                {
                       case (int)Methods.methGetNameTaxPayer: //Реализуем тестовый метод для изменения строки состояния
                        {
                            /*string s1;
                            s1 = (string)paParams.GetValue(0);
                            V7Data.StatusLine.SetStatusLine(s1);
                            System.Threading.Thread.Sleep(1000); //Делаем паузу 1 сек
                            V7Data.StatusLine.ResetStatusLine();*/
                            pvarRetValue = GetTaxPayerName(username, password,fiscalcode);
                            break;
                        }
                }
            }
            #endregion


    }
}
3 алекс_87
 
03.12.14
22:40
ИмяВК="AddIn.APIEfacturaMD";    
    ок=ПодключитьВнешнююКомпоненту(ИмяВК);
    Если ок=0 Тогда
        Сообщить("Не удалось подключить компоненту "+ИмяВК);
    КонецЕсли;
    net =СоздатьОбъект(ИмяВК);  
    net.UserName="supplier";/////тут ошибка вылетает
4 алекс_87
 
03.12.14
22:42
и веб референс:https://api-test.fisc.md/Service.svc?wsdl
5 алекс_87
 
04.12.14
12:18
Решил создать новый проект заново,компонента таже, уже не видит интерфейс IInitDone
6 алекс_87
 
08.12.14
15:01
Тема закрыта, вопрос решен.
7 DrZombi
 
гуру
08.12.14
15:31
(6) Как решен? Что сделал? Как прок от твоего мусора, если ты не пишешь ответ :(
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший