Вход | Регистрация
    1  2  3

Использование классов .Net в 1С для новичков

Использование классов .Net в 1С для новичков
Я
   Serginio1
 
27.01.16 - 11:58
Выложил статью http://catalog.mista.ru/public/448668/ в которой постарался объяснить работу обертки NetObjectToIDispatch45 обертывающую Объекты .Net через Com объекты.
Саму разработку можно скачать отсюда http://files.rsdn.ru/19608/%d0%a4%d0%b0%d0%b9%d0%bb%d1%8bNetObjectToIDispatch.zip

Недавно решенные проблемы
Асинхронные WinHttp.WinHttpRequest.5.1 и MSXML2.XMLHTTP
Помощь с Web сервисом

Предыдущие темы
Динамическая компиляция для использования .Net событий в 1С
1C Messenger для отправки сообщений, файлов и обмена данными между пользователям
v8: v8: Использование сборок .NET в 1С 7.x и 8.x

По поводу регистрации Для проведения тестов нужно распаковать архив . Татем нужно  зарегистрировать
Нужные DLL. Запускаем РегистрацияКомСервера.exe от имени администратораи выбираем NetObjetToIDispatch45.dll которая лежит в DLLNetObjetToIDispatch45
Либо 1с и многопоточность
   Shamandafil
 
201 - 25.02.16 - 13:48
Рихтер осуждает Sleep в цикле, когда надо дождаться какого-то события.
   Serginio1
 
202 - 25.02.16 - 13:53
А чего осуждать то? Это просто отдача времени другому потока. Здесь не событийная система оповещения. Все претензии к авторам библиотеки
   Serginio1
 
203 - 25.02.16 - 13:53
(201) Кстати вацап то работает?
   Filin
 
204 - 26.02.16 - 12:39
Вот понимаю, что видимо вещь нужная, но как-то для меня много букв. Есть возможность на маленьком конкретном примере показать обработку событий?
Вот есть программка на с# - https://yadi.sk/d/pMW654nopXuS3
Просто получает данные из ком-порта по событию.
Мне нужно в 1с аналогичным образом получить эти данные, используя класс из С#. Не могу даже начать - информации вроде много, но как-то я заблудился :)
   Garykom
 
205 - 26.02.16 - 12:47
(204) примерно так начать
...
порт = врап.СоздатьОбъект("System.IO.Ports.SerialPort");
   Garykom
 
206 - 26.02.16 - 12:53
(205)+ далее
порт.PortName = "COM4";
порт.BaudRate = 9600;
порт.DataBits = 8;
четность = врап.ПолучитьТип("System.IO.Ports.Parity");
порт.Parity = четность.None;
...
   oleg_km
 
207 - 26.02.16 - 13:45
(205) О, так дело Учителя живет.
   oleg_km
 
208 - 26.02.16 - 13:47
Только что нужно на форме ввода пароля чтобы отображалась текущая раскладка клавиатуры:

    Раскладка = врап.GetType("System.Windows.Forms.InputLanguage", "System.Windows.Forms").CurrentInputLanguage.Culture.TwoLetterISOLanguageName;
   Garykom
 
209 - 26.02.16 - 13:48
(208) да способов применения дофига

(207) вот пытаюсь ВК Native API запилить чтобы на mono тоже можно было под linux
   Filin
 
210 - 26.02.16 - 15:11
C:\Programs\NetObjectToIDispatch>C:\Windows\Microsoft.NET\Framework\v4.0.30319\r
egasm.exe "C:\Programs\NetObjectToIDispatch\DLLNetObjetToIDispatch45\NetObjetToI
Dispatch.dll" /codebase
Microsoft .NET Framework Assembly Registration Utility 4.6.1055.0
для Microsoft .NET Framework 4.6.1055.0
Ну я так понимаю - нужно зарегистрировать сначала?

Вот что выдало при регистрации -


c Корпорация Майкрософт (Microsoft Corporation). Все права защищены.

RegAsm : warning RA0000 : Регистрация неподписанной сборки с использованием пара
метра /codebase может вызвать конфликт данной сборки с другими приложениями, кот
орые могут быть установлены на том же компьютере. Параметр /codebase предназначе
н только для подписанных сборок. Присвойте сборке строгое имя и повторите регист
рацию.
Типы зарегистрированы успешно

Но при попытке создать ком-объект - 

Ошибка при вызове конструктора (COMОбъект)
    врап=новый COMОбъект("NetObjectToIDispatch45");
