Шаблон внешней компоненты на C#


Шаблон внешней компоненты для 1С:Предприятие на C#.

Написан и успешно компилируется в Microsoft Visual C# 2010 Express. В комплекте RegAddIn.bat как образец для регистрации компоненты в реестре и обработка для проверки работоспособности в 1С. Все проверялось с 1С версии 8.2.16.352.

Upd, 25.04.2024

Компонента успешно пересобрана и проверена на конфигурации:

  • 1С:Предприятие 8.3.7.2027
  • MS Visual Studio Express 2024 для Windows Desktop
  • Windows 10

97 Comments

  1. Andry.Boris

    Плюсую…

    но… есть вопрос?

    В длл только элементарные действия или можно работать с базой (справочниками, документами…)

    Если можно пример на шарпе с обработкой справочника…

    Reply
  2. Kuzja_R

    (1) Andry.Boris, можно, но я с этим еще не разобрался, поэтому примера нет. Могу, как вариант, дать ссылку. Там этот вопрос рассматривается.

    Reply
  3. TigeRuS

    Вообще не вижу смысла данной компоненты. Все плюсы, которые указывает автор статьи спорные: например, выгрузка/загрузка в xml — это запросто можно сделать используя средства 1С. Я лучше буду программировать либо в 1С, либо на шарпе, но вместе зачем их скрещивать. У них разные области применения.

    Reply
  4. saiten

    А неплохо. Плюсанул. Но кое-что непонятно:

    1. Зачем подключено System.EnterpriseServices? Я что-то упустил?

    2. Назначение интерфейса IMyComponent.

    3. Работа со свойствами не реализована?

    Reply
  5. Kuzja_R

    (3) TigeRuS, данной компоненты — это какой? Я в своей ни о каких плюсах не говорю. По ссылке, которую я привел выше тоже плюсы/минусы не рассматриваются. Слово «xml» там встречается ровно 1 раз, когда говорится о способе хранения настроек проекта VB.NET. Вы о чем? Сам придумал преимущество и сам его опроверг. 🙂

    И тот, и другой пример — просто примеры создания внешних компонент: мой — как это сделать на c#, в статье по ссылке — как из компоненты работать с объектами 1С (ответ на (1)).

    С утверждением о разных областях применения согласен. Именно по этому они удачно дополняют друг друга через механизм ВК.

    Reply
  6. Kuzja_R

    (4) saiten,

    1. System.EnterpriseServices осталось в наследство от примера из отличной статьи. Там это пространство имен нужно было для работы с COM+. Можно и без него, согласен.

    2. Интерфейс IMyComponent нужен для работы процедуры RegisterExtensionAs, которая перебирает все интерфейсы и хэширует имена методов, объявленных в них.

    3. Со свойствами — да есть проблема: интерфейсы не могут содержать поля. Может быть кто-то из уважаемой публики предложит решение?

    P.S.

    Как вариант, добавлять имена свойств в хэш таблицы в процедуре RegisterExtensionAs хардкодом. И реализовать GetPropVal, SetPropVal, IsPropReadable, IsPropWritable.

    Reply
  7. saiten
    Интерфейс IMyComponent нужен для работы процедуры RegisterExtensionAs, которая перебирает все интерфейсы и хэширует имена методов, объявленных в них.

    Л-логично… Просто, несколько проще было бы, на мой взгляд делать так: хэш заполнять по this.GetType().GetMethods(), а функционал компоненты отделить от реализации интерфесов:

    class myTestComponent:myComponent
    {
    public int Go(int Param1, int Param2)
    …

    А вообще, респект. Делал похожую штуку, только до публикации так и не дошло, бо потребовалась реализация native API под тонкий клиент и не удалось решить красиво проблему со свойствами.

    Reply
  8. awk

    (3) TigeRuS, Только сегодня накатал на C# СОМ обертку для Regex, т.к. VBScript.RegExp не понимает UTF-8.

    15 мин и счастье в кармане. Так что есть что расширять в 1С. Хотя регулярных выражений как не было в ней, так и нет. Лучше бы 1С вместо XML регулярные выражения в общие объекты включила.

    Reply
  9. Kuzja_R

    (7) saiten, функционал конечно нужно как-то отделять от интерфейса. Только думаю, что так просто не получится. 1С создает и работает с объектом MyComponent (в данном примере). Если мы создаем производный класс myTestComponent и в нем определяем методы, как получит доступ к ним MyComponent? И если принята модель, что пользовательские методы объединяются в отдельный интерфейс, то как туда попадут они из производного класса? Тут нужно что-то другое придумывать…

    Если кому интересно, реализовал работу со свойствами. Выложил свежий файл.

    Reply
  10. saiten

    (9)Собственно, 1С создаст объект типа MyTestComponent и будет работать с ним через методы, определённые в MyComponent (естественно, для производного класса, надо установить ComVisible(true) и Guid). При этом this будет указывать на объект MyTestComponent, таким образом ничто не помешает 1С вызывать методы MyTestComponent, имея ссылку на MyComponent через Invoke, т.к. this.GetType().GetMethods() вернёт описания методов как в базового, так и в производного классов. Описывать же пользовательские методы компоненты в отдельном интерфейсе нет необходимости, и логического смысла, в общем-то, тоже: класса вполне достаточно.

    Reply
  11. Kuzja_R

    (10) saiten, да, вынес функционал для подключения к 1С в отдельный класс. Спасибо за предложение!

    Reply
  12. vitaliy.ermolenko

    (3) TigeRuS, ВК оч. удобны для связки например 1с со скайпом или тем же астериском, из самой 1с по-моему этого не реализовать

    Reply
  13. ValeriVP
  14. Aleksey.Bochkov

    Наивный вопрос — а нет ли такого же примера на vb? 🙂

    Reply
  15. Kuzja_R

    (14) albochkov, мне, пока я изучал вопрос, вроде не попадался.

    Reply
  16. softest

    Спасибо, мне помогла взял себе на заметку!

    Reply
  17. IRLes

    Спасибо, нужно будет поработать над ней для своих целей 🙂

    Reply
  18. avhrst

    Плюс однозначно

    У меня вызвало теплые воспоминания когда я давно давно писал на C# ВК для 1С v7 🙂

    Reply
  19. Kuzja_R

    (18) avhrst, да, технологии сто лет, а готового работающего примера с комментариями что и для чего найти не получилось. Теперь есть.

    Reply
  20. vz1987

    Спасибо большое за пример!

    Но меня возникла проблема: ПодключитьВнешнююКомпоненту(«AddIn.MyComponent») отрабатывает, а создание объекта Новый(«AddIn.MyComponent») вылетает с исключением Тип не определен (AddIn.MyComponent)

    Reply
  21. Kuzja_R

    (20) vz1987, регистрация компоненты с помощью regasm.exe проходит без ошибок? В реестре создаются ключи HKEY_CLASSES_ROOTAddIn.AddIn и HKEY_CLASSES_ROOTAddIn.MyComponent?

    В Visual Studio есть возможность автоматически регистрировать компоненту при компиляции. Для этого в свойствах проекта на закладке «Построение» нужно поставить галку «Регистрировать для COM-взаимодействия» и на закладке «Приложение» -> «Сведения о сборке» -> «Сделать сборку видимой для COM».

    Reply
  22. vz1987

    (21) regasm выдает warning RA0000: Registring an unsigned assembly with /codebase can… и в конце пишет, что Types registred successfully.

    Ключи создаются в реестре, но по другому пути: HKEY_USERSS-1-5-21-2345514615-3774356936-3805296294-1001SoftwareClassesAddIn.AddIn. М.б. в этом собака зарыта?

    Reply
  23. Kuzja_R

    (22) vz1987, могу предположить, что у вас нет прав на запись в ветку HKEY_CLASSES_ROOT, поэтому пишет в HKEY_USERS. Попробуйте запускать bat файл с правами администратора.

    Reply
  24. vz1987

    (23) удалось записать в HKEY_CLASSES_ROOT, но результат тот же…

    Reply
  25. vz1987

    (23) разобрался. Поплотней изучил код вашей компоненты и нашел:

    public const string AddInName = «ExpoServer»;

    Соответственно, в 1С, обращение

    Компонента = Новый(«AddIn.ExpoServer»);

    решает все проблемы.

    Еще раз спасибо большое за пример, теперь буду развивать его в своем направлении:)

    Reply
  26. Kuzja_R

    (25) vz1987, извините. Да, моя ошибка. Поправил.

    Reply
  27. Abadonna

    (23)

    могу предположить, что у вас нет прав на запись в ветку HKEY_CLASSES_ROOT

    Вот только поэтому я и свалил на технологию Native 😉

    Вечная проблема прав, особенно в правильных сетках, где юзверь вообще локальных административных прав не имеет.

    Reply
  28. DragonAgo

    Спасибо, можно ввзять на заметку

    Reply
  29. ZOOBR

    (27) Легко сказать, да вот примеров типа «как свалить на Native API» я не нашёл(конечно имею ввиду C# и 1С 8.2), хотя только по данной технологии можно сделать кроссплатформенное решение. Относительно Вк, иногда проще написать библиотеку NET для работы с ней по технологии COM, так как зачастую функционал ВК не требует тесного взаимодействия с 1С, а лишь выполняет роль очередного «костыля», у меня например это шифрование и битовые операции. Поэтому рекомендую оценить необходимость написания ВК по технологии 1С, иногда это необходимо, а иногда и наоборот. Автору конечно+.

    Reply
  30. Abadonna

    (29) ZOOBR,

    Легко сказать, да вот примеров типа «как свалить на Native API» я не нашё

    Могу конечно ошибаться, но на ИТС примеры на CPP, он разве шибко от «до диез» отличается?

    так как зачастую функционал ВК не требует тесного взаимодействия с 1С, а лишь выполняет роль очередного «костыля»

    Тогда ее и писать не стоит, куча всяких костылей 🙁 Я стараюсь делать для себя так, чтобы моя ВК все мои потребности удовлетворяла, не хватило — туда же дописал.

    Вот, например: http://dev.1tsm.ru/project/148

    Reply
  31. ZOOBR

    (30) НЕ поверишь, отличается. И если бы всё с Native API было так гладко да просто, то инфостарт уже наводнился бы болванками типа «Hello World!» на C#. Конечно когда нибудь всё изменится, разберёмся я думаю, тут ничего невозможного конечно нет.

    Под костылём я подразумевал не отдельную библиотеку, а лишь очередную функцию которой она будет пополняться(я у себя например подобную библиотеку юзаю не только для 1С). Всё это я говорил относительно того, что не всегда нужно придерживаться технологии ВК 1С, а можно например просто COM юзать, и пиши туда чего хошь. Да, теряется кроссплатформенность, но этого недостатка не лишена и стандартная ВК 1С(не Native API), которая по сути тот же COM.

    Reply
  32. Abadonna

    (31) ZOOBR,

    «которая по сути тот же COM»

    кто и что по сути com я в курсе, я их испокон веков пишу 😉

    Я вот то, что проблема регистрации в реестре мало кого трогает — так это, видать, юзают в сетках, где кому попало такие права на запись раздаются

    Reply
  33. ZOOBR

    (32) То что ты в курсе я даже не сомневался, не обижайся. Расписывал скорее для остальных читателей комментов. Насчёт прав не совсем согласен. Например всё то что я упоминал работает у меня исключительно на сервере, где регистрацией COM кроме меня никто не ведает. Клиентские шняги стараюсь не делать, а если и приходится, то далеко не для всех(да и зарегистрить ком для пользователя домена проблемы не составляет). Еще раз подчёркиваю, что я никак не умоляю достоинств Native API, а как раз наоборот. Просто сам пишу сейчас на NET и когда в своё время захотел освоить данную технологию инфы толком не нашёл. Адаптировать с CPP конечно как то можно я думаю, но времени на это сейчас нет как видно и у многих других. Буду рад если кто-то поделится когда нибудь «рыбой». Но что-то я уже конечно флудом занялся. Больше не буду.)

    Reply
  34. Abadonna

    (33)

    работает у меня исключительно на сервере, где регистрацией COM кроме меня никто не ведает.

    Во! Ключевой момент! А у нас в холдинге, например, 1С-УППшник мечтает хотя бы о доле прав. А нех! 🙂

    Если утрировать — без разрешения нашего кабинета даже в туалет сходить нельзя :)))

    Reply
  35. dragonCat

    Вопрос: будет ли вышеописанный пример работать на 7.7? Уже почти неделю пытаюсь чформировать ВК на C#, но 7.7 ее видеть категорически отказывается. Зато восьмерка — без проблем.

    Попутно вопрос: комунить вообще когда либо удавалось создать ВК на C# для 1С:7.7?

    Reply
  36. dragonCat

    К сожалению, скачать приведенный в статье пример пока не могу, да и не уверен, что поможет, т.к. все скрины на восьмерке…

    Reply
  37. Kuzja_R

    (35) dragonCat, с 7.7 не работает. Компоненту, сделанную по этому шаблону, 1С видит и подгружает, но при вызове функций на стороне компоненты возникают ошибки приведения типов. Если получится решить вопрос, дайте знать, пожалуйста.

    Reply
  38. dragonCat

    (37) Удалось таки скачать файл, построил по нему dll с небольшими дополнениями (систем формз добавил, что бы мессаджбокс вывести). Все заработало (7.7, 27й движок).

    Код в 1С:

     ИмяВК = «AddIn.MyComponent»;
    Сообщить(«Открываем «+ИмяВК);
    Сообщить(«Результат = » + ПодключитьВнешнююКомпоненту(ИмяВК));
    
    ВК = СоздатьОбъект(ИмяВК);
    Сообщить(Строка(ВК));
    
    Результат = ВК.Go(84, 2);
    Сообщить(«Компонента посчитала! Ответ = «+Результат);
    
    

    Показать

    Результат выводится…

    С типами проблема вполне возможна, но она решается гораздо проще, чем заставить 1С увидеть компоненту 🙂

    Reply
  39. Steelvan

    Поднять форум на 1С с этой компонентой http://infostart.ru/public/149676/ получится?

    Например, объединить http://infostart.ru/public/78388/ и вашу разработку.

    Думаю, это было бы интересно службе поддержки франчайзи или фрилансеру.

    У нас сейчас используется форум на phpBB, приходится дублировать задачи в 1С.

    Позже, может прикрутим автообмен.

    Пишу сюда, т.к. там отключены комментарии.

    Reply
  40. Kuzja_R

    (39) Steelvan, получится. Зачатки такого форума есть в решении ExpoServer: Домоуправление. Если есть конкретные вопросы-предложения — в личку.

    Reply
  41. Zas1402
    Вот только поэтому я и свалил на технологию Native 😉

    Если по Native API компоненту не нужно регистрировать при любом клиенте?

    Reply
  42. fox2010

    При вызове метода asyncEvent.ExternalEvent не из главного потока (например вызываем в событии DataReceived у SerialPort) происходит слкдующая ошибка:

    Невозможно привести COM-объект типа «System.__ComObject» к интерфейсному типу «IAsyncEvent». Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID «{AB634004-F13D-11D0-A459-004095E1DAEA}» возвратил следующую ошибку: Интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)).

    Буду рад любой помощи.

    Reply
  43. Shrek2015

    прикольная штуковина 🙂

    Reply
  44. Mozar

    Отличный шаблон, давно искал такой.

    Reply
  45. Дуб

    Штука интересная. Но ни разу не понял — как инициировать ВнешнееСобытие

    Reply
  46. Kuzja_R

    (45) Дуб, для внешнего события в 1С нужно вызывать asyncEvent.ExternalEvent(…)

    Reply
  47. Alever

    Спасибо большое за довольно простое и четкое объяснение по работе с ДЛЛ-ками. От себя же могу только добавить — нашел интересное видео как сделать DLL на C# в Visual Studio. — http://www.youtube.com/watch?v=hinh5pfnbII

    Reply
  48. ineshyk

    Странно, но на сервере не работает ПодключитьВнешнююКомпоненту. В чем может быть проблема?

    Reply
  49. bsl

    (42) fox2010, Здравствуйте! Также нарвался на данную проблему, но решилось просто: регистрировать библиотеку надо с ключом /tlb, а не /codebase. Под 8.3 работает прекрасно, спасибо автору!

    Reply
  50. vz1987

    Kuzja_R, в случае, если на одной машине планируется использовать несколько внешних компонент, подобно этой, как избежать конфликта имен классов? Ведь в этом шаблоне помимо AddIn.<ИмяКомпоненты> регистрируется еще AddIn.AddIn.

    Reply
  51. dave2000

    Такой вопрос. Если мы обращаемся в 1С к свойствам и методам, описанным в компоненте, то все окей. А если мы вызываем произвольные методы или свойства, тут все как-то странно. Например:

    Компонента.Prop = 3; //Правильное свойство

    Компонента.Prop1 = 3; //Такого свойства нет, но при присваивании даже не ругается

    Компонента.Petyua = 3; //Такого свойства нет, но при присваивании даже не ругается

    Компонента.Popa = 3; //Такого свойства нет, но при присваивании даже не ругается

    Компонента.Go(10, 5); //Правильная функция

    Компонента.Goga(10, 5); //Такой функции нет, но выдает «Недостаточно фактических параметров»

    Компонента.Goga_123(); //Такой функции нет, но выдает «Недостаточно фактических параметров»

    Компонента.Gogogogogo(); //Такой функции нет, но выдает «Недостаточно фактических параметров»

    Почему не ругается на неправильные методы и свойства? Чем это чревато?

    Как научить компоненту распознавать русские названия методов и свойств? Помнится, когда-то давно писал ВК на Делфи, там это было реализовано.

    Reply
  52. ture

    Ссылка на объект не указывает на экземпляр объекта.

    1C 8.2.17

    тута ==> asyncEvent.ExternalEvent(«AddIn», «error», e.ToString());

    после этого ==> булРез=ПодключитьВнешнююКомпоненту(«AddIn.MyComponent»);

    oCom = Новый COMОбъект(«AddIn.MyComponent»);

    oCom.Go(10,0);

    Reply
  53. bayce

    скачал, хороший шаблон

    Reply
  54. karapuzzzz

    Спасибо. Очень выручил шаблон, когда надо было срочно написать драйвер для работы с весами через COM. Единственное, что я не понял, так это регистрация компоненты. Через regasm все получилось нормально. А можно ли это сделать через стандартный regsvr32? При попытке выдает что точка входа в процедуру dllregisterserver не найдена. Информации я не нашел.

    Reply
  55. cool.vlad4

    (54) karapuzzzz, нет, нельзя. дотнетовские сборки регистрируются только через regasm.

    Reply
  56. PoniMan

    Глупый вопрос — когда у какого-либо из интерфейсов скачанного проекта меняю GUID или банально переписываю 1 в 1 код в свой проект, где устанавливаю свои GUID’ы для соответствующих интерфейсов, при подключении в 1С ругается «Тип не определен (AddIn.MyComponent)». Конечно, перед этим сборку пересобираю и перерегистрирую в винде. Не понимаю, почему так может происходить. Кто-нибудь может подсказать?

    Reply
  57. aworld

    (56) PoniMan, судя по этой статье у ряда классов должны быть предопределенные guidы

    Reply
  58. PoniMan

    (57) aworld, спасибо огромное, все перерыл. Все оказалось очевидным. Я наоборот думал, что все GUID должны быть уникальными.

    Reply
  59. Nikola23

    Да, я очень плохо разбираюсь в шарпе, но подскажите плз:

    Я создал на шарпе тип(класс), аналогичный дереву значений 1с с 2мя колонками.

    Возвращаю такое дерево в 1с, определяется как Com_объект. Причина такого поведения понятна.

    Непонятно, как из компоненты инициализировать тип дерево значений и на стороне компоненты заполнить его, а затем возвратить готовый результат.

    А может совсем по другому необходимо действовать?

    Reply
  60. Kuzja_R

    (59) Nikola23, проще всего создать нужное дерево на стороне 1С, потом вызывать функции компоненты, возвращающие простые типы и этими результатами заполнять дерево значений. Если нужно от компоненты получать сложные составные данные, тогда используйте разделители в строках или xml-разметку. На стороне 1С разбираете ответ и заполняете дерево.

    Reply
  61. (3) TigeRuS, Внешние компоненты в 1С давно используют для написания обработчиков драйверов ТО. Так как в «сыром» виде эти драйвера использовать в 1С нереально)

    Reply
  62. allegrosoft

    Почему в win 8 не работает, хотя зарегистрировалась без проблем? В ХР все норм.

    Reply
  63. spec8s

    (62) allegrosoft, win 10 тоже не работает, сам сом загеристрировался

    Reply
  64. BigTaur

    Не пойму почему событие для 1Ски срабатывает, если возникает в методе вызванном из 1Ски и не срабатывает, если возникает внутри. Т.е.

    public void SendEvent()

    {

    asyncEvent.ExternalEvent(«AddIn», «SendEvent», «Внешнее событие»);

    }

    Событие возникает при вызове метода из 1Ски Компонента.SendEvent() и появляется во ВнешнееСобытие().

    И если я например напишу:

    public void SendEvent()

    {

    SendEvInternal();

    }

    public void SendEvent()

    {

    asyncEvent.ExternalEvent(«AddIn», «SendEvent», «Внешнее событие»);

    }

    И вызову Компонента.SendEvent() — то ничего не происходит, 1Ска события не видит.

    Помогите пожалуйста, уже всю голову сломал.

    Reply
  65. BigTaur

    Сам себе отвечу ибо идея пришла сразу после мессаджа, нужно методы запихать в один поток или как оно там. Добавление директивы [STAThread] перед методами решает проблему.

    Reply
  66. izidakg

    то что проверена на 1С:Предприятие 8.3.7.2027 прекрасно, НО не стоит народ путать

    скачивал этот пример еще в 2014, скачал и сейчас — нет ни одного файла чтоб отличался хотя бы временем

    только цена за скачивание с 1 до 5 возросла

    Reply
  67. Kuzja_R

    (66) izidakg, где-то обозначено, что есть изменения в публикации? Вроде нет. Написано о том, что шаблон был успешно проверен на новых платформах. Исходный код не менялся, потому что и старый отлично работает. Как говорится, новые песни нужны тому, у кого старые плохие. А цена — да, теперь другая. Инфляция-с.

    Reply
  68. ture

    (67) что так дешево? разве это не может стоить дороже с Вашей точки зрения?

    Reply
  69. Kuzja_R

    (68) ture, не думаю, что пустая заготовка может стоить дороже. У тех, кто пишет ВК и зарабатывает на этом, полно своего кода. А те, кто только начинает разбираться, вряд ли готовы платить серьезные деньги только за «посмотреть».

    Reply
  70. ture

    (69) пустая заготовка является началом для любой новой компоненты. Это как чистый лист, чтоб сразу начать работу по выбранному предмету, не теряя время на детали красивого взаимодействия с платформой. По опыту написания на с++ скажу прямо — не смыслят гуру в своем коде, глаз уже замалеван и здесь очень важно делиться опытом и показывать альтернативу, чтоб оставалось в коде только полезное и правильное, а не куча фантомов. По идее первичный образец должна давать 1С, но её образец не рассчитывался на конечный продукт. Этот последний факт открывает целое поле для работы и самовыражения.

    Reply
  71. Kuzja_R

    (71) the_master, камрад, у тебя 0 рейтинга, 0 публикаций (платных, бесплатных) за 10 лет на сайте. При этом ты позволяешь себе кого-то в чем-то обвинять? Не пиши сюда больше, пожалуйста.

    Reply
  72. user650881_aleksander.ep-rza

    Вопрос по компоненте

    Почему не может инициализироваться на сервере ?

    Функция ИнициализацияСервер() всегда возвращает ложь.

    скрин во вложении.

    Reply
  73. supiyan

    а по натив апи C# есть что?

    Reply
  74. Free_Danial

    Огромное спасибо доброму человеку за публикацию!!!!!!

    Reply
  75. KonstB

    Есть возможность подключить ВК через: ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>)?

    Reply
  76. kleorn

    После нескольких дней бесплодных попыток (то-ли лыжи не едут, то-ли еще что…) использовать одну из наработок для создания внешней компоненты для 1С — наконец-то сумел «заставить задышать» у себя именно данную публикацию.

    Для этого пришлось применить (наугад) следующие изменения:

    1. Перекомпилировал проект в Visual Studio 2012 (может быть не было необходимости, просто чтобы точно получился 64-разрядный вариант)

    2. Подправить в батничке параметр для regasm-а: вместо «/codebase» написал «/tlb»

    3. Избавился от русских букв в пути к расположению dll

    4. Написал в 1с77:

    ПодключитьВнешнююКомпоненту(«AddIn.MyComponent»);
    j=СоздатьОбъект(«AddIn.MyComponent»);
    Сообщить(j.go(12,3) );

    И оно вернуло «4» 🙂

    Теперь о печальном…

    В 1С:8.3.11.3034 — у меня не заработало.

    Пишу так:

    &НаКлиенте
    Процедура ПослеПодключенияВК(парам1,парам2)экспорт
    С=Новый(«Addin.MyComponent»);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура Инициализация(Команда)
    ОповещениеВК=Новый ОписаниеОповещения(«ПослеПодключенияВК», ЭтаФорма);
    НачатьПодключениеВнешнейКомпоненты(ОповещениеВК,»AddIn.MyComponent»);
    КонецПроцедуры
    

    Показать

    В параметре «парам1» — возвращает «ложь». В строке «С=Новый(«Addin.MyComponent»);» — вылетает с ошибкой «Тип не определен (AddIn.Mycomponent)»

    ОС: Win2012R2x64

    1С: 8.3.11.3034 x64

    VS 2012 x64

    Есть идеи?

    Reply
  77. kleorn

    При этом

    Сообщить(j.go(12,0) );

    Возвращает 0, а обработка внешнего события не вызывается:

    Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)    экспорт
    Сообщить(Источник);
    Сообщить(Событие);
    Сообщить(Данные);
    КонецПроцедуры
    
    Reply
  78. kleorn

    Так, ладно, чего-то намутил с разрядностью(в VS ) — в итоге компонента заработала и на 1С: 8.3.11.3034 x64

    То есть как заработала:

    Вот этот код выполняется без ошибок:

    &НаКлиенте
    Процедура ПослеПодключенияВК(парам1,парам2)экспорт
    С=Новый(«Addin.MyComponent»);
    КонецПроцедуры
    
    &НаКлиенте
    Процедура Инициализация(Команда)
    ОповещениеВК=Новый ОписаниеОповещения(«ПослеПодключенияВК», ЭтаФорма);
    НачатьПодключениеВнешнейКомпоненты(ОповещениеВК,»AddIn.MyComponent»);
    КонецПроцедуры
    

    Показать

    Однако дальше начинаются проблемы. Если добавить вызов демонстрационной функции Go:

    &НаКлиенте
    Процедура ПослеПодключенияВК(парам1,парам2)экспорт
    С=Новый(«Addin.MyComponent»);
    Сообщить(С.GO(12,3));
    КонецПроцедуры
    
    &НаКлиенте
    Процедура Инициализация(Команда)
    ОповещениеВК=Новый ОписаниеОповещения(«ПослеПодключенияВК», ЭтаФорма);
    НачатьПодключениеВнешнейКомпоненты(ОповещениеВК,»AddIn.MyComponent»);
    КонецПроцедуры
    

    Показать

    На строке «Сообщить(С.GO(12,3));» вылетает с ошибкой 1С: «Использование синхронных вызовов на клиенте запрещено».

    Начал читать про асинхронное программирование в C# но пока далек от полного понимания того, как модифицировать исходник сборки.

    Reply
  79. KonstB
    Reply
  80. kleorn

    Большое спасибо, я на нечто подобное втайне надеялся. Ведь действительно, это же 1С вызывает метод объекта на C#-е. Значит она (1С) и должна вызывать его асинхронно.

    Сейчас буду пробовать.

    Правда немного не понял, что Вы указали в строке:

    » С.< b >НачатьВызов< / b >GO(ОповещениеПослеВызова,12,3);»

    Или это просто для отображения тут, на ветке, жирным шрифтом? Но все равно чем-то же должно разделяться «НачатьВызов» и «GO»… в любом случае еще раз спасибо за наводку.

    Reply
  81. kleorn

    Оказывается, ничем не должно разделяться. Именно так и сработало: С.НачатьВызовGO(….

    Reply
  82. kleorn

    По поводу:

    (81)

    Остался вопрос: Как смотреть параметры в отладчике?

    Поясните вопрос.

    Reply
  83. KonstB

    (84) В «синхронном» режиме параметр «Prop» отображается в отладчике. Ничего критичного, просто не удобно.

    Reply
  84. kleorn

    (85)

    Понятно. Ну тут видимо ничего нельзя сделать

    Reply
  85. KonstB

    (86) автор так же сказал

    Reply
  86. and60

    Добрый день.

    Может подскажете, поможет ли мне эта компонента, или совет дадите :

    мне необходимо из одной программы (не 1С):

    — желательно кодом на C# передать в 1С параметр (строку)

    — в 1С отловить это событие

    — обработать

    — каким то макаром вернуть результат обработки в вызвавшую событие программу(пока не знаю как это реализовать)

    И поясните, если не сложно :

    1) 1С без внешней компоненты не может перехватить внешнее событие?

    2) Какие есть варианты возврата результата обработки из 1С ? Не хочется проверять периодически на наличие файла с результатом…

    Reply
  87. seregasame

    У кого то получилось заставить компоненту работать на сервере?

    Reply
  88. seregasame

    (88)

    2) Какие есть варианты возврата результата обработки из 1С ? Не хочется проверять периодически на наличие файла с результатом…

    а http-сервис http-запрос не подойдет?

    Reply
  89. and60

    (90) спасибо, именно так уже давно и реализовал свою часть со стороны 1С (http запрос — запрос на сервере 1С — обработка — возврат результата). Правда со стороны программистки, которая должна была сделать свою часть на С# так ничего и не дождался… но это уже не мой вопрос…

    Reply
  90. OldthiefXXX

    Как заставить ее работать на сервере??????

    Reply
  91. thcrym

    При разработке на С# учел для себя (я использовал MS VS 2017 Community Edition):

    В свойствах проекта

    Вкладка Приложение — Целевая платформа — тут указываете версию .NET, и эта версия должна устанавливаться на машину, где будет вызов COM DLL.

    В этой же вкладке Сведения о сборке — выставляете флаг Сделать сборку видимой для COM. Равнозначно тому если Вы в файле AssemblyInfo.cs изменили строку на [assembly:ComVisible(true)]

    Во вкладке Сборка я выставлял значение Цель платформы в AnyCPU. Чтоб вызывалась из х32 и х64 клиента (поправьте, если ошибаюсь)

    Тут же выставлял флаг Регистрация для COM-взаимодействия. А это равнозначно вызову RegAsm с ключом /codebase. Выставлял чтобы тут же собирать проект и тестировать. Иначе приходилось б вручную вызывать RegAsm.

    У меня Win7x64, 1С клиент толстый x32. Себе на комп установил такую же версию .Net Framework, что и при разработке. Скопировал готовую DLL в C:WindowsSysWOW64. Далее с правами админа командная строка — и выполнить команду C:windowsMicrosoft.NETFrameworkvВашаВерсия.NetRegAsm.exe <Путь+ВашаDLL> /codebase

    Я пробовал также вызвать regasm из каталога с версией Framework64 — не заработало. Видимо если сборка чисто х64, только тогдла регистрация отсюда.

    Надеюсь кому нибудь поможет.

    Reply
  92. rakhimov9

    А возможно ее подключить как com объект?. Т. е. через: Новый COMОбъект()?

    Reply
  93. 0SpAGeTTi010

    Добрый день! Кто владеет информацией по созданию внешней компоненты, которая в итоге будет загружена в ОбщиеМакеты с типом(Двочные данные или внешняя компонента). Нужно знать, как это делается правильно.

    Reply
  94. Eret1k

    А на Linux работать будет?

    Reply
  95. Kuzja_R

    (96) Нет, не будет.

    Reply
  96. uno-c

    (30)Да простит меня ушедший в мир иной, пишу для ищущих в поисковиках, сам как-то несколько часов потратил.

    На на C# в принципе невозможно скомпилировать dll-ку, которая подключалась бы в 1С методом ПодключитьВнешнююКомпоненту(«ИзСиШарпа.dll», «Имя», ТипВнешнейКомпоненты.Native). Обусловлено это тем, что эска ожидает dll на машинном коде, а из сишарпа dll будет на управляемом коде.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *