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

Программирование - Внешние компоненты

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

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

Upd, 25.04.2016

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

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

Скачать файлы

Наименование Файл Версия Размер
AddIn
.zip 37,25Kb
15.04.16
674
.zip 37,25Kb 674 Скачать

См. также

Вознаграждение за ответ
Показать полностью
Комментарии
1. Андрей Краснокутский (Andry.Boris) 54 21.06.12 01:08 Сейчас в теме
Плюсую...
но... есть вопрос?
В длл только элементарные действия или можно работать с базой (справочниками, документами...)
Если можно пример на шарпе с обработкой справочника...
2. Ростислав Кузьмин (Kuzja_R) 320 21.06.12 02:17 Сейчас в теме
(1) Andry.Boris, можно, но я с этим еще не разобрался, поэтому примера нет. Могу, как вариант, дать ссылку. Там этот вопрос рассматривается.
3. TigeRuS 22.06.12 08:36 Сейчас в теме
Вообще не вижу смысла данной компоненты. Все плюсы, которые указывает автор статьи спорные: например, выгрузка/загрузка в xml - это запросто можно сделать используя средства 1С. Я лучше буду программировать либо в 1С, либо на шарпе, но вместе зачем их скрещивать. У них разные области применения.
5. Ростислав Кузьмин (Kuzja_R) 320 22.06.12 10:05 Сейчас в теме
(3) TigeRuS, данной компоненты - это какой? Я в своей ни о каких плюсах не говорю. По ссылке, которую я привел выше тоже плюсы/минусы не рассматриваются. Слово "xml" там встречается ровно 1 раз, когда говорится о способе хранения настроек проекта VB.NET. Вы о чем? Сам придумал преимущество и сам его опроверг. :)
И тот, и другой пример - просто примеры создания внешних компонент: мой - как это сделать на c#, в статье по ссылке - как из компоненты работать с объектами 1С (ответ на (1)).
С утверждением о разных областях применения согласен. Именно по этому они удачно дополняют друг друга через механизм ВК.
8. Василий Казьмин (awk) 689 23.06.12 01:20 Сейчас в теме
(3) TigeRuS, Только сегодня накатал на C# СОМ обертку для Regex, т.к. VBScript.RegExp не понимает UTF-8.
15 мин и счастье в кармане. Так что есть что расширять в 1С. Хотя регулярных выражений как не было в ней, так и нет. Лучше бы 1С вместо XML регулярные выражения в общие объекты включила.
pvlunegov; KilloN; gortol; +3 Ответить
12. Виталий Ермоленко (vitaliy.ermolenko) 50 27.06.12 11:38 Сейчас в теме
(3) TigeRuS, ВК оч. удобны для связки например 1с со скайпом или тем же астериском, из самой 1с по-моему этого не реализовать
61. trade70 10.08.15 04:15 Сейчас в теме
(3) TigeRuS, Внешние компоненты в 1С давно используют для написания обработчиков драйверов ТО. Так как в "сыром" виде эти драйвера использовать в 1С нереально)
4. Сергей Самошин (saiten) 223 22.06.12 09:50 Сейчас в теме
А неплохо. Плюсанул. Но кое-что непонятно:
1. Зачем подключено System.EnterpriseServices? Я что-то упустил?
2. Назначение интерфейса IMyComponent.
3. Работа со свойствами не реализована?
6. Ростислав Кузьмин (Kuzja_R) 320 22.06.12 10:33 Сейчас в теме
(4) saiten,
1. System.EnterpriseServices осталось в наследство от примера из отличной статьи. Там это пространство имен нужно было для работы с COM+. Можно и без него, согласен.
2. Интерфейс IMyComponent нужен для работы процедуры RegisterExtensionAs, которая перебирает все интерфейсы и хэширует имена методов, объявленных в них.
3. Со свойствами - да есть проблема: интерфейсы не могут содержать поля. Может быть кто-то из уважаемой публики предложит решение?