по причине:
Недопустимая строка с указанием класса
   Garykom
 
211 - 26.02.16 - 15:30
(210) от админа CMD запускал и регал?
с регистрацией там какие то заморочки помнится, уже намекал несколько раз автору на нужность инсталлятора

еще утилита "РегистрацияКомСервера.exe" правильные пути дает для батника
   Garykom
 
212 - 26.02.16 - 15:31
(211)+ а и первый запуск 1С тоже от админа
   Garykom
 
213 - 26.02.16 - 15:34
(210) эээ ты версию для .net framework 2 регаешь

там с "45" на конце под "net framework 4.5"
   Garykom
 
214 - 26.02.16 - 15:35
   Serginio1
 
215 - 26.02.16 - 15:53
(210) Это просто предупреждение, что сборка неподписана.
   Filin
 
216 - 26.02.16 - 15:54
(214) Да вроде отсюда. Зарегить получилось (затупил и регистрировал не ту длл).

Следующий код отрабатывает нормально -
врап=новый COMОбъект("NetObjectToIDispatch45");
    порт = врап.СоздатьОбъект("System.IO.Ports.SerialPort");
    
    порт.PortName = "COM1";
    порт.BaudRate = 9600;
    порт.DataBits = 8;
    четность = врап.ПолучитьТип("System.IO.Ports.Parity");
    порт.Parity = четность.None;
    СтопБит = врап.ПолучитьТип("System.IO.Ports.StopBits");
    порт.StopBits = СтопБит.One;
    Управление = врап.ПолучитьТип("System.IO.Ports.Handshake");
    порт.Handshake = Управление.RequestToSend;
    
    порт.Open();

Теперь как отловитьв 1с событие "DataReceived" ?
   Serginio1
 
217 - 26.02.16 - 15:59
(204) Во внешних отчетах есть ТестСобытийИзмененийВДиректории.epf
В поле Полное имя класса указываешь полное имя класса
В поле Полное Имя Файла указываешь путь к сборке.

И жмешь Получить описание модулей. Там будут описания на C# и для 1С.

Там же лежит и TestSerialPort.epf
   Serginio1
 
218 - 26.02.16 - 16:02
Для гаковских сборок можно указать просто имя DLL
Например для SerialPort
https://msdn.microsoft.com/ru-ru/library/system.io.ports.serialport(v=vs.110).aspx
это System.Dll
   Filin
 
219 - 26.02.16 - 16:05
(218) Указал имя класса  - System.IO.Ports.SerialPort

Получил описание чегото гдето. Что с этим описанием делать?

TestSerialPort.epf смотрю.
   Serginio1
 
220 - 26.02.16 - 16:15
Вставляешь в обработку. Основной метод  СоздатьОбертку(объект)

Создаешь свой объект и подключаешь события через вызов
 СоздатьОбертку(ТвойОбъект)

В методах пропиши свои действия. Там будут два модуля Один через ДобавитОбработчик второй через ОбработкаВнешнегоСобытия

Смотри по аналогии с TestSerialPort.epf
   Filin
 
221 - 26.02.16 - 16:22
Garykom, Serginio1  - спасибо !
Похоже в TestSerialPort.epf есть все что мне нужно. На тестовой машине с виртуальным портом работает отлично . Буду тестить на железе.
   Serginio1
 
222 - 26.02.16 - 16:25
oleg_km Garykom

Большое спасибо за поддержку. Был занят.
   Shamandafil
 
223 - 26.02.16 - 16:32
Посмотрел сборку в студии в ней почему-то 2 пространства имён одно из них NetObjetToIDispatch45, совпадает с именем ДЛЛ, в ней букв С пропущена.
   Serginio1
 
224 - 26.02.16 - 16:37
(223) А в каком модуле?
   Serginio1
 
225 - 26.02.16 - 16:39
Все понял. Да проект называется NetObjetToIDispatch45
а namespace NetObjectToIDispatch45
Глазастый! Спасибо. Но менять уже не буду
   Filin
 
226 - 26.02.16 - 16:42
Serginio1 ,а как остановить обработку события? Или как правильно закрыть обработку?
У меня при закрытии начинает вываливать кучу ошибок.
   Shamandafil
 
227 - 26.02.16 - 16:42
Я его исправить хотел, но плохо когда класс называется как и пространство имён.
   Filin
 
228 - 26.02.16 - 16:43
+ (226) Вот что пишет - 

