gifts2017

Новая версия 1С:Предприятие 8.2 конфликтует с C# и .Net framework

Опубликовал Сергей Карташев (Elisy) в раздел Программирование - Практика программирования

Суть конфликта 1С 8.2 с C# и .Net framework в следующем. В версии 8.2 1С анонсировала новый способ написания внешних компонент 1С с использованием так называемого Native API. Самое интересное, что на C# предложенный подход реализовать невозможно, а реализация Native API на VC++/CLI теоретически возможна, но при попытке подключения DLL, скомпилированных с опцией /CLR, происходит зависание 1С (версия 8.2.13.202). Еще один конфликт – в новой версии 1С нет поддержки технологии ActiveX, на основе которой многие разработчики вставляли в формы 1С свои WinForms-приложения.

Многие слышали о выходе новой версии 1С:Предприятие 8.2 и знают о планах отказаться от поддержки 8.1 в первом квартале 2011 года. Мое мнение – 1С 8.2 – это сырой недоработанный продукт, который можно отнести к пре-бета/бета стадии. А с 8.1 разработчикам проще перейти на Asp.Net (например, через Elisy LinqTo1C), чем на управляемые формы 8.2. К такому выводу я пришел после 2 недельной попытки перевести наши .Net-проекты с версии 8.1 на более новую версию 1С 8.2. Заметка эта написана больше не для критики, а чтобы определить новую для определенного круга .Net-разработчиков проблему, попытаться донести ее до 1С и постараться совместно решить в текущей или новых версиях популярного продукта 1С:Предприятие 8.2.

Суть конфликта 1С 8.2 с C# и .Net framework в следующем. В версии 8.2 1С анонсировала новый способ написания внешних компонент 1С с использованием так называемого Native API. Самое интересное, что на C# предложенный подход реализовать невозможно, а реализация Native API на VC++/CLI теоретически возможна, но при попытке подключения DLL, скомпилированных с опцией /CLR, происходит зависание 1С (версия 8.2.13.202). Еще один конфликт – в новой версии 1С нет поддержки технологии ActiveX, на основе которой многие разработчики вставляли в формы 1С свои WinForms-приложения.

Простейший способ воспроизвести проблему зависания: включить опцию /CLR на проект-пример от 1С про таймер NativeAPI. Зазиповать DLL вместе с файлом MANIFEST.xml в макет кофигурации 1С 8.2 и выполнить следующий код на форме:

&НаКлиенте
Процедура TestNativeApi(Команда)
    УстановитьВнешнююКомпоненту("ОбщийМакет.ElisyNetBridge4");
    Сообщить(ПодключитьВнешнююКомпоненту("ОбщийМакет.ElisyNetBridge4", "ElisyNetBridge", ТипВнешнейКомпоненты.Native));	
    TestNativeApiServer();
КонецПроцедуры

&НаСервере
Процедура TestNativeApiServer()
    Сообщить(ПодключитьВнешнююКомпоненту("ОбщийМакет.ElisyNetBridge4", "ElisyNetBridge", ТипВнешнейКомпоненты.Native));	
КонецПроцедуры

Комментируя код, относящийся к клиенту или серверу, можно понять, что проблема характерна как для клиента, так и для сервера.

Еще одна проблема – отказ от поддержки ActiveX на управляемых формах 1С 8.2. Раньше многие .Net-разработчики писали WinForms проекты, которые можно было вставлять на формы 1С в версии 8.1. Сейчас нужно использовать какие-то обходные маневры, чтобы добиться одинакового со старой версией результата.

Я не хочу сказать, что больше не осталось способов работать с .Net-проектами из 1С, я хочу показать, что новая версия 1С недружелюбно относится к .Net, ограничивая поддержку и переводя свои API на заведомо неподдерживаемый формат.

Последняя важная проблема – это отсутствие заявленной функциональности в технологии написания внешних компонент (ВК) для ВК на основе веб-браузера. Начал делать реализацию ВК для веб-клиента. Долго разобраться не мог, почему не работает, начал копать вглубь исходных кодов JScript. Оказалось функциональность в 1С просто недореализована. В 8.2.10.73 для веб-браузера в коде JScript на команды, например, writeValue, registerProfileAs, readValue стоят тупо заглушки. А addError - вместо того, чтобы выводить ошибку в окно сообщений, как в предыдущих версиях 1С - выводит модальное диалоговое окно. Такие ошибки можно находить в бета-версии, но никак не в официальном релизе.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Ийон Тихий (cool.vlad4) 15.12.10 14:29
Да-м жить становится интереснее...
2. Misha ⁠ (Magister) 15.12.10 14:54
Естественно, какой нафиг .NET может быть на Linux? Mono не предлагать. :D
3. Игорь Исхаков (Ish_2) 15.12.10 14:55
Заметка эта написана больше не для критики, а чтобы определить новую для определенного круга .Net-разработчиков проблему, попытаться донести ее до 1С и постараться совместно решить в текущей или новых версиях популярного продукта 1С:Предприятие 8.2.


Совместно решить ? с 1С ? - Ох, вряд ли.
Думаю , выкручиваться будет каждый разработчик ВК как сможет.
Разработчик ВК для 1с работает на свой страх и риск.
На свой страх и риск и действуют покупатели , покупающие такие ВК.
Такова жизнь.
awk; Spartan; cool.vlad4; OLEG4120; +4 Ответить
4. Ийон Тихий (cool.vlad4) 15.12.10 15:15
того глядишь на java перейдем...шучу, но для многих, конечно неприятность, есть у кого-нибудь соображения на сей счет?
5. mirco brons (mirco) 15.12.10 16:46
думаю activeX или аналога точно не будет.
а вот nativeApi поправят, но конечно не скоро...

надо бы попробовать порисовать окна внутри 1с, может получиться придумать идею для замены activeX. Пока что я знаю только как всавить через поле html.
6. Сергей Карташев (Elisy) 16.12.10 06:27
Совместно решить ? с 1С ? - Ох, вряд ли.
Думаю , выкручиваться будет каждый разработчик ВК как сможет.
Разработчик ВК для 1с работает на свой страх и риск.
На свой страх и риск и действуют покупатели , покупающие такие ВК.
Такова жизнь.

Я думаю, достаточно постараться решить силами заинтересованных разработчиков. Проблема общая.
Как я понял в случае с C++/CLR происходит, скорее всего, Loader Lock. Как бороться пока не знаю. При отладке и остановке в отладчике выдается такой стек вызовов:
ntdll.dll!_RtlCompareMemoryUlong@12() + 0x10 bytes
ntdll.dll!@RtlpFreeHeap@16() + 0x10b bytes
ntdll.dll!_RtlFreeHeap@12() + 0xe37 bytes
ntdll.dll!_RtlDebugFreeHeap@12() + 0x1f9 bytes
ntdll.dll!@RtlpFreeHeap@16() + 0x34d58 bytes
ntdll.dll!_RtlFreeHeap@12() + 0xe37 bytes
kernel32.dll!_HeapFree@12() + 0x14 bytes
> clr.dll!EEHeapFree() + 0x22 bytes
clr.dll!EEHeapFreeInProcessHeap() + 0x1e bytes
clr.dll!operator delete[]() + 0x30 bytes
clr.dll!ExecuteDLLForAttach() + 0x114 bytes
clr.dll!ExecuteDLL() + 0xc9 bytes
clr.dll!CorDllMainForThunk() + 0x6b bytes
mscoreei.dll!CorDllMainWorkerForThunk() + 0x74 bytes
mscoreei.dll!_VTableBootstrapThunkInitHelper@4() + 0x1d bytes
mscoreei.dll!_VTableBootstrapThunkInitHelperStub@0() + 0xc bytes

или

> clr.dll!SString::CaseCompareHelper() + 0x2a bytes
clr.dll!SString::EqualsCaseInsensitive() + 0x34fa5 bytes
clr.dll!PEImage::PathEquals() + 0x16 bytes
clr.dll!DomainAssembly::FindIJWModule() - 0x10 bytes
clr.dll!AppDomain::FindIJWDomainFile() + 0x4e bytes
clr.dll!ExecuteDLLForAttach() + 0xc5 bytes
clr.dll!ExecuteDLL() + 0xc9 bytes
clr.dll!CorDllMainForThunk() + 0x6b bytes
mscoreei.dll!CorDllMainWorkerForThunk() + 0x74 bytes
mscoreei.dll!_VTableBootstrapThunkInitHelper@4() + 0x1d bytes
mscoreei.dll!_VTableBootstrapThunkInitHelperStub@0() + 0xc bytes

Может кому-то будет полезно
7. Сергей Карташев (Elisy) 16.12.10 06:30
mirco пишет:

думаю activeX или аналога точно не будет.

а вот nativeApi поправят, но конечно не скоро...



надо бы попробовать порисовать окна внутри 1с, может получиться придумать идею для замены activeX. Пока что я знаю только как всавить через поле html.

Обходные пути можно поискать, но хотелось бы по возможности к NativeAPI подстроиться
8. gilv (Gilev.Vyacheslav) 16.12.10 15:41
занимаетесь какой-то ******!
cool.vlad4; Душелов; +2 Ответить 1
9. Ийон Тихий (cool.vlad4) 16.12.10 17:17
10. Александр Соломатин (v77) 16.12.10 22:47
Автору приснилось, что 1С должна работать с .NET, с которым никогда не собиралась работать.
11. Ийон Тихий (cool.vlad4) 17.12.10 00:14
(10) Может это разработчики 1С не стремятся, ...не знаю что там тебе приснилось, ты публикации автора видел? Elisy .Net Bridge например?
12. Сергей Карташев (Elisy) 17.12.10 06:26
gilv пишет:
занимаетесь какой-то ******!

Действительно занимаюсь ****** вместо компании 1С. Пока не отчаялся. А вот эти люди уже отчаялось и ничего хорошего от 1С не ждут:
http://www.rsdn.ru/forum/dotnet/4081994.aspx
13. Сергей Карташев (Elisy) 17.12.10 06:34
v77 пишет:
Автору приснилось, что 1С должна работать с .NET, с которым никогда не собиралась работать.

Автор не понял 1С. Внешние компоненты нацелены в первую очередь на разработчиков. Сообщество .Net-разработчиков намного больше, чем сообщество 1С-разработчиков. И .Net-разработчиков больше, чем С++ - разработчиков.
Я не прошу полноценной поддержки .Net в 1С, но ПодключитьВнешнююКомпоненту(ProgId) в сервере 8.2 можно же было оставить, как оставили его в клиенте 8.2. Проблем бы стало намного меньше.
14. Сергей Карташев (Elisy) 17.12.10 08:09
Интересный вопрос: почему новая технология Native API уступает старой технологии COM отсутствием доступа к методам глобального контекста (AppDispatch)? Ведь все новое должно быть лучше старого...
15. Игорь Исхаков (Ish_2) 17.12.10 08:16
(12) "Пока не отчаялся. А вот эти люди уже отчаялось и ничего хорошего от 1С не ждут:"