P.S.
Как вариант, добавлять имена свойств в хэш таблицы в процедуре RegisterExtensionAs хардкодом. И реализовать GetPropVal, SetPropVal, IsPropReadable, IsPropWritable.
7. Сергей Самошин (saiten) 223 22.06.12 11:33 Сейчас в теме
Интерфейс IMyComponent нужен для работы процедуры RegisterExtensionAs, которая перебирает все интерфейсы и хэширует имена методов, объявленных в них.
Л-логично... Просто, несколько проще было бы, на мой взгляд делать так: хэш заполнять по this.GetType().GetMethods(), а функционал компоненты отделить от реализации интерфесов:
class myTestComponent:myComponent
{
 public int Go(int Param1, int Param2)
...

А вообще, респект. Делал похожую штуку, только до публикации так и не дошло, бо потребовалась реализация native API под тонкий клиент и не удалось решить красиво проблему со свойствами.
9. Ростислав Кузьмин (Kuzja_R) 320 23.06.12 13:13 Сейчас в теме
(7) saiten, функционал конечно нужно как-то отделять от интерфейса. Только думаю, что так просто не получится. 1С создает и работает с объектом MyComponent (в данном примере). Если мы создаем производный класс myTestComponent и в нем определяем методы, как получит доступ к ним MyComponent? И если принята модель, что пользовательские методы объединяются в отдельный интерфейс, то как туда попадут они из производного класса? Тут нужно что-то другое придумывать...

Если кому интересно, реализовал работу со свойствами. Выложил свежий файл.
10. Сергей Самошин (saiten) 223 24.06.12 12:39 Сейчас в теме
(9)Собственно, 1С создаст объект типа MyTestComponent и будет работать с ним через методы, определённые в MyComponent (естественно, для производного класса, надо установить ComVisible(true) и Guid). При этом this будет указывать на объект MyTestComponent, таким образом ничто не помешает 1С вызывать методы MyTestComponent, имея ссылку на MyComponent через Invoke, т.к. this.GetType().GetMethods() вернёт описания методов как в базового, так и в производного классов. Описывать же пользовательские методы компоненты в отдельном интерфейсе нет необходимости, и логического смысла, в общем-то, тоже: класса вполне достаточно.
11. Ростислав Кузьмин (Kuzja_R) 320 24.06.12 22:18 Сейчас в теме
(10) saiten, да, вынес функционал для подключения к 1С в отдельный класс. Спасибо за предложение!
13. - - (Rebelx) 952 29.06.12 19:32 Сейчас в теме
14. albochkov (Aleksey.Bochkov) 19.07.12 00:13 Сейчас в теме
Наивный вопрос - а нет ли такого же примера на vb? :)
15. Ростислав Кузьмин (Kuzja_R) 320 19.07.12 00:21 Сейчас в теме
(14) albochkov, мне, пока я изучал вопрос, вроде не попадался.
16. Тарас (softest) 01.08.12 22:14 Сейчас в теме
Спасибо, мне помогла взял себе на заметку!
17. Леван Иремадзе (IRLes) 185 02.08.12 01:06 Сейчас в теме
Спасибо, нужно будет поработать над ней для своих целей :)
18. Алексей Выхрыстюк (avhrst) 514 31.08.12 23:21 Сейчас в теме
Плюс однозначно
У меня вызвало теплые воспоминания когда я давно давно писал на C# ВК для 1С v7 :)
19. Ростислав Кузьмин (Kuzja_R) 320 01.09.12 15:47 Сейчас в теме
(18) avhrst, да, технологии сто лет, а готового работающего примера с комментариями что и для чего найти не получилось. Теперь есть.
20. Виталий Захаров (vz1987) 15 06.09.12 17:31 Сейчас в теме
Спасибо большое за пример!
Но меня возникла проблема: ПодключитьВнешнююКомпоненту("AddIn.MyComponent") отрабатывает, а создание объекта Новый("AddIn.MyComponent") вылетает с исключением Тип не определен (AddIn.MyComponent)
21. Ростислав Кузьмин (Kuzja_R) 320 06.09.12 18:06 Сейчас в теме
(20) vz1987, регистрация компоненты с помощью regasm.exe проходит без ошибок? В реестре создаются ключи HKEY_CLASSES_ROOT\AddIn.AddIn и HKEY_CLASSES_ROOT\AddIn.MyComponent?