Не обработано событие DataReceived
 Исключение System.Runtime.InteropServices.COMException (0x000003E9): {Форма.Форма.Форма(50)}: Ошибка при вызове метода контекста (ReadExisting)
Неизвестная ошибка
   в System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
   в System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
   в System.Windows.Forms.WindowsFormsSynchronizationContext.Send(SendOrPostCallback d, Object state)
   в ВрапперДляSystem_IO_Ports_SerialPort.<>c__DisplayClass1b.<ОтослатьСобытиеСПараметром>b__18() в c:\Users\User\AppData\Local\Temp\htq00hr3.0.cs:строка 101
 Данные { sender = System.IO.Ports.SerialPort, e = System.IO.Ports.SerialDataReceivedEventArgs }
   Garykom
 
229 - 26.02.16 - 16:47
(228) простейше "УдалитьОбработчик"
   Serginio1
 
230 - 26.02.16 - 16:52
(226) Закрыть порт.Или есть метод
Процедура Остановить()
    Если watcher<>Неопределено Тогда
        watcher.EnableRaisingEvents = false;    
    КонецЕсли;
    
КонецПроцедуры
 
 
   Serginio1
 
231 - 26.02.16 - 16:54
А вообще
watcher.Close()
или
Врап.ПолучитьИнтерфейс(watcher,"IDisposable").Dispose();
   Filin
 
232 - 26.02.16 - 16:58
Да! Все работает ! Супер вещщь ! Никак по другому не получалось подключить чертову железяку :)
   Serginio1
 
233 - 26.02.16 - 16:58
Кроме того можно отписаться от событий
Врап.ОчиститьСобытияОбъекта(ОберткаСобытий);

Ну и 
watcher=неопределено;
ОберткаСобытий=неопределено;

        GC=Врап.ПолучитьТип("System.GC");
    GC.Collect();
    GC.WaitForPendingFinalizers();
    Врап= Неопределено;
   Serginio1
 
234 - 26.02.16 - 17:00
(232) Значит мои труды не пропадают зря!
   Garykom
 
235 - 26.02.16 - 17:10
(233) может имеет смысл методы для завершения работы в саму ВК встроить готовые?
которые заодно и все евенты того
   Serginio1
 
236 - 26.02.16 - 17:20
(235) Там вариаций может быть куча. Просто как шаблон
    Врап.ОчиститьСобытияОбъекта(ОберткаСобытий);
    Врап.ПолучитьИнтерфейс(watcher,"IDisposable").Dispose();
 

    watcher=неопределено;
    ОберткаСобытий=неопределено;

    GC=Врап.ПолучитьТип("System.GC");
    GC.Collect();
    GC.WaitForPendingFinalizers();
    Врап= Неопределено;
   Serginio1
 
237 - 15.03.16 - 14:51
Понадобилоссь прописать дефолтный принтер в 7 ке

врап=СоздатьОбъект("NetObjectToIDispatch45");
    врап.УстЭтоСемерка();
    

Registry=Врап.ПолучитьТип("Microsoft.Win32.Registry");


Ключ="Software\1C\1Cv7\7.7\ИмяБазы\V7\"+ИмяПользователя()+"\Moxel\";
Сообщить(Ключ);
key = Registry.CurrentUser.OpenSubKey(Ключ);
ОсновнойКлюч=СокрЛП(key.Name)+"\";

Ключи=key.GetSubKeyNames();


 Перечислимый=Врап.ПолучитьИнтерфейс(Ключи,"IEnumerable");
 Перечислитель=Перечислимый.GetEnumerator();
// На всякий случай приведем к Интерфейсу IEnumerator

 Перечислитель=Врап.ПолучитьИнтерфейс(Перечислитель,"IEnumerator");
// Теперь можем пройтись по коллекции

 
Пока Перечислитель.MoveNext()<>0 Цикл
//  Врап.ВСтроку вывоит строковое представление всех типов в том числе числовые, строки, неопределено

    Сообщить(Врап.ВСтроку(Перечислитель.Current));

    Ключ=ОсновнойКлюч+СокрЛП(Перечислитель.Current);
    ТекПринтер=Registry.GetValue(Ключ,"DefaultPrinter","");
    Сообщить(ТекПринтер);
    
    Если (Принтер<>"") и (ТекПринтер<>"") и (Принтер<>ТекПринтер) Тогда

        Registry.SetValue(Ключ,"DefaultPrinter",Принтер);
    КонецЕсли;
КонецЦикла;
  1  2  3

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.