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


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

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

Upd, 25.04.2026

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

  • 1С:Предприятие 8.3.7.2027
  • MS Visual Studio Express 2026 для 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 не будет опубликован. Обязательные поля помечены *