В Visual Studio есть возможность автоматически регистрировать компоненту при компиляции. Для этого в свойствах проекта на закладке "Построение" нужно поставить галку "Регистрировать для COM-взаимодействия" и на закладке "Приложение" -> "Сведения о сборке" -> "Сделать сборку видимой для COM".
22. Виталий Захаров (vz1987) 15 07.09.12 20:45 Сейчас в теме
(21) regasm выдает warning RA0000: Registring an unsigned assembly with /codebase can... и в конце пишет, что Types registred successfully.
Ключи создаются в реестре, но по другому пути: HKEY_USERS\S-1-5-21-2345514615-3774356936-3805296294-1001\Software\Classes\AddIn.AddIn. М.б. в этом собака зарыта?
23. Ростислав Кузьмин (Kuzja_R) 320 07.09.12 21:30 Сейчас в теме
(22) vz1987, могу предположить, что у вас нет прав на запись в ветку HKEY_CLASSES_ROOT, поэтому пишет в HKEY_USERS. Попробуйте запускать bat файл с правами администратора.
24. Виталий Захаров (vz1987) 15 12.09.12 15:17 Сейчас в теме
(23) удалось записать в HKEY_CLASSES_ROOT, но результат тот же...
25. Виталий Захаров (vz1987) 15 12.09.12 15:41 Сейчас в теме
(23) разобрался. Поплотней изучил код вашей компоненты и нашел:
public const string AddInName = "ExpoServer";
Соответственно, в 1С, обращение
Компонента = Новый("AddIn.ExpoServer");
решает все проблемы.
Еще раз спасибо большое за пример, теперь буду развивать его в своем направлении:)
26. Ростислав Кузьмин (Kuzja_R) 320 12.09.12 16:20 Сейчас в теме
(25) vz1987, извините. Да, моя ошибка. Поправил.
27. Аркадий Кучер (Abadonna) 3711 21.09.12 05:32 Сейчас в теме
(23)
могу предположить, что у вас нет прав на запись в ветку HKEY_CLASSES_ROOT

Вот только поэтому я и свалил на технологию Native ;)
Вечная проблема прав, особенно в правильных сетках, где юзверь вообще локальных административных прав не имеет.
29. ZOOBR (ZOOBR) 02.11.12 22:55 Сейчас в теме
(27) Легко сказать, да вот примеров типа "как свалить на Native API" я не нашёл(конечно имею ввиду C# и 1С 8.2), хотя только по данной технологии можно сделать кроссплатформенное решение. Относительно Вк, иногда проще написать библиотеку NET для работы с ней по технологии COM, так как зачастую функционал ВК не требует тесного взаимодействия с 1С, а лишь выполняет роль очередного "костыля", у меня например это шифрование и битовые операции. Поэтому рекомендую оценить необходимость написания ВК по технологии 1С, иногда это необходимо, а иногда и наоборот. Автору конечно+.
30. Аркадий Кучер (Abadonna) 3711 03.11.12 06:30 Сейчас в теме
(29) ZOOBR,
Легко сказать, да вот примеров типа "как свалить на Native API" я не нашё

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

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

Тогда ее и писать не стоит, куча всяких костылей :( Я стараюсь делать для себя так, чтобы моя ВК все мои потребности удовлетворяла, не хватило - туда же дописал.
Вот, например: http://dev.1tsm.ru/project/148
31. ZOOBR (ZOOBR) 03.11.12 14:20 Сейчас в теме
(30) НЕ поверишь, отличается. И если бы всё с Native API было так гладко да просто, то инфостарт уже наводнился бы болванками типа "Hello World!" на C#. Конечно когда нибудь всё изменится, разберёмся я думаю, тут ничего невозможного конечно нет.
Под костылём я подразумевал не отдельную библиотеку, а лишь очередную функцию которой она будет пополняться(я у себя например подобную библиотеку юзаю не только для 1С). Всё это я говорил относительно того, что не всегда нужно придерживаться технологии ВК 1С, а можно например просто COM юзать, и пиши туда чего хошь. Да, теряется кроссплатформенность, но этого недостатка не лишена и стандартная ВК 1С(не Native API), которая по сути тот же COM.
32. Аркадий Кучер (Abadonna) 3711 03.11.12 14:28 Сейчас в теме
(31) ZOOBR,
"которая по сути тот же COM"
кто и что по сути com я в курсе, я их испокон веков пишу ;)
Я вот то, что проблема регистрации в реестре мало кого трогает - так это, видать, юзают в сетках, где кому попало такие права на запись раздаются
33. ZOOBR (ZOOBR) 03.11.12 23:59 Сейчас в теме
(32) То что ты в курсе я даже не сомневался, не обижайся. Расписывал скорее для остальных читателей комментов. Насчёт прав не совсем согласен. Например всё то что я упоминал работает у меня исключительно на сервере, где регистрацией COM кроме меня никто не ведает. Клиентские шняги стараюсь не делать, а если и приходится, то далеко не для всех(да и зарегистрить ком для пользователя домена проблемы не составляет). Еще раз подчёркиваю, что я никак не умоляю достоинств Native API, а как раз наоборот. Просто сам пишу сейчас на NET и когда в своё время захотел освоить данную технологию инфы толком не нашёл. Адаптировать с CPP конечно как то можно я думаю, но времени на это сейчас нет как видно и у многих других. Буду рад если кто-то поделится когда нибудь "рыбой". Но что-то я уже конечно флудом занялся. Больше не буду.)
34. Аркадий Кучер (Abadonna) 3711 04.11.12 04:30 Сейчас в теме
(33)
работает у меня исключительно на сервере, где регистрацией COM кроме меня никто не ведает.