Не то чтобы я был на стороне тех кто отчаялся,НО:
Занимая монопольное положение на своем рынке , почему "1с" должна заботиться о .net-разработчиках ?
С какой стати ?
Что -то мне подсказывает , что при разработке нового релиза "1с" меньше всего думает о .net-разработчиках,
много их или мало.
Сколько решений на 1с , использующих .net ? - Оптимистичный ответ 0.5% !
Видя соотношение 99.5% против 0.5%, человек принимающий решение , вздохнет :
".net-разработчиков , конечно , жаль"
cool.vlad4; +1 Ответить
16. Александр Соломатин (v77) 17.12.10 08:42
(11) Я не фанат .NET и мне эти бриджи и обиды на 1С по барабану.
NativeAPI сделан для С++ и с учетом того, что будет использоваться на Linux.
А ваши свистелки с пирделками 1С не обязана поддерживать. Колупайтесь сами. Кстати, могу за деньги прикрутить ваш .NET к NativeAPI.
17. Сергей Карташев (Elisy) 17.12.10 10:13
v77 пишет:
Кстати, могу за деньги прикрутить ваш .NET к NativeAPI.

Хорошая идея. Готов оплатить "прикручивание" в пределах разумного для последующей общедоступной публикации. Решение должно быть на C# или VC++/CLR, подключаться по технологии Native API (не COM) из 1С 8.2 (Сервер) (без workaround`ов) с реализацией интерфейсов IComponentBase, IInitDoneBase, ILanguageExtenderBase, LocaleBase. Для простоты можно на основе примера с таймером от 1С NativeAPI. Без зависаний при вызове ПодключитьВнешнююКомпоненту из макета.
Сколько это будет стоить и в какой срок?
Spartan; cool.vlad4; Ish_2; +3 Ответить 2
18. Александр Соломатин (v77) 17.12.10 10:37
19. Ийон Тихий (cool.vlad4) 17.12.10 10:39
(16) По моему занятие фанатства надо оставить болельщикам футбола и иже с ними, а в делах сугубо рабочих, в зависимости от задачи, от того кому что удобней, ... ну и от привычки...насчет прикручивания неплохо бы, но меня это интересует пока лишь с точки зрения любопытства, поскольку задачи на 8.2 такой не стоит. Насчет того, что 1С определяет политику своих разработок сама
А ваши свистелки с пирделками 1С не обязана поддерживать
- согласен.
20. Ийон Тихий (cool.vlad4) 17.12.10 10:44
(19) Быть может это обходной прием?
21. Александр Соломатин (v77) 17.12.10 11:04
(20) Ну как тут обойтись без обходных приёмов, если нужно скрестить .NET и native. Первое, что приходит в голову - это сделать прокладку в виде обычной DLL, которая будет подключать остальные ВК, и NativeAPI и обычные. Это будет workaround?
22. Сергей Карташев (Elisy) 17.12.10 12:05
v77 пишет:
(17) А что такое workaround?

Workaround - обходной путь.
Например, обходным путем считается на сервере 8.2 обойти зависания Native API через написание отдельной DLL (без CLR), которая реализуя Native API будет возвращать ссылку void* pConnection из метода bool CAddInNative::Init. Далее ее можно передать уже в COM-объект на C# или VC++/CLR и получить полноценный ВК. По сути ВК - это самописный компонент плюс ссылка на pConnection.
Для такого варианта будет код:

&НаСервере
...
ПодключитьВнешнююКомпоненту("ОбщийМакет.NativeAPI", "NativeAPI", ТипВнешнейКомпоненты.Native);
AddIn = Новый("AddIn.NativeAPI");
intPtr = AddIn.GetConnectionIntPtr();
o = Новый COMОбъект("CSharp.COM");
o.SetConnection(intPtr);

В результате получим C#-объект на стороне сервера со ссылкой на Connection. Результат достигнут, но нужно, чтобы в одной dll (VC++/CLR) была реализация NativeAPI + .Net.
23. Сергей Карташев (Elisy) 17.12.10 12:08
(21) Извиняюсь, не заметил комментария - это будет обходной путь. Мне бы хотелось идеала достигнуть без лижних компонентов и кода.
ActiveX через Html, NativeApi - через свою dll - это не то, что хотелось бы видеть в "любимой" 1С.
24. Ийон Тихий (cool.vlad4) 17.12.10 12:09
(21) наверное нет, хотя как на это посмотреть - все таки реализация не напрямую (23) по моему это совсем не простая задача...
25. Александр Соломатин (v77) 17.12.10 12:26
(23) Если варианты с прокладками не катят, то тогда два варианта.

1) Занести пару-тройку миллионов долларов в микрософт, чтобы они переделали .NET
2) Занести пару-тройку миллионов рублей в 1С, чтобы они переделали NativeAPI
26. Ийон Тихий (cool.vlad4) 17.12.10 12:48
Есть еще 3-й вариант пару-тройку сот рублей в пивбар, и не парится...конец недели все таки...
ЗЫ про пару тройку, миллионов, - можно просто придти в микрософт и они переделают под заказ? ...следующая версия платформы dot net Abramovich
или 1Ё от Прохорова - который работает на альтернативном источнике мыслей
27. Сергей Карташев (Elisy) 17.12.10 13:04
(25) :) Я отправил запрос разработчикам 1С - посмотрим, что ответят ))))))
28. Ийон Тихий (cool.vlad4) 17.12.10 13:05
(28) :D гораздо эффективнее будет отправить письмо с жалобой президенту Белоруссии "Как пропатчить NativeAPI"
ЗЫ Я сначала подумал был отправлен запрос из (25) - чуть со стула не упал...
29. Сергей Карташев (Elisy) 17.12.10 13:05
(26) Действительно - пятница :) - нужно успокоиться. Поздравляю всех с выходом 1С 8.2 :). Обходные пути мы придумаем - не первый раз :). А потом и перепишем 1С, как нужно.
30. steban (steban) 17.12.10 17:19
31. Ийон Тихий (cool.vlad4) 17.12.10 17:34
(30) неужели это то о чем я думаю ... addinnative...хм...
ЗЫ как быстро исполняются...хочу ВК самогенерирующую код... :D