Во! Ключевой момент! А у нас в холдинге, например, 1С-УППшник мечтает хотя бы о доле прав. А нех! :)
Если утрировать - без разрешения нашего кабинета даже в туалет сходить нельзя :)))
28. Dragon Ago (DragonAgo) 8 21.09.12 08:35 Сейчас в теме
Спасибо, можно ввзять на заметку
35. Игорь DC (dragonCat) 28.11.12 16:15 Сейчас в теме
Вопрос: будет ли вышеописанный пример работать на 7.7? Уже почти неделю пытаюсь чформировать ВК на C#, но 7.7 ее видеть категорически отказывается. Зато восьмерка - без проблем.
Попутно вопрос: комунить вообще когда либо удавалось создать ВК на C# для 1С:7.7?
37. Ростислав Кузьмин (Kuzja_R) 320 28.11.12 17:05 Сейчас в теме
(35) dragonCat, с 7.7 не работает. Компоненту, сделанную по этому шаблону, 1С видит и подгружает, но при вызове функций на стороне компоненты возникают ошибки приведения типов. Если получится решить вопрос, дайте знать, пожалуйста.
38. Игорь DC (dragonCat) 28.11.12 17:44 Сейчас в теме
(37) Удалось таки скачать файл, построил по нему dll с небольшими дополнениями (систем формз добавил, что бы мессаджбокс вывести). Все заработало (7.7, 27й движок).

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


Результат выводится...
С типами проблема вполне возможна, но она решается гораздо проще, чем заставить 1С увидеть компоненту :)
36. Игорь DC (dragonCat) 28.11.12 16:16 Сейчас в теме
К сожалению, скачать приведенный в статье пример пока не могу, да и не уверен, что поможет, т.к. все скрины на восьмерке...
39. Игорь Steelvan (Steelvan) 31 31.03.13 11:43 Сейчас в теме
Поднять форум на 1С с этой компонентой http://infostart.ru/public/149676/ получится?

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

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

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

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

Пишу сюда, т.к. там отключены комментарии.
40. Ростислав Кузьмин (Kuzja_R) 320 31.03.13 13:07 Сейчас в теме
(39) Steelvan, получится. Зачатки такого форума есть в решении ExpoServer: Домоуправление. Если есть конкретные вопросы-предложения - в личку.
41. Игор Мудрицкий (Zas1402) 11.06.13 11:25 Сейчас в теме
Вот только поэтому я и свалил на технологию Native ;)

Если по Native API компоненту не нужно регистрировать при любом клиенте?
42. arnold kurkov (fox2010) 17.07.13 15:46 Сейчас в теме
При вызове метода asyncEvent.ExternalEvent не из главного потока (например вызываем в событии DataReceived у SerialPort) происходит слкдующая ошибка:
Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "IAsyncEvent". Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID "{AB634004-F13D-11D0-A459-004095E1DAEA}" возвратил следующую ошибку: Интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)).

Буду рад любой помощи.
49. Сергей Биржевой (bsl) 22.11.14 16:15 Сейчас в теме
(42) fox2010, Здравствуйте! Также нарвался на данную проблему, но решилось просто: регистрировать библиотеку надо с ключом /tlb, а не /codebase. Под 8.3 работает прекрасно, спасибо автору!
sigmov; bss; +2 Ответить
43. Shrek Shrek (Shrek2015) 18.07.13 10:34 Сейчас в теме
44. Антон Лаврухин (Mozar) 7 31.07.13 15:24 Сейчас в теме
Отличный шаблон, давно искал такой.
45. Дуб (Дуб) 69 25.09.13 13:41 Сейчас в теме
Штука интересная. Но ни разу не понял - как инициировать ВнешнееСобытие
46. Ростислав Кузьмин (Kuzja_R) 320 25.09.13 14:35 Сейчас в теме
(45) Дуб, для внешнего события в 1С нужно вызывать asyncEvent.ExternalEvent(...)
47. Alever (Alever) 4 03.02.14 09:38 Сейчас в теме
Спасибо большое за довольно простое и четкое объяснение по работе с ДЛЛ-ками. От себя же могу только добавить - нашел интересное видео как сделать DLL на C# в Visual Studio. - http://www.youtube.com/watch?v=hinh5pfnbII
Free_Danial; +1 Ответить
48. Игорь Нешик (ineshyk) 14.10.14 17:38 Сейчас в теме
Странно, но на сервере не работает ПодключитьВнешнююКомпоненту. В чем может быть проблема?
50. Виталий Захаров (vz1987) 15 04.02.15 19:10 Сейчас в теме
Kuzja_R, в случае, если на одной машине планируется использовать несколько внешних компонент, подобно этой, как избежать конфликта имен классов? Ведь в этом шаблоне помимо AddIn.<ИмяКомпоненты> регистрируется еще AddIn.AddIn.
51. Dave Nikolsky (dave2000) 89 12.02.15 15:44 Сейчас в теме
Такой вопрос. Если мы обращаемся в 1С к свойствам и методам, описанным в компоненте, то все окей. А если мы вызываем произвольные методы или свойства, тут все как-то странно. Например:

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

Компонента.Go(10, 5); //Правильная функция
Компонента.Goga(10, 5); //Такой функции нет, но выдает "Недостаточно фактических параметров"
Компонента.Goga_123(); //Такой функции нет, но выдает "Недостаточно фактических параметров"
Компонента.Gogogogogo(); //Такой функции нет, но выдает "Недостаточно фактических параметров"

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

Как научить компоненту распознавать русские названия методов и свойств? Помнится, когда-то давно писал ВК на Делфи, там это было реализовано.
52. c+ + (ture) 233 25.02.15 17:45 Сейчас в теме
Ссылка на объект не указывает на экземпляр объекта.
1C 8.2.17
тута ==> asyncEvent.ExternalEvent("AddIn", "error", e.ToString());

после этого ==> булРез=ПодключитьВнешнююКомпоненту("AddIn.MyComponent");
oCom = Новый COMОбъект("AddIn.MyComponent");
oCom.Go(10,0);
53. Dima Dima (bayce) 24 02.03.15 21:30 Сейчас в теме
54. Кирилл Бондаренко (karapuzzzz) 60 23.03.15 12:11 Сейчас в теме
Спасибо. Очень выручил шаблон, когда надо было срочно написать драйвер для работы с весами через COM. Единственное, что я не понял, так это регистрация компоненты. Через regasm все получилось нормально. А можно ли это сделать через стандартный regsvr32? При попытке выдает что точка входа в процедуру dllregisterserver не найдена. Информации я не нашел.
55. Ийон Тихий (cool.vlad4) 43 24.03.15 10:49 Сейчас в теме
(54) karapuzzzz, нет, нельзя. дотнетовские сборки регистрируются только через regasm.
56. Владимир Панимаскин (PoniMan) 21.05.15 02:07 Сейчас в теме
Глупый вопрос - когда у какого-либо из интерфейсов скачанного проекта меняю GUID или банально переписываю 1 в 1 код в свой проект, где устанавливаю свои GUID'ы для соответствующих интерфейсов, при подключении в 1С ругается "Тип не определен (AddIn.MyComponent)". Конечно, перед этим сборку пересобираю и перерегистрирую в винде. Не понимаю, почему так может происходить. Кто-нибудь может подсказать?
57. Амир Хасанов (aworld) 26.05.15 22:18 Сейчас в теме
(56) PoniMan, судя по этой статье у ряда классов должны быть предопределенные guidы
58. Владимир Панимаскин (PoniMan) 09.06.15 12:48 Сейчас в теме
(57) aworld, спасибо огромное, все перерыл. Все оказалось очевидным. Я наоборот думал, что все GUID должны быть уникальными.
59. Николай Крылов (Nikola23) 375 09.08.15 22:32 Сейчас в теме
Да, я очень плохо разбираюсь в шарпе, но подскажите плз:
Я создал на шарпе тип(класс), аналогичный дереву значений 1с с 2мя колонками.
Возвращаю такое дерево в 1с, определяется как Com_объект. Причина такого поведения понятна.
Непонятно, как из компоненты инициализировать тип дерево значений и на стороне компоненты заполнить его, а затем возвратить готовый результат.

А может совсем по другому необходимо действовать?
60. Ростислав Кузьмин (Kuzja_R) 320 09.08.15 23:41 Сейчас в теме
(59) Nikola23, проще всего создать нужное дерево на стороне 1С, потом вызывать функции компоненты, возвращающие простые типы и этими результатами заполнять дерево значений. Если нужно от компоненты получать сложные составные данные, тогда используйте разделители в строках или xml-разметку. На стороне 1С разбираете ответ и заполняете дерево.
62. IMalyshev (allegrosoft) 40 27.08.15 22:08 Сейчас в теме
Почему в win 8 не работает, хотя зарегистрировалась без проблем? В ХР все норм.
63. Валерий Березуцких (spec8s) 248 02.09.15 08:20 Сейчас в теме
(62) allegrosoft, win 10 тоже не работает, сам сом загеристрировался
64. Mishgan Shvaiko (BigTaur) 59 22.01.16 14:56 Сейчас в теме
Не пойму почему событие для 1Ски срабатывает, если возникает в методе вызванном из 1Ски и не срабатывает, если возникает внутри. Т.е.
public void SendEvent()
{
asyncEvent.ExternalEvent("AddIn", "SendEvent", "Внешнее событие");
}
Событие возникает при вызове метода из 1Ски Компонента.SendEvent() и появляется во ВнешнееСобытие().
И если я например напишу:
public void SendEvent()
{
SendEvInternal();
}

public void SendEvent()
{
asyncEvent.ExternalEvent("AddIn", "SendEvent", "Внешнее событие");
}
И вызову Компонента.SendEvent() - то ничего не происходит, 1Ска события не видит.
Помогите пожалуйста, уже всю голову сломал.
65. Mishgan Shvaiko (BigTaur) 59 22.01.16 15:17 Сейчас в теме
Сам себе отвечу ибо идея пришла сразу после мессаджа, нужно методы запихать в один поток или как оно там. Добавление директивы [STAThread] перед методами решает проблему.
66. Сергей Пономарёв (izidakg) 135 04.05.16 23:28 Сейчас в теме
то что проверена на 1С:Предприятие 8.3.7.2027 прекрасно, НО не стоит народ путать
скачивал этот пример еще в 2014, скачал и сейчас - нет ни одного файла чтоб отличался хотя бы временем
только цена за скачивание с 1 до 5 возросла
67. Ростислав Кузьмин (Kuzja_R) 320 04.05.16 23:36 Сейчас в теме
(66) izidakg, где-то обозначено, что есть изменения в публикации? Вроде нет. Написано о том, что шаблон был успешно проверен на новых платформах. Исходный код не менялся, потому что и старый отлично работает. Как говорится, новые песни нужны тому, у кого старые плохие. А цена - да, теперь другая. Инфляция-с.
68. c+ + (ture) 233 05.05.16 16:47 Сейчас в теме
(67) что так дешево? разве это не может стоить дороже с Вашей точки зрения?
69. Ростислав Кузьмин (Kuzja_R) 320 05.05.16 17:52 Сейчас в теме
(68) ture, не думаю, что пустая заготовка может стоить дороже. У тех, кто пишет ВК и зарабатывает на этом, полно своего кода. А те, кто только начинает разбираться, вряд ли готовы платить серьезные деньги только за "посмотреть".
70. c+ + (ture) 233 06.05.16 10:05 Сейчас в теме
(69) пустая заготовка является началом для любой новой компоненты. Это как чистый лист, чтоб сразу начать работу по выбранному предмету, не теряя время на детали красивого взаимодействия с платформой. По опыту написания на с++ скажу прямо - не смыслят гуру в своем коде, глаз уже замалеван и здесь очень важно делиться опытом и показывать альтернативу, чтоб оставалось в коде только полезное и правильное, а не куча фантомов. По идее первичный образец должна давать 1С, но её образец не рассчитывался на конечный продукт. Этот последний факт открывает целое поле для работы и самовыражения.
71. Николай (the_master) 22.08.16 06:37 Сейчас в теме
Пустая и не рабочая заготовка, но жлобство - "наше все"!!!!
72. Ростислав Кузьмин (Kuzja_R) 320 22.08.16 17:09 Сейчас в теме
(71) the_master, камрад, у тебя 0 рейтинга, 0 публикаций (платных, бесплатных) за 10 лет на сайте. При этом ты позволяешь себе кого-то в чем-то обвинять? Не пиши сюда больше, пожалуйста.
73. Алексинский Александр (user650881_aleksander.ep-rza) 13.12.16 13:22 Сейчас в теме
Вопрос по компоненте
Почему не может инициализироваться на сервере ?
Функция ИнициализацияСервер() всегда возвращает ложь.
скрин во вложении.
Прикрепленные файлы:
74. Supiyan Dzhabrailov (supiyan) 25.12.16 16:22 Сейчас в теме
а по натив апи C# есть что?
76. Nilch Nilch (Free_Danial) 15 07.10.17 21:39 Сейчас в теме
Огромное спасибо доброму человеку за публикацию!!!!!!
77. Konstantin Konstantin (KonstB) 169 08.02.18 00:06 Сейчас в теме
Есть возможность подключить ВК через: ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>)?
78. Максим Кан (kleorn) 28.02.18 10:52 Сейчас в теме
После нескольких дней бесплодных попыток (то-ли лыжи не едут, то-ли еще что...) использовать одну из наработок для создания внешней компоненты для 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

Есть идеи?
79. Максим Кан (kleorn) 03.03.18 23:36 Сейчас в теме
При этом
Сообщить(j.go(12,0) );
Возвращает 0, а обработка внешнего события не вызывается:

Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)    экспорт
	Сообщить(Источник);
	Сообщить(Событие);
	Сообщить(Данные);
КонецПроцедуры
80. Максим Кан (kleorn) 06.03.18 13:07 Сейчас в теме
Так, ладно, чего-то намутил с разрядностью(в 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# но пока далек от полного понимания того, как модифицировать исходник сборки.
81. Konstantin Konstantin (KonstB) 169 06.03.18 22:09 Сейчас в теме
(80) Ничего не надо модифицировать -> Надо читать ИТС! )))))

Сам вчера с этим столкнулся, когда компоненту на конфе с запретом синхронных вызовов запустил.

Скопировал с ИТС: https://its.1c.ru/db/v839doc#bookmark:dev:TI000001867

Использование внешних компонент в асинхронном режиме имеет ряд особенностей:

1. Подключение внешней компоненты выполняется с помощью асинхронного метода НачатьПодключениеВнешнейКомпоненты().

2. Для обращения к свойствам внешней компоненты следует использовать асинхронные методы НачатьУстановку<ИмяСвойства>() и НачатьПолучение<ИмяСвойства>().

3. Вместо обращения к методу компоненты следует использовать асинхронные методы НачатьВызов<ИмяМетода>().

Методы Начать…() автоматически добавляются платформой к существующим свойствам и методам внешней компоненты. Саму внешнюю компоненту не требуется отдельно перерабатывать для поддержки работы в асинхронном режиме, однако необходимо выполнить перекомпиляцию существующей внешней компоненты для поддержки асинхронной работы.

Для метода НачатьВызов…() первым параметров следует указывать описание оповещения, а остальные параметры соответствуют набору параметров оригинального метода внешней компоненты.

При использовании веб-браузеров Google Chrome и Mozilla Firefox поддерживается только асинхронное подключение и использование внешних компонент, в том время как для других веб-браузеров допустимо использование как синхронного, так и асинхронного способа работы. Это определяется свойством конфигурации Режим использования синхронных вызовов расширений платформы и внешних компонент (см. здесь).
Показать


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

&НаКлиенте
Процедура ПослеВызова(РезультатВызова, ПараметрыВызова, ДополнительныеПараметры) Экспорт

	Сообщить(РезультатВызова);	

КонецПроцедуры // ПослеВызова()

Показать


Остался вопрос: Как смотреть параметры в отладчике?
84. Максим Кан (kleorn) 06.03.18 23:07 Сейчас в теме
По поводу:
(81)
Остался вопрос: Как смотреть параметры в отладчике?

Поясните вопрос.
85. Konstantin Konstantin (KonstB) 169 06.03.18 23:47 Сейчас в теме
(84) В "синхронном" режиме параметр "Prop" отображается в отладчике. Ничего критичного, просто не удобно.
Прикрепленные файлы:
86. Максим Кан (kleorn) 07.03.18 09:53 Сейчас в теме
(85)
Понятно. Ну тут видимо ничего нельзя сделать
87. Konstantin Konstantin (KonstB) 169 09.03.18 20:06 Сейчас в теме
82. Максим Кан (kleorn) 06.03.18 22:32 Сейчас в теме
Большое спасибо, я на нечто подобное втайне надеялся. Ведь действительно, это же 1С вызывает метод объекта на C#-е. Значит она (1С) и должна вызывать его асинхронно.
Сейчас буду пробовать.
Правда немного не понял, что Вы указали в строке:
" С.< b >НачатьВызов< / b >GO(ОповещениеПослеВызова,12,3);"
Или это просто для отображения тут, на ветке, жирным шрифтом? Но все равно чем-то же должно разделяться "НачатьВызов" и "GO"... в любом случае еще раз спасибо за наводку.
83. Максим Кан (kleorn) 06.03.18 22:48 Сейчас в теме
Оказывается, ничем не должно разделяться. Именно так и сработало: С.НачатьВызовGO(....
88. and60 a (and60) 27.04.18 11:28 Сейчас в теме
Добрый день.
Может подскажете, поможет ли мне эта компонента, или совет дадите :
мне необходимо из одной программы (не 1С):
- желательно кодом на C# передать в 1С параметр (строку)
- в 1С отловить это событие
- обработать
- каким то макаром вернуть результат обработки в вызвавшую событие программу(пока не знаю как это реализовать)

И поясните, если не сложно :
1) 1С без внешней компоненты не может перехватить внешнее событие?
2) Какие есть варианты возврата результата обработки из 1С ? Не хочется проверять периодически на наличие файла с результатом...
Оставьте свое сообщение