ЗЫ Дай пожалуйста описание, а то кот в мешке...или это просто демонстрация ВК на 8.2, говорящая "нет"...
32. steban (steban) 17.12.10 17:54
Это выгрузка конфигурации в которой есть только общий макет с Native-API ВК (32-битная под винду).
ВК - это пример timer с ИТС, скомпилированый с ключом /clr.
Нормально грузится в тонком и толстом клиентах.
Прикрепленные файлы:
33. Ийон Тихий (cool.vlad4) 17.12.10 18:02
(32) все это для верно для версии 8.2.13.202? у меня ее нет.
34. steban (steban) 17.12.10 18:12
скачай файлик заново

Процедура TestNativeApi()
    УстановитьВнешнююКомпоненту("ОбщийМакет.addinnative");
    Сообщить(ПодключитьВнешнююКомпоненту("ОбщийМакет.addinnative", "Timer", ТипВнешнейКомпоненты.Native));	
КонецПроцедуры

Процедура ПриНачалеРаботыСистемы()
	TestNativeApi();
КонецПроцедуры
...Показать Скрыть
Прикрепленные файлы:
35. steban (steban) 17.12.10 18:49
36. Сергей Карташев (Elisy) 18.12.10 06:14
(35) Это радостное известие означает, что не все еще потеряно. Давайте теперь с ОС разберемся. Предполагаю, что у вас могло заработать на XP или 2003. Вот дословно параметры моего запроса в 1С:
1. ДАННЫЕ ТЕКУЩЕГО КОМПЬЮТЕРА И КОНФИГУРАЦИИ
Версия 1С:Предприятия 8.0: 8.2.13.202
Конфигурация: Тестовая
Версия конфигурации: -
Операционная система: Microsoft Windows 7

Могу добавить, включен UAC. Установлен .Net framework 4.
37. Ийон Тихий (cool.vlad4) 18.12.10 09:56
У меня - 8.2.12, Windows 7 x32, откл UAC, .Net Framework 4
38. Сергей Карташев (Elisy) 18.12.10 10:11
(35) Происходит зависание
Прикрепленные файлы:
39. Сергей Карташев (Elisy) 21.12.10 13:59
Только что пришло сообщение от 1С:
Цитирую:
"Просто включить опцию компилятора /clr недостаточно.
Т.к. платформа взаимодействует с неуправляемым кодом, то дополнительно нужно применять директивы #pragma managed(push, off) #pragma managed(pop) #pragma unmanaged Это объясняется несовпадением C/C++ ABI с ABI управляемого кода.

Так,в файле AddInNative.cpp из примера, перед функцией long GetClassObject(const WCHAR_T* wsName, IComponentBase** pInterface) нужно добавить директиву #pragma unmanaged

в файле AddInNative.h, после #define __ADDINNATIVE_H__ нужно добавить #pragma managed(push, off), а перед #endif //__ADDINNATIVE_H__ #pragma managed(pop)
"
Постараюсь побыстрее проверить
40. Сергей Карташев (Elisy) 22.12.10 12:18
(39) Работает. Принцип такой, что хотя весь проект и компилируется с опцией CLR, но на модуль AddInNative эта настройка не распространяется. Как развивать еще не думал, но этого достаточно, чтобы цивилизованно выдавать сообщение при попытке подключения по Native API: "Native API не поддерживается!" :)
41. Василий Демидов (Душелов) 23.12.10 12:21
Все прекрасно работает и на последнем релизе. И визуальные ActiveX на управляемых формах в тонком клиенте, и обычные ВК.
Не вижу никаких проблем.
42. Василий Демидов (Душелов) 23.12.10 12:38
Толстый клиент обычное приложение
Прикрепленные файлы:
43. Василий Демидов (Душелов) 23.12.10 14:16
Проверено на XP, Win 7 (32 и 64 бита)
44. Сергей Карташев (Elisy) 23.12.10 14:18
(41) Кому нужен толстый клиент на 8.2? Есть хороший и проверенный толстый клиент 8.1. Речь идет о тонком и веб-клиенте.
45. Сергей Карташев (Elisy) 23.12.10 14:23
(41) Могу явно указать проблемы. ActiveX, наверное, штатными средствами проигрываются на управляемых формах 1С? А обычные ВК из 8.1 заработали вдруг невероятным образом на сервере 8.2?
46. Сергей Карташев (Elisy) 23.12.10 14:24
Кому интересно: здесь параллельное обсуждение на mista.ru
http://www.forum.mista.ru/topic.php?id=522583
47. Василий Демидов (Душелов) 23.12.10 14:31
(45) Обычные ВК преспокойно работают на сервере 8.2
Технология управляемых форм не позволяет использовать ActiveX-ы. Потому и используются контейнеры, типа поля html-документа, как описано у меня в статье.
48. Василий Демидов (Душелов) 23.12.10 14:32
(44) Толстый клиент нужен для типовых БП, ЗУП и УПП, которые еще не переведены полностью на управляемые формы.
49. Василий Демидов (Душелов) 23.12.10 14:33
Да и по статье - я так и не понял, где новая версия 8.2 конфликтует с C# и .NET
50. Василий Демидов (Душелов) 23.12.10 14:45
Те же WPF контролы на WinForms-ах в .NET-е используются через контейнер.
Так что это не политика 1С. Это технологии...
51. Сергей Карташев (Elisy) 24.12.10 07:52
(47) Да, как это они работают на сервере 8.2? Можно ссылку на пример такого компонента? Насколько я знаю,
Вот что пишет Радченко:
"Вообще, в синтакс-помощнике описаны два варианта синтаксиса ПодключитьВнешнююКомпоненту():
1. ПодключитьВнешнююКомпоненту(<Местоположение>, <Имя>, <Тип>)
2. ПодключитьВнешнююКомпоненту(<ИдентификаторОбъекта>)
К сожалению дальше есть особенность, которая там не описана, но мы это исправим.
Первый вариант синтаксиса можно использовать и на клиенте, и на сервере и во внешнем соединении.
Второй вариант синтаксиса можно использовать только на клиенте."
Это значит, что на сервере работают только ВК, написанные по технологии NativeAPI. Подскажите мне, пожалуйста, как на C# повторить технологию NativeAPI, подобно примеру 1С на C++.
52. Сергей Карташев (Elisy) 24.12.10 07:53
(47) Я пишу в статье:
"Я не хочу сказать, что больше не осталось способов работать с .Net-проектами из 1С, я хочу показать, что новая версия 1С недружелюбно относится к .Net, ограничивая поддержку и переводя свои API на заведомо неподдерживаемый формат."
53. Сергей Карташев (Elisy) 24.12.10 07:55
(48) А когда будут переведены БП, ЗУП и УПП - это вопрос времени - что прикажете делать? А что делать сейчас касательно УТ11?
54. Василий Демидов (Душелов) 24.12.10 10:45
(53) Для работы в контексте сервера, еще со времен 8.1 (в регламентных заданиях) я использую ActiveX-ы.
55. Василий Демидов (Душелов) 24.12.10 10:53
(52) Новая версия - это "8.2" или "8.2.13.202" ?
56. Василий Демидов (Душелов) 24.12.10 10:53
+55 в заголовке указано "конфликтует" - конфликтов не заметил
57. Василий Демидов (Душелов) 24.12.10 11:00
Мне тоже известны пути вставки ActiveX на управляемые формы 8.2. Но согласитесь, технологию такой вставки нужно рассматривать как обходной путь (workaround). Так как работу выполняет не 1С, а IE.


Зачем пихать все ActiveX-ы на форму?

В 90% случаев достаточно использовать конструктор "Новый COMОбъект()". И все прекрасно работает и на сервере, и на клиенте, и на веб-клиенте.
58. Сергей Карташев (Elisy) 25.12.10 06:05
(55) Новая версия - "8.2.13.202"
(56) Я заметил и разработчики 1С подтвердили: см. (39) . К сожалению - это не помогает, так как управляемый код из такой dll вызывать нельзя.
А проблема осталась - с тем же успехом 1С могло ответить - для нормальной работы примера, нужно убрать опцию /clr. Дело в том, что после предложенного решения 1С любое создание .Net-объекта сопровождается таким же зависанием. Например, вызов простого метода:

#pragma managed
void CAddInNative::InitializeManaged()
{
System::Object^ o = gcnew System::Object();
}
#pragma unmanaged

из методов CAddInNative::CallAsFunc или CAddInNative::Init
Проблема похожа на Loader Lock:
http://msdn.microsoft.com/en-us/library/ms173266(v=vs.80).aspx
59. Сергей Карташев (Elisy) 25.12.10 06:12
(57) Повторюсь - я веду речь о тонком клиенте и сервере 8.2.
1. Новый COMОбъект() создает COM-объект, а не ActiveX. ActiveX подразумевает визуаьлный компонент. Значит использование Новый COMОбъект() ограничено.
2. Если сравнивать использование NativeAPI и Новый COMОбъект() на сервере, то NativeAPI выиграет только за счет того, что подключение его кэшируется и он каждый раз не создается.
3. Внешние компоненты (NativeAPI и сделанные по старой технологии) имеют преимущество в том, что в них передается указатель на АПИ 1С. Это значит, например, что из ВК можно выдать сообщение в окно 1С, а из Новый COMОбъект() затруднительно. Из ВК можно вызвать метод глобального контекста (только для тонкого клиента), а из Новый COMОбъект() - тоже затруднительно.
60. steban (steban) 25.12.10 15:51
Elisy пишет:
управляемый код из такой dll вызывать нельзя

можно
61. steban (steban) 25.12.10 15:54
1С с C# не конфликтует.
Автор конфликтует с головой.
Душелов; +1 Ответить 1
62. Василий Демидов (Душелов) 25.12.10 21:44
Elisy пишет:

(57) Повторюсь - я веду речь о тонком клиенте и сервере 8.2.
1. Новый COMОбъект() создает COM-объект, а не ActiveX. ActiveX подразумевает визуаьлный компонент. Значит использование Новый COMОбъект() ограничено.
2. Если сравнивать использование NativeAPI и Новый COMОбъект() на сервере, то NativeAPI выиграет только за счет того, что подключение его кэшируется и он каждый раз не создается.
3. Внешние компоненты (NativeAPI и сделанные по старой технологии) имеют преимущество в том, что в них передается указатель на АПИ 1С. Это значит, например, что из ВК можно выдать сообщение в окно 1С, а из Новый COMОбъект() затруднительно. Из ВК можно вызвать метод глобального контекста (только для тонкого клиента), а из Новый COMОбъект() - тоже затруднительно.


1. ActiveX - не ком-объект? Ничем не ограничено. Работает, как на сервере, так и на клиенте. И не один год уже. И на всех платформах.
2. Каждый раз можно не создавать. У меня в статье описано хранение 1 объекта без создания каждый раз нового элемента.
3. У комобъекта прекрасно используются события, с помощью которых можно что угодно выводить и показывать в 1С.
63. Сергей Карташев (Elisy) 27.12.10 06:12
(60) Если это из той же оперы, что и (30), то почитай ответ от 1С, которая фактически признала проблемы взаимодействия управляемого и неуправляемого кода в (39). Я повторюсь, что это решение зависает на 1С 8.2 см (35). А если это решение у одних зависает, а у других - нет, то это нестабильное решение, которое в нормальный продукт не вставишь.
64. Сергей Карташев (Elisy) 27.12.10 06:15
(61) Значит Steban объединяются с Душелов и пишут опровержение на статью "Новая версия 1С:Предприятие 8.2 конфликтует с C# и .Net framework". А то, получается, 20 человек поддерживают, а у 2х человек аргументов не хватает, начинают на личности переходить.
65. steban (steban) 27.12.10 09:30
Elisy пишет:
почитай ответ от 1С, которая фактически признала проблемы взаимодействия управляемого и неуправляемого кода в (39).

Ничего они не признали. Они намекнули тебе, что проблема лежит за пределами кода 1с, и намекнули где искать решение.
А потом намекнули еще раз более прозрачно (чтобы даже тебе было понятно):
Из 1С пришел ответ:
"Технические вопросы совместного использования управляемого и неуправляемого кода правильней задавать компании-производителю.
Специалисты компании 1С не имеют доступа к исходным кодам платформы .NET для детального анализа причин неработоспособности."



Я повторюсь, что это решение зависает на 1С 8.2 см (35). А если это решение у одних зависает, а у других - нет, то это нестабильное решение, которое в нормальный продукт не вставишь.

Та хамишь, и при этом еще хочешь чтобы я тебе дал "стабильное решение". А мне лень тратить свое время на решение твоих проблем.
Я хочу, чтобы до тебя дошла простая мысль: "описанное зависание - не проблема 1с и не проблема microsoft, а проблема твоего кода. И в твоих силах это исправить, если вникнуть в тему поглубже, а не орать на весь интернет что 1с с чем-то там конфликтует"
66. steban (steban) 27.12.10 09:44
Elisy пишет:
А то, получается, 20 человек поддерживают, а у 2х человек аргументов не хватает, начинают на личности переходить.

20 плюсиков означают примерно следующее: кому-то из плюсанувших интересна тема "1с + .NET", кому-то интересна тема NativeAPI, кто-то считает что "1с--сакс". Я уверен, что никто из них не писал на C++/CLI.
А насчет аргументов... Я считаю, что достаточно (30) и (60)
67. Сергей Карташев (Elisy) 27.12.10 10:18
(65)

Та хамишь, и при этом еще хочешь чтобы я тебе дал "стабильное решение". А мне лень тратить свое время на решение твоих проблем.
Я хочу, чтобы до тебя дошла простая мысль: "описанное зависание - не проблема 1с и не проблема microsoft, а проблема твоего кода. И в твоих силах это исправить, если вникнуть в тему поглубже, а не орать на весь интернет что 1с с чем-то там конфликтует"

Где я написал, что хочу лично от тебя чего-либо. Я так понимаю, ты предложил решение, оно таким же образом зависает, как и мое. Спасибо, конечно, но этого я и сам достиг. В моих силах было найти в отладчике при зависании при инициализации CLR в методе Init:
ntdll.dll!_RtlEnterCriticalSection@4() + 0x17 bytes
ntdll.dll!_LdrLockLoaderLock@12() + 0x6b bytes
А это значит, что каким-то образом проблема относится к проблеме Loader Lock. Отрицательный результат - тоже результат. Виноват мой код, 1С или Microsoft, меня это уже мало интересует. Сейчас для меня становится очевидным, что нужно искать обходной путь.
68. Сергей Карташев (Elisy) 27.12.10 10:20
(68) Для меня достаточно контраргументов (38) и ответа от 1С. Засим и разойдемся.
69. Ийон Тихий (cool.vlad4) 27.12.10 10:39
Действительно, конструктивного диалога не получается, хотя steban и Душелов, в общем-то правы, описанной проблемы не наблюдал, а порывшись в интернете, набрел на автора этой публикации. На C++/CLI не писал, так, что (66) близок к истине, (хотя писал на шарпе). Так, что склоняюсь к мысли, что тестить надо больше, приводить проблемный код, а то говорить получается, то не о чем. Соглашусь с Гилевым (8).
70. Артур Аюханов (artbear) 27.12.10 12:06
Поддержу (66) - ИМХО именно такой расклад и есть :(
71. steban (steban) 27.12.10 12:20
(68)Блин, опять одно нытьё :(

Vista sp2 32-бит, 1c 8.2.13.202, .NET Framework 4, UAC включен - 1с при загрузке компоненты не виснет и managed-код выполняется.
Win7 64-бит, 1c 8.2.13.202, .NET Framework 4, UAC включен - 1с при загрузке компоненты не виснет и managed-код выполняется.
72. Сергей Карташев (Elisy) 27.12.10 12:44
(71) Ты думаешь, я тебе не доверяю? Я верю тебе, что у тебя работает. Я верю cool.vlad4. Но твое решение постоянно(не временами) виснет у меня на машине также, как и мое. Ты можешь сейчас гарантировать стабильность такого решения всем разработчикам? Я нет. Допускаю, что влиять могут другие программы, вроде, антивируса на моей машине. Но как выявить, пока себе не представляю. По возможности при проверке все их отключил. При этом пример без опции CLR работает нормально - не зависает.
73. steban (steban) 27.12.10 12:59
Elisy пишет:
Но как выявить, пока себе не представляю.

Ну! Давай! осталось сделать маленький шажок - попросить у меня исходники.
74. Ийон Тихий (cool.vlad4) 27.12.10 13:06
(73) Я прошу :D хочется же узнать в чем причина этого загадочного зависания, вдруг это заразно и у меня начнет виснуть :D
75. Сергей Карташев (Elisy) 27.12.10 13:14
(73) Steban, мне не нужны твои исходники и не были нужны. Повторяю, твое решение у меня на машине не работает.
76. steban (steban) 27.12.10 13:20
(75)но ведь хочется понять почему именно не работает?
77. Сергей Карташев (Elisy) 27.12.10 13:29
(76) Хочется, не спорю. Но хочется узнать у того, чье решение у меня стабильно выполняется. Твое решение у меня зависает. Могу дать удаленный доступ, чтобы ты сам удостоверился, чтобы закрыть эту тему.
78. Игорь Исхаков (Ish_2) 27.12.10 14:49
(76) ОФФ.Может быть, выяснить всё спокойно , без перехода на личности ?
79. Сергей Карташев (Elisy) 28.12.10 06:21
(78) Полностью поддерживаю. Прошу прощения, если кого-то непреднамеренно обидел своими высказываниями. Честное слово, никого обидеть не хотел и старался не переходить на личности.
80. Василий Казьмин (awk) 13.01.11 12:26
Не привык пакостить исподтишка. Так что минус обосную:

1С решает определенный круг задач. И в описание этого круга задач поддержка .net не входит. Есть некий интерфейс позволяющий расширить круг задач, но это уже не к 1С, а к тем, кто расширяет. NativeAPI - достаточен для расширения, кроссплатформенный и хорошо документирован.
81. Сергей Карташев (Elisy) 13.01.11 13:10
awk пишет:
1С решает определенный круг задач. И в описание этого круга задач поддержка .net не входит.

Какой бы круг задач не решала 1С, ее функционал очень ограничен и во многих задачах требует расширения другими средствами. Чисто прагматически 1С только выиграет, если будет дружно работать с .Net/Java и др. популярными платформами.
awk пишет:
Есть некий интерфейс позволяющий расширить круг задач, но это уже не к 1С, а к тем, кто расширяет. NativeAPI - достаточен для расширения, кроссплатформенный и хорошо документирован.

Наверное, мы с вами с разным NativeAPI работаем.
NativeAPI мне показался ущербным по сравнению с COM ВК, так как не поддерживает IDispatch (или схожего метода доступа) и доступ к глобальному контексту через AppDispatch. И можно ссылку на хорошую документацию по использованию в MS IE, где был бы описан загадочный интерфейс IAddInServiceEx? Похоже продуманность и кроссплатформенность NativeAPI закончилась с поддержкой IE, где доступ осуществляется все через тот же одноплатформенный COM.
82. Ийон Тихий (cool.vlad4) 13.01.11 13:13
Насчет документации (81) поддерживаю - было бы очень хорошо awk, если бы вы выложили ссылки...я бы плюс поставил...
ЗЫ А к кому обращатся по поводу мелких недочетов на сайте? К support-у? - 1. При ошибочной ссылке на самого себя (например (81) ), после изменения оной ошибки - внизу ссылка так и остается (82) к примеру. 2. При добавлении цитат в комментарий, не отображается поле ссылок на ответы к комментарию. Это все мелочи, но просто, если уж есть такие фичи, то пускай без багов.
83. Ирина Пятакова (Alraune) 13.01.11 13:20
84. J Popov (japopov) 24.02.12 19:19
а вот никто не подумал, что поддержки .Net нет и быть не может, исходя из самой концепции управляемого приложения? Вот что априори знает сервер 1С о клиенте? Да неизвестно даже, на какой оси он крутится, в каком режиме работает! А любители .Net, покажите мне, как можно создать программу, которая, выполняясь на сервере, найдёт ваш .Net на клиенте (ага, на веб-клиенте, на линуксе, или, что уж там - давайте уж сразу на MeeGo).
Или вы хотите выполнять код на сервере и кидать на клиент результат? Тогда вам нужен VNC, а не 1С.
или вы хотите выполнять код на клиенте, с прямым доступом к ресурсам компьютера? Тогда вам с 1С вообще не по пути, используйте 1Сv77.
85. Сергей Карташев (Elisy) 27.02.12 07:38
(84) japopov,
а вот никто не подумал, что поддержки .Net нет и быть не может, исходя из самой концепции управляемого приложения? Вот что априори знает сервер 1С о клиенте? Да неизвестно даже, на какой оси он крутится, в каком режиме работает! А любители .Net, покажите мне, как можно создать программу, которая, выполняясь на сервере, найдёт ваш .Net на клиенте (ага, на веб-клиенте, на линуксе, или, что уж там - давайте уж сразу на MeeGo).

Можно много рассуждать о теории и универсальности. Но сейчас на практике сервер и клиенты традиционно на Windows. И намного качественнее охватить эти 95% клиентов, чем делать непротестированные в должной мере сообществом решения на все случаи жизни и разные ОС.
Или вы хотите выполнять код на сервере и кидать на клиент результат? Тогда вам нужен VNC, а не 1С.
или вы хотите выполнять код на клиенте, с прямым доступом к ресурсам компьютера? Тогда вам с 1С вообще не по пути, используйте 1Сv77.

Ничто не помешает обмениваться клиенту .Net с .Net-сервером через простые объекты или строковые сериализации. Также, как и сейчас обменивается клиент и сервер через вызов серверных функций и процедур. Достоинство 1С в том, что оно в первую очередь десктопное приложение с прямым и тем самым более быстрым доступок к ресурсам компьютера.
86. J Popov (japopov) 27.02.12 13:29
(85) Elisy, Невозможность использовать .Net и вообще OLE, ActiveX - это следствие выбранной реализации (управляемое приложение, а точнее, его самая универсальная реализация - тонкий клиент). Увы, искать обходные решения (это не так уж сложно, я же нахожу %) ).

И таки да, для Вас будет сюрпризом - 1С уже давно постепенно отказывается от поддержки именно Microsoft в сторону большей универсальности. Вы просто не успеваете за 1С...
87. Сергей Карташев (Elisy) 27.02.12 16:37
(86) japopov, все находят обходные решения. Статья говорит о том, что 1С некорректно работает с CLR С++ -приложениями и не более того. Все попытки связаться с разработчиками компании 1С закончились простыми отписками.
То, что делает 1С, может не идти с традиционным распространенным подходом и 1С будет вынуждена считаться с этим. Так, например, не убрала поддержку внешних компонент, написанных для 1С 8.1 или оставила работу с КОМ-объектами.
88. Misha ⁠ (Magister) 28.02.12 02:59
(85) У нас вот сервер под Linux + PostgreSQL, например. Клиенты - да, под Windows.

(87) А смысл убирать то, что работает? Только вот, если таки будет в 8.2.16 полноценная платформа под Linux - там уж точно не будет ни COM-объектов, ни внешних компонент 7.7/8.0/8.1-style.
И думается мне, что немало организаций тогда выберет Linux для рабочих мест пользователей, как минимум из-за более высокой защищенности от вирусов и бесплатности.

А отписки - как раз очень хорошо свидетельствуют о том, что для 1С поддержка CLR - это не приоритетная задача. Не работает, ну и фиг с ним. Не нужно. По крайней мере, судя по вашим словам, так оно и есть с точки зрения 1С.
И нам с вами придется с этим считаться, либо уходить на другую платформу.
Я предпочту считаться. К тому же, кросс-плаформенность для приложений - это всегда плюс, как с точки зрения отлаженности софта (больше различных конфигураций для тестирования => большее количество выявленных багов), так и с точки зрения захвата рынка.
89. Алексей Миронов (a_mironov) 12.03.12 02:37
Hello всем. Есть проблема зависания, тема тут вроде об этом идёт. Пишу вменяемый почтовый клиент (ВК 1с 8.2) для IMAP+SMTP+SSL+TLS на c#. Долго решал проблему (при первой отправке письма через ВК она не возникает, зато при второй - сразу висит намертво), в итоге выяснилось, что сразу после второго вызова метода отправки вызывается IInitDone.Done(). Пока копаюсь дальше. Будет результат - отпишусь. Есть мысли, что проблема в том, что у clr остаются ссылки на объекты 1С... копаюсь в общем
90. Алексей Миронов (a_mironov) 12.03.12 02:53
(89) так и есть, проблема с методом GC.WaitForPendingFinalizers(). 1С запаздывает с освобождением памяти? Или что? В любом случае, очистку грехов вроде мусора пока оставляю на потом. Клиент ждёт ) найду решение, приемлемое для юзера и кодера - отпишусь тут. Кстати, чтобы ВК не висла при открытии, нужно записать нечто подобное (для c#)
public static object V8Object
{
get
{
return m_V8Object;
}
set
{
m_V8Object = value;
m_ErrorInfo = (IErrorLog) value;
m_AsyncEvent = (IAsyncEvent) value;
m_StatusLine = (IStatusLine) value;
m_IExtWndsSupport = (IExtWndsSupport)value;
}
}
91. Сергей Карташев (Elisy) 13.03.12 07:36
(89) a_mironov,
Отлично, что есть еще одно подтверждение о зависании. А то стал думать, что только у меня такие проблемы, связанные с индивидуальными настройками системы. Ведь, судя по постам steban и cool.vlad4, у них зависания не происходит.
92. Алексей Миронов (a_mironov) 13.03.12 10:40
всё это частные случаи. зависания связаны чаще всего с разницей в подходах к очищению мусора в 1С Технология внешних компонент (c++) и .net. вообще, я бы заколлекционировал случаи подвисания и поразбирался бы с ними. это дало бы ценнейший опыт. если висячая ВК?
93. Сергей Карташев (Elisy) 13.03.12 10:54
(92) a_mironov,
Дальше, чем включение опции CLR в пример от 1С Технологии ВК дело не пошло. Уже на этом этапе было зависание.
Причем эксперименты с #pragma unmanaged тоже результатов особых не дали, насколько помню.
Сейчас пока не охота возвращаться к этой теме из-за того, что новая технология ВК менее гибкая, чем COM ВК (нет возможности работать с объектами, а только с примитивными типами).
94. Алексей Миронов (a_mironov) 13.03.12 10:56
(93) Elisy, ок, я посмотрю сабж в переписке. Есть исходники? Кинь в скайп promironov
95. Сергей Карташев (Elisy) 13.03.12 11:35
(94) a_mironov,
Исходников не осталось - прошло больше года с начала изучения. Выслал переписку с компанией 1С по этому вопросу.
96. Алексей Миронов (a_mironov) 13.03.12 11:49
начинаем глубокую тему изучения Native API :) на этой неделе делаю простенькую ВК, которая будет работать по этой технологии. будет результат - напишу статью. результата не будет - сделаем всеобщее обсуждение
97. Артём Артёмов (TeMochkiN) 19.03.12 11:47
Здравствуйте уважаемый Elisy. я вот нашел ваш .net bridge и пытался воспользоваться обработкой отсюда http://infostart.ru/public/60232/
вообщем ошибка происходит аж при загрузке внешней компоненты. у меня Windows 7 x64, платформа 1С 8.2.14.537, конфигурация "Управление торговлей" 10.3.14.5 (демка, но и не только на демке ошибка происходит), устанавливал .net bridge от имени администратора, путь к библиотеке в самой обработке менял, .net bridge версии 4.0.3.1 качал отсюда. эта ошибка происходит из-за описанной в данной теме проблемы? никак подключить эту компоненту на данной платформе не удастся? хотел просто испробовать многопоточность в 1С, но вот столкнулся с данной проблемой
98. Сергей Карташев (Elisy) 19.03.12 12:34
(97) TeMochkiN,
Ошибка скорее всего происходит из-за того, что в
http://infostart.ru/public/60232/
используется .Net Bridge 3 - предыдущей версии.
Для исслдования многопоточности вам, думаю, проще взять версию 4.0.3.1 и воспользоваться публикацией
http://infostart.ru/public/104926/
99. Артём Артёмов (TeMochkiN) 19.03.12 14:27
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа