Имя: Пароль:
1C
 
Динамическая компиляция для использования .Net событий в 1С
,
0 Serginio1
 
12.11.15
15:15
Выложил статью .NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия

http://catalog.mista.ru/public/417830/

Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия, а так же генерация модулей на C# и 1С для подключения к событиям. Использование DynamicMethod и ILGenerator. Представлены примеры на использовании событий System.IO.FileSystemWatcher (Ожидает уведомления файловой системы об изменениях и инициирует события при изменениях каталога или файла в каталоге.) и SerialPort (обработка сканера штрих кода подключенного к COM порту). Обертка позволяет использовать сборки .Net только на языке 1С.


Эта статья является дополнением разработки Использование сборок .NET в 1С 7.x b 8.x находящейся здесь http://catalog.mista.ru/public/238584/

v8: v8: Использование сборок .NET в 1С 7.x и 8.x
274 Serginio1
 
04.12.15
14:06
Кстати можно выполнять скрипты на IronPython
http://metanit.com/sharp/tutorial/9.3.php
275 MM
 
04.12.15
14:10
(274) это добро отдельно ставить надо?
Кстати в чистой вин7 сп1 нету NET.4 (
276 Serginio1
 
04.12.15
14:17
(275) Ну DDL то нужна.
Сейчас уже .Net 4.6.1
https://msdn.microsoft.com/en-us/library/ms171868(v=vs.110).aspx
277 Serginio1
 
04.12.15
14:20
278 MM
 
04.12.15
14:29
Чего в этой компоненте не хватает, так это полноценного инсталятора, который сам запросит элевацию, зарегистрирует 32 и 64 COM и выкачает и поставит подходящий НЕТ, если его нет.
Не плохо бы msi, для доменной установки.
279 Masquerade
 
04.12.15
14:42
(272)

-- А мне уже без них вообще не обойтись.

Это от небольшого ума.
280 Музон Хиггса
 
04.12.15
14:43
(274) Если кому-то захочется, тогда уж лучше так: https://github.com/mrprint/OnePy
281 kyvv
 
04.12.15
14:45
(279)На Мисте выяснили, что его вообще нет.
282 kyvv
 
04.12.15
14:49
(278) Согласен. Должна быть одна большая кнопка.
283 Serginio1
 
04.12.15
14:51
(278) Надо будет сделать на досуге. https://msdn.microsoft.com/ru-ru/library/ms173084(v=vs.90).aspx

Но посмотри на количество скачавших.

(280) А чем лучше?
(279) А как использовать, то чего в 1С нет?
284 kyvv
 
04.12.15
14:54
Программисты что-то подобное давно используют, для остальных - неподъемный груз.
285 MM
 
04.12.15
14:56
(282) после нажатия на эту кнопку, остальное уже от разработчика конфигурации зависеть будет. Эта компонента не для пользователя.
286 oleg_km
 
04.12.15
14:56
(283)

>> (279) А как использовать, то чего в 1С нет?

А применить к данному случаю Евангелие от Матфея гл.7 стих 6. Он все равно ничего не поймет, т.к. мнит себя большим умом
287 Музон Хиггса
 
04.12.15
14:57
(283) > А чем лучше?
Более тесной интеграцией.
288 Serginio1
 
04.12.15
15:03
(287) Там даже ReadMe нет. Посмотрел внутренности обертка через ВК.
А используя NetObjectToIDispatch45 и ExpandoObject делай, что угодно.
Тем более, что Scripting API  помощнее будет (266)
289 Музон Хиггса
 
04.12.15
15:06
(288) Там и Python кода нет (публиковалось одноразово для потенциального работодателя). Затачивалось под совместимость с XP и 7.7. Потому и так.
290 Serginio1
 
04.12.15
15:21
(289) Я понял, что библиотека аналогичная Elisy.NetBridge4 только для выполнения кода питона.
NetObjectToIDispatch20 тоже работает с 2.0 и 7.7. Только я на неё честно говоря наплевал.

Так напиши хотя бы ReadME думаю многих заинтересует кто знает питоновские библиотеки. Опубликуй статью на Инфостарте.
291 kyvv
 
04.12.15
15:30
«Peter Gribanov, Technology evangelist in 1C». Статью на хабре здесь уже приводили (http://habrahabr.ru/company/1c/blog/267321/). В этой статье он сравнивает ЯР1С с JavaScript. Я вот и подумал, а не хочет ли 1С заменить свой язык на js? Или на Dart. V8 в 1С и у google. А если еще Nodejs присобачить.
292 Masquerade
 
04.12.15
15:34
(283)
-- А как использовать, то чего в 1С нет?

Ты не поверишь, но лично я поступаю так:

Беру другой инструмент/платформу и решаю задачу на ней.
293 Masquerade
 
04.12.15
15:35
+

Зачем тащить в среду противоестественные для неё штуки?

А потом решать связанные с этим проблемы, которые (поверьте) лежат даже не области кода.
294 Serginio1
 
04.12.15
15:35
(291) Лучше TypeScript. Но есть куча трансляторов из манагед кода (.Net,Java) кода в JS для Вэб клиента.
(292) Ну и чем это лучше чем из 1С использовать классы .Net.
Ты 1С интегрируешь через COM?
295 kyvv
 
04.12.15
15:37
Кстати, ЯR1C for developer.
296 Serginio1
 
04.12.15
15:37
(293) А чем твое то решение лучше. Твой COM сервер тоже чуждая среда и в ней кроме автора мало кто подправит.
297 Serginio1
 
04.12.15
15:41
(295) И, что это за зверь?
298 oleg_km
 
04.12.15
15:41
(293) В чем противоествественность? Поддержка КОМ пока заявлена в 1С, сама 1С даже в типовых не гнушается ее использовать. Вот при взаимодействии с .NET еще ни разу не сталкивался, что что-то не работает. А вот с "нативными" объектами регулярно: то ИнтернетПочта сломается, то HTTPСоединение не фурычит.
299 kyvv
 
04.12.15
15:45
Встроенный язык 1с  с английским синтаксисом для индусов.
300 MM
 
04.12.15
16:10
(298) Значит с помощью НЕТа почту и инет проверяете?
Или ещё для чего на практике используете?
301 oleg_km
 
04.12.15
16:30
(300) Сейчас попробую все перечислить:

1) Отправка эл почты - в свое время обожглись на встроенной, когда после смены релиза вся наша почта встала, а 1С подтвердило ошибку и предложила ждать след. релиза платформы.
2) Очень много используется TCP/UDP
3) Сворачивание 1С на трей
4) Работа с КОМ:
4.1) Работа с GSM-модемом, отправка и прием СМС
4.2) Работа со сканером ШК полностью переведена на .NET
5) Рисование графики, карты, маршруты, места доставки. Через GDI+ рисуется в десятки раз быстрее чем посредством HTML+JS

Ну и так по мелочевке дофига всего
302 oleg_km
 
04.12.15
16:31
А, забыл, вместо HTTPСоединение изначально используем WebRequest. Требовались возможности, которых нет в HTTPСоединение, а теперь и не хочу связываться с 1С'ным. Его как я читаю, тоже периодически ломают.
303 oleg_km
 
04.12.15
16:38
А, еще, в трех местах используется System.IO.FileSystemWatcher - оповещение об изменении каталога для запуска различных обработок: обработки эл. почты, данных из СКУД и технологического журнала 1С.

Видите, уже всего и не упомнить
304 Serginio1
 
04.12.15
16:41
(300) У меня еще 7 ка, а там куча всего.
Для 8 5ки изначально писал для доступа к Вэб сервисам по ws- протоколам. WhatsApp, SignalR. Кстати скоро выложу.
Ну и по мелочи куча всего, чего в 1С нет или работает криво.
305 Masquerade
 
04.12.15
17:00
(301)
Какой кошмар.

Модемы. Карты. GDI туда же.

АРХИТЕКТОРЪ!
306 Masquerade
 
04.12.15
17:02
Всё, кроме "4.2) Работа со сканером ШК полностью переведена на .NET" прекрасно реализуется отднльно стоящим web-сервисом, доступным через http. Со всеми плюшками и преимуществами.
307 Masquerade
 
04.12.15
17:04
Забегая вперед, не надо только напрягаться насчет фантастических историй про сканера ШК. У меня их 150 штук. И без .NET
308 MM
 
04.12.15
17:05
(306) Сворачивание в трей тоже веб-сервисом?
309 Masquerade
 
04.12.15
17:05
(301)

-- 4.1) Работа с GSM-модемом, отправка и прием СМС

У вас одна база что-ли??
310 Masquerade
 
04.12.15
17:05
(308)

-- Сворачивание в трей тоже веб-сервисом?

Когда коту делать нечего - он знаете что делает??
311 Serginio1
 
04.12.15
17:25
(306) И в чем премущества? Это как штаны через голову надевать. Единственно, что такой подход нужен для реализации событий на сервере.

(307) Но через COM или Native API которая тоже чужеродна.
(310) Ну так можно обо всем говорить.
312 Serginio1
 
04.12.15
17:51
(310) Начал я эту разработку с того, что мне нужно было прикрутить Вэб сервис на ws- протоколах. С кучей классов с обширной иерархией. Писать отдельно для каждого класса обертку муторно, поэтому и сделал обертку над нетовскими классами. Теперь использовать неподдерживаемые вэб сервисы (в том числе с передачей данных через soap:Header) стало легко при этом есть куча примеров использования на C#.
И легко использовать классы NetObjectToIDispatch45 также как и встроенные в 1С классы для работы с Вэб сервисами, HTTP итд.
313 oleg_km
 
04.12.15
18:58
(307) Да если на то пошло и сканер ШК можно реализовать локальным http сервисом. Вон полно шлюзов RS232 - TCP. Ты что доказать хочешь? Что правильно не выходить за возможности платформы? Но твои сканеры ШК уже используют ВК. Или правильные ВК - это только ВК, сделанные 1С'ом? Тоже сомнительно. Или все что ты считаешь ненужным - не нужно никому? Ну да, такая активная жизненная позиция.
314 Serginio1
 
05.12.15
09:21
(306) Кстати реально была ситуация, когда на складе была плохая связь. А базу перенесли в ДатаЦентр и работали с ней через RDP. Порты прокинули, но все это дело ужасно тормозило.
Мало того, печть по понятным причинам тоже жутко тормозила. А надо было печатать этикетки на огромное количество товаров.

Выход такой. Сделал пустую базу, которая соединялась с реальной по TCP/IP через VPN c реальным сеансом. То есть шк считывались с локальной базы и по TCP/IP передавалась в реальную базу. При печати с реалного сеанса передавались только данные, а печатная форма создавалась на локальной базе.
И все залетало.
315 Garykom
 
гуру
05.12.15
09:34
(308) а нафейхуа?
если нету $ на отдельный "типа сервер", зачем им трей?

в смысле не вижу смысла держать 1С-ку свернутой в трей, ладно еще держать там свою программку/агента которая и будет что нужно делать в т.ч. запуская 1с когда нужно (com или ole это уже по вкусу)
316 Serginio1
 
05.12.15
09:55
314 + кстати http://catalog.mista.ru/public/238584/ там есть пример обмена по TCP/IP  со сжатием данных для уменьшения трафика
317 Garykom
 
гуру
05.12.15
10:37
(314) когда гланды не через рот удаляют это конечно интересно... познавательно... но нафига?

в данном случае чем стандартный РИБ плох? специально настроенный чтобы не было лишнего?
318 Serginio1
 
05.12.15
10:43
(317) База данных огромная. 60 миллионов записей по прайсам постоянно обновляющееся итд.
РДП в данном случае это как раз удаление гланд через одно место.
319 Garykom
 
гуру
05.12.15
10:55
(318) так может надо было сделать чтобы .net вообще без tcp/ip (связи) работал?
свой принцип гравитационной или нейтринной изобрести? :)

почему просто канал не наладить то было? до этого "датацентра"

а то получилось стандартно, сначала создаем себе трудности чтобы потом героически их преодолевать
320 Serginio1
 
05.12.15
11:17
(319) Склад находился в неудачном месте. Потом переехали на другой склад. Но решение нужно было сейчас.
Да суть и не в этом. Решение через TCP/IP на самом деле ооочень простое решение. Ничем не отличается от Вэб сервисов, только с обменом в обе стороны. Ты же их не считаешь чем то героическим. Обычная рутина.
Кстати и сейчас решение формирование печатной формы на сервере, и передача её на клиента для печати огромных данных тоже не является оптимальным решением при работе через HTTP.

Скоро выложу обмен сообщений,любых файлов по HTTP используя SignalR (WebSocket,Long polling). Можно использовать в браузере, в 1С, а мобильных девайсах (пока для андроида). По сути это аналог обмена по Tcp/Ip
Знаю, что многие используют WhatsAp. Как ты думаешь такое решение нужно?
321 Garykom
 
гуру
05.12.15
12:29
(320) телеграм нужно, а не вацап
322 Serginio1
 
05.12.15
12:32
(321) Я предлагаю независимое решение использовании связки Asp.Net + Nancy c byntuhfwbtq клиента в 1С, Web и мобильные приложения для связи клиентов 1С. В том числе и для мобильных клиентов. И не зависеть не от кого.
323 Garykom
 
гуру
05.12.15
12:35
А SignalR это вообще нечто... аналог tcp/ip протокола реализованный поверх http...
324 Serginio1
 
05.12.15
12:46
(323) И значительно проще в использовании.
http://metanit.com/sharp/mvc5/16.1.php
325 2mugik
 
05.12.15
15:45
(0)хотелось бы попробовать, где можно скачать первоначальные файлы с обертками?
326 Serginio1
 
05.12.15
16:11
http://catalog.mista.ru/public/238584/
или в понедельник вышлю на почту
327 Serginio1
 
07.12.15
10:31
(325) Гугл не пропускает
328 Serginio1
 
07.12.15
10:32
329 Пикчер
 
15.12.15
10:29
(301) не встречалась компонента прослушивания порта и отправки пакетов по udp?
330 oleg_km
 
15.12.15
10:59
(329) Что значит встречалась? Я ее сам за час написал. Вернее, если допустим нужно просто в синхроне например в фоновом задании читать и отвечать, то там даже компонент не нужен, кроме (328), вот код объекта СокетДатаграммы:

Процедура Инициализировать(Порт = 0) Экспорт
    Плагин = БиблАП.ПолучитьNET();
    Сокет = Плагин.NewObj(Плагин.GetType("System.Net.Sockets.UdpClient", "System"), Порт);
    Запрос = Неопределено;
    
    ТаймАут = 10000;
    Кодировка = "windows-1251";
КонецПроцедуры

Процедура Закрыть() Экспорт
    Сокет.Close();
КонецПроцедуры

Функция ПринятьДанные(Адрес = Неопределено) Экспорт
    Если Запрос = Неопределено Тогда
        Запрос = Сокет.BeginReceive(Неопределено, Неопределено);
    КонецЕсли;
    
    мсДанные = Неопределено;
    Если Запрос.AsyncWaitHandle.WaitOne(ТаймАут) Тогда
        текАдрес = Плагин.NewObj(Плагин.GetType("System.Net.IPEndPoint", "System"), 0, 0);
        мсДанные = Сокет.EndReceive(Запрос, текАдрес);
        Запрос = Неопределено;
        
        Если ТипЗнч(мсДанные) = Тип("Число") Тогда
            ВызватьИсключение "СокетДатаграммы. Чтение данных";
        КонецЕсли;
        
        Адрес = Новый Структура("Хост, Порт", текАдрес.Address.ToString(), текАдрес.Port);
    КонецЕсли;
    Возврат мсДанные;    
КонецФункции

Процедура ПередатьДанные(Хост, Порт, мсДанные) Экспорт
    Сокет.Send(мсДанные, мсДанные.Length, Хост, Порт);
КонецПроцедуры
331 Пикчер
 
15.12.15
11:06
(330) в том то и дело, что должно генериться внешнее событие для 1с, когда на прослушиваемый порт приходит пакет
332 Пикчер
 
15.12.15
11:30
(331) + нашел рабочий код с ExternalEvent
333 Serginio1
 
15.12.15
11:53
(332) Так Динамическая компиляция в том числе и генерирут обертку для внешних событий
ПодключитьВнешнююКомпоненту("AddIn.GlobalContext1C");
    объект = СоздатьОбъект("AddIn.GlobalContext1C");
    ГлобальныйКонтекст= объект.ГлобальныйКонтекст;

    ОберткаСобытий= врап.СоздатьОберткуДляСобытий77(ОбертываемыйОбъект,ГлобальныйКонтекст);
334 Serginio1
 
17.12.15
10:05
(331) Посмотри 1C Messenger для отправки сообщений, файлов и обмена данными между пользователям
SignalR это аналог udp только по HTTP со всеми вытекающими.
Плюс простота программирования.
335 Serginio1
 
18.12.15
10:37
Можно повторно использовать скомпилированную сборку например
использовано здесь 1C Messenger для отправки сообщений, файлов и обмена данными между пользователям

Процедура ПолучитьОбертку(NetОбъект)
    
    // Использовал методы .Net классов для того, что бы показать технику использования обертки .Net классов
    Если не Объект.ИспользоватьСкомпилированнуюСборку Тогда
        ОберткаСобытий=врап.СоздатьОберткуДляСобытий(NetОбъект);
        возврат
    КонецЕсли;
    //Так как сборка компилируется в реальную DLL, то если сборка SignalRHelloClient.dll не менялась, то и обертку событий компилировать не нужно
    
    
    // Используем ТипКакОбъект для получения методов Type
    // По умолчанию для типа используются статические методы
    Тип=Врап.ТипКакОбъект(NetОбъект.GetType());
    ИмяФайлаСборки = тип.Assembly.Location;
    Path=Врап.ПолучитьТип("System.IO.Path");
    Каталог = Path.GetDirectoryName(ИмяФайлаСборки);
    
    ТипСтрРеальногоОбъекта = тип.FullName;
    // Применим метод ОбернутьЛюбойОбъект для получения методов String
    // Так как String возвращается без обертки
    ИмяКласса = "ВрапперДля" + Врап.ОбернутьЛюбойОбъект(Врап.ОбернутьЛюбойОбъект(ТипСтрРеальногоОбъекта).Replace(".", "_")).Replace("+", "_");
    OutputAssembly = Path.Combine(Каталог, ИмяКласса) + ".dll";
    
    Если  Врап.ПолучитьТип("System.IO.File").Exists(OutputAssembly) Тогда
        ТипОбертки=Врап.ПолучитьТипИзСборки(ИмяКласса,OutputAssembly);
        
        // У типа ТипОбертки есть статический метод  СоздатьОбъект который принимает обертываемый объект
        Попытка
        объектОбертка=ТипОбертки.СоздатьОбъект(Врап,NetОбъект);
    Исключение
        врап.ВывестиПоследнююОшибку()
        КонецПопытки;
        // Нужно получить COM объект из обертки
        ОберткаСобытий=Врап.ПолучитьРеальныйОбъект(объектОбертка);
    Иначе
        // Нет скомпилированной DLL     
        ОберткаСобытий=врап.СоздатьОберткуДляСобытий(NetОбъект);
        
    КонецЕсли;
    
    
    
    
КонецПроцедуры // ПолучитьОбертку()
336 Serginio1
 
30.12.15
11:14
Кстати посмотрел многих заинтересовала Строка в дату
http://catalog.mista.ru/public/434345/

Может кто подскажет, что может заинтересовать людей, то что нет в 1С, но есть в .Net
337 Garykom
 
гуру
30.12.15
11:31
(336) заинтересовало потому что тема нужная, но вот реализация все равно сложновата (хотя надо признать уже намного понятнее статья вышла)

для 1С-ников нужно нечто ТекДата = Строка2Дата(ТекСтрока, ТекФормат);
где ТекФормат = "ДД-ММ-ГГГГ" или ТекФормат="ДД.ММ.ГГ"
338 Garykom
 
гуру
30.12.15
11:34
(337)+ т.е. скрывать всё длинное и непонятное под спойлеры и(или) упрощать по максимуму вызовы из 1С

т.е. подключил ВК 1-2 строками, и просто вызвал метод и все

ЗЫ по поводу что нужно, недавно куча запросов была на сохранение табличных документов в картинку
339 Serginio1
 
30.12.15
11:39
(338) Ну сделать, то функцию не проблема. Кстати ничем не сложнее ComОбъект
340 Garykom
 
гуру
30.12.15
11:42
(339) это смотря кому "не проблема"
341 Serginio1
 
30.12.15
11:51
(340) Причесать не проблема. Проблема понять, что причесывать. Например

БиблиотекаNET = новый COMОбъект("NetObjectToIDispatch45");
DateTime = БиблиотекаNET.ПолучитьТип("System.DateTime");
КлассCultureInfo = БиблиотекаNET.ПолучитьТип("System.Globalization.CultureInfo");
ОбъектCultureInfo = БиблиотекаNET.СоздатьОбъект(КлассCultureInfo, "ru-Ru");
DataTimeStyles = БиблиотекаNET.ПолучитьТип("System.Globalization.DateTimeStyles");
Дата = DateTime.ParseExact
                    (
                    "10 февраля 1978",
                    "dd MMMM yyyy",
                    ОбъектCultureInfo,
                    DataTimeStyles.None
                    );

Не проблема завернуть в функцию. С этим справится не только взрослый, но даже
342 Garykom
 
гуру
30.12.15
11:54
(341) так это нужно знать c# чтобы "правильно завернуть"
иначе при заворачивания ничего не будет работать
343 Serginio1
 
30.12.15
12:00
(342) Знать надо .Net. Есть документация например https://msdn.microsoft.com/ru-ru/library/system.datetime.parseexact(v=vs.110).aspx

Есть Google, форумы где можно найти решение проблемы. Главное задать вопрос и многие помогут. Проблема в том, что никто и задавать то вопросы не хочет, а если даешь готовое решение, то не берут, но кактус то едят
344 Garykom
 
гуру
30.12.15
18:06
(343) кактус невкусный можно не жуя проглотить быстро, а на изучение .net сколько времени уйдет?
345 Garykom
 
гуру
30.12.15
18:07
(344)+ а кто .net уже изучил тому (0) нафиг не сдалось, так как легко в шаблон ВК что нужно вставит
или другим способом извратится при желании
346 Serginio1
 
30.12.15
19:16
(345) Я делал эту разработку, для того что бы использовать вэб сервисы неподдерживаемые 1С, где была куча классов и оборачивать их в COM было муторно. Кроме того динамическая компиляция свойств просто экономит кучу времени, где это надо делать вручную.

Еще раз. Многие пользуются COM объектами просто копируя примеры. Использование .Net будет больше, когда этих примеров будет тоже куча. Но к сожалению пока очень мало, кто использует эту разработку. Поэтому я и прилагаю силы для её рекламы.

Кстати 1C Messenger для отправки сообщений, файлов и обмена данными между пользователям
тоже многих заинтересовал

http://catalog.mista.ru/public/434771/
347 Serginio1
 
30.12.15
19:17
Кроме того динамическая компиляция событий
348 Serginio1
 
30.12.15
19:22
346 +
Добавил в 1C Messenger  рабочий вариант для Android на Xamarin. Проверял на эмуляторе. На IOS не проверял.
Из пакетов убрал Xamarin.Forms.2.0.0.6490 он 20 мб
349 Serginio1
 
21.01.16
13:58
Поигрался со Scripting-APIhttps://github.com/dotnet/roslyn/wiki/Scripting-API-Samples#exprstrong

Создал сборку. Проинсталировал
Install-Package Microsoft.CodeAnalysis.Scripting

Создал класс
namespace ScriptApiDlls
{
   public class КлассДляВычесленияВыражений
    {
      public static  Microsoft.CodeAnalysis.Scripting.ScriptOptions Опции { get { return Microsoft.CodeAnalysis.Scripting.ScriptOptions.Default; } }
      
        public static object Вычислить(string Код, Microsoft.CodeAnalysis.Scripting.ScriptOptions опции )
        {
            return Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.EvaluateAsync(Код, опции).Result;

        }
    }
}
350 Serginio1
 
21.01.16
14:01
Теперь можно на примере регулярных выражений создать делегат и использовать его в Replace? например для того, что бы все слова начинались с заглавной буквы


врап=новый COMОбъект("NetObjectToIDispatch45");
    Match=Врап.ПолучитьТипИзСборки("System.Text.RegularExpressions.Match","System.dll");
    Regex=Врап.ПолучитьТип("System.Text.RegularExpressions.Regex");

    КлассДляВычесленияВыражений=Врап.ПолучитьТипИзСборки("ScriptApiDlls.КлассДляВычесленияВыражений",ПутьКДлл+"ScriptApiDlls.dll");
    ScriptOptions=КлассДляВычесленияВыражений.Опции;
    
    Слова = "надо заменить все первые буквы в словах на заглавные";
    pattern = "\w+";
    // MatchEvaluator evaluator = (MatchEvaluator)ПолучитьДелегат();
    scr = ScriptOptions.Default.WithReferences(Врап.ТипКакОбъект(Match).Assembly)
    .WithImports("System", "System.Text.RegularExpressions");
    ТекстДелегата =  "return (MatchEvaluator)((match) =>
    |{
    |  string x = match.Value;
    |// Если первая буква в нижнем регистре то заменяем на заглавную
    |if (char.IsLower(x[0]))
    |{
    |   // Capitalize it.
    |   return char.ToUpper(x[0]) + x.Substring(1, x.Length - 1);
    |}
    |return x;
    |
    |   });";
    
    evaluator = КлассДляВычесленияВыражений.Вычислить(ТекстДелегата,scr);
    Сообщить(Regex.Replace(Слова, pattern, evaluator));
351 Serginio1
 
21.01.16
14:02
В итоге получаем
Надо Заменить Все Первые Буквы В Словах На Заглавные
352 Serginio1
 
21.01.16
14:03
Может кто то придумает более интересные примеры и применение делегатов для часто используемых вычислений
353 Serginio1
 
21.01.16
15:04
Кстати практический пример. На инфостарте редактор схлопывает span с пробелами. Я не большой знаток регкспов по этому у меня вопрос.

Вот делегат который заменяет <span>     </span на nbsp; по количеству пробелов
MatchEvaluator ПолучитьДелегатДляЗкменыПробела()
        {
            return (MatchEvaluator)((match) =>
            {
                var группа = match.Groups[1];
                int размерГруппы = группа.Value.Length;
                if (размерГруппы == 0) return "";

                return string.Concat(Enumerable.Repeat(@"&nbsp;", размерГруппы));
            });

        }
354 Serginio1
 
21.01.16
15:07
Сам регекс такой

string words =textBoxOrig.Text;
string pattern = @"<span>( +)</span>";

MatchEvaluator evaluator = (MatchEvaluator)ПолучитьДелегатДляЗкменыПробела();
            textBoxEval.AppendText(Regex.Replace(words, pattern, evaluator));
355 Serginio1
 
22.01.16
11:34
Поизвращался еще с делегатами объекта

string ПолучитьСтрокуКласса()
        {
            var res = @" class ClassTest
    {
        string строка;
        public Func<string> ЗаданнаяСтрока;

        public ClassTest(string Строка)
        {
            строка = Строка;
            ЗаданнаяСтрока = () => строка;

        }

       public static Func<string> ПолучитьДелегатОбъекта(string Строка)
        {

            var obj = new ClassTest(Строка);
            return obj.ЗаданнаяСтрока;

        }

        }          
   return new Func<string, Func<string>>(ClassTest.ПолучитьДелегатОбъекта);
            ";

            return res;
        }
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            var делегат = (Func < string, Func< string >> )ClassTest.testReturnDelegate();

            textBoxEval.AppendText(делегат("Тестовая строка")()+Environment.NewLine);

            var scr = Microsoft.CodeAnalysis.Scripting.ScriptOptions.Default
                                           .WithImports("System");

            var Скрипт = Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.Create(ПолучитьСтрокуКласса(), scr);
         //   Скрипт.ContinueWith("return new Func<string, Func<string>>(ClassTest.ПолучитьДелегатОбъекта);");

            var obj = делегат = (Func<string, Func<string>>)(Скрипт.CreateDelegate()().Result);

            textBoxEval.AppendText(делегат("Тестовая строка 2")() + Environment.NewLine);
        }
    }
356 Serginio1
 
22.01.16
17:23
Хотя можно вызвать и
var result = Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript.EvaluateAsync(ПолучитьСтрокуКласса(), scr).Result;
            делегат = (Func<string, Func<string>>)result;
               textBoxEval.AppendText(делегат("Тестовая строка 2")() + Environment.NewLine);
357 Garykom
 
гуру
22.01.16
18:15
(356) Не подскажешь как на .net с чужими окнами работать?
К примеру отслеживать текст в них?

Хочу мини расширение для конфигуратора штатного, по шорткату чтобы интеллсенсе свой открывался
358 Garykom
 
гуру
22.01.16
18:28
(357)+
А еще можно ли в 1С 8 сделать динамическую компиляцию "кода 1С"?

Смысл сделать свою веб БСП.
Нечто вроде вызова в коде "ПодключитьМодуль("МойМодуль");"
И после этого можно вызывать процедуры и функции из "МойМодуль"
На языке 1С понятно тело модуля и процедур/функций.

Просто можно удобно сделать тогда и универсально для разных платформ и даже разных конф типовых готовые процедуры/функции сгруппированные по модулям.
359 Карупян
 
22.01.16
18:33
(357) хочешь свой опенконф написать?
360 Garykom
 
гуру
22.01.16
18:41
(359) нафуя? мне просто анализа кода и подстановки нужного хватит

или банальной вставки шаблонов тех же типовых циклов или прочих типа получение данных запросом и т.д.
361 Garykom
 
гуру
22.01.16
18:43
(360)+ логично к примеру что если пишу
"Для Каждого ТекСтр Из ТЗ Цикл" то после ентер оно "КонецЦикла;" само вставило ниже
и пустую строку еще оставило куда курсор встал автоматом ))
362 Garykom
 
гуру
22.01.16
18:45
(361)+ хотя да это одна из возможностей опенконфа для 1С 7.7
кроме прочей кучи плагинов
363 oleg_km
 
22.01.16
19:47
(357) Это вроде как hook

Вот мой класс, который отслеживает активизацию всех окон в 1С, может на основе свое создашь:

using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace _1CAddInNET
{
    [ComVisible(true)]
    [ProgId("1CAddInNET.HookWnd")]
    [ClassInterface(ClassInterfaceType.AutoDispatch)]
    [Guid("193E58D3-E598-4AA5-B624-0770A90AEBBD")]
    public class HookWnd
    {
        private const int HCBT_ACTIVATE = 5;
        private const int SW_HIDE = 0;
        private const int WH_CBT = 5;

        private ArrayList hookID;

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook, WinCallbackProc lpfn, IntPtr hMod, int dwThreadId);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool IsWindowVisible(IntPtr wParam);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern bool ShowWindow(IntPtr wParam, int nMode);

        private delegate IntPtr WinCallbackProc(int nCode, IntPtr wParam, IntPtr lParam);

        private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode == HCBT_ACTIVATE)
                if (IsWindowVisible(wParam))
                    ShowWindow(wParam, SW_HIDE);

            return IntPtr.Zero;
        }

        public HookWnd()
        {
            hookID = new ArrayList();
        }

        public void SetHook()
        {
            foreach (ProcessThread curThread in Process.GetCurrentProcess().Threads)
                hookID.Add(SetWindowsHookEx(WH_CBT, HookCallback, IntPtr.Zero, curThread.Id));
        }

        public void DoneHook()
        {
            foreach (IntPtr curHook in hookID)
                UnhookWindowsHookEx(curHook);
        }
    }
}
364 Garykom
 
гуру
22.01.16
19:56
(363) думал проще только через

[DllImport("user32")]
public static extern int FindWindow(string ClassName,string lpWindowName );

и даже без хуков на клаву, хотя с ними лучше будет
365 Serginio1
 
22.01.16
20:15
(364) Можно пройтись по элементам
http://rsdn.ru/forum/pda/2953653.1
366 Serginio1
 
22.01.16
20:16
Кроме того в ТестВК есть поиск окна 1С 7.7 и установки видимости
367 Garykom
 
гуру
22.01.16
20:18
(365) угу только вроде 1с 8 на вин мобайл не того ;)
368 Serginio1
 
22.01.16
20:22
(367) Win.Api то одинаковый. Посмотри как и ищется нужный элемент

       public static bool isChecked(IntPtr hwndCheck)
        {
            int BM_GETCHECK = 240;
            int BST_CHECKED = 1;
            int BST_UNCHECKED = 0;
            IntPtr res = Win32Window.SendMessage(hwndCheck, BM_GETCHECK, 0, 0);
            // Если галочка стоит.
            if ((int)res == BST_CHECKED)
            {
                return true;
            }
            // Если галочка не стоит.
            if ((int)res == BST_UNCHECKED)
            {
                return false;
            }
            return false;
        }
        public static void SetWLANState(bool state)
        {
            //SetWifi(true);

            //  WiFiAdapter().


            String ExeName = "ctlpnl.exe";
            String CmdLine = "\\Windows\\WLanPower.cpl,0";
            ProcessInfo pi = new ProcessInfo();

            //  CreateProcess(ExeName,CmdLine , pi);
            Int32 INFINITE;
            unchecked { INFINITE = (int)0xFFFFFFFF; }

            if (pi == null)
                pi = new ProcessInfo();
            byte[] si = new byte[128];
            CreateProcess(ExeName, CmdLine, IntPtr.Zero, IntPtr.Zero,
                0, 0, IntPtr.Zero, IntPtr.Zero, si, pi);

   //         Thread.Sleep(1000);


            IntPtr hWnd = Win32Window.FindWindow(null, "Set WLAN Power");
            while (hWnd == IntPtr.Zero)
            {
                Thread.Sleep(100);
                hWnd = Win32Window.FindWindow(null, "Set WLAN Power");
            }

            IntPtr gg;
            IntPtr OKHandle = IntPtr.Zero;
            IntPtr WLHandle = IntPtr.Zero;
            IntPtr CancelHandle = IntPtr.Zero;
            //  MessageBox.Show(Win32Window.GetWindowText(hEdit));
            gg = Win32Window.GetWindow(hWnd, GW.CHILD).Handle;
            while (gg != IntPtr.Zero)
            {
                if (Win32Window.GetWindowText(gg) == "OK")
                    OKHandle = gg;

                if (Win32Window.GetWindowText(gg) == "WirelessLAN ON")
                    WLHandle = gg;

                if (Win32Window.GetWindowText(gg) == "Cancel")
                    CancelHandle = gg;
                //     MessageBox.Show(Win32Window.GetWindowText(gg));
                //   MessageBox.Show(gg.Text);
                gg = Win32Window.GetWindow(gg, GW.HWNDNEXT).Handle;
                // gg = Win32Window.GetWindow(gg, GW.CHILD).Handle;
            }

//            MessageBox.Show(isChecked(WLHandle).ToString());
            if (isChecked(WLHandle)!=state)
            {
            emulPress(WLHandle);
            emulPress(OKHandle);
                
            }
            else
                emulPress(CancelHandle);    

            WaitForSingleObject(pi.hProcess, INFINITE);
          


        }
369 Serginio1
 
22.01.16
20:55
А вообще тебе проще обратиться к orefkov
а вин апи перевести на C# не проблема
370 Garykom
 
гуру
22.01.16
20:57
(368) да как бы в курсе как через вин апи, делал на лазарусе прогу по управлению другой прогой

вдруг думал на нет фреймворке что то уже изобрели
371 Garykom
 
гуру
22.01.16
20:57
(369) не будем отвлекать товарища, а то никогда снегопата не дождемся
372 Serginio1
 
22.01.16
21:04
(370) Ну интероп функций можно посмотреть здесь
http://www.pinvoke.net/default.aspx/user32.getwindow
373 Garykom
 
гуру
23.01.16
14:23
(372) бесполезно (почти) смотреть
похоже 1С очень не понравился openconf и в 8-ке сделано многое чтобы низзя было так просто наваять нечто подобное

поэтому и снегопату плохо )) и если в 1С захотят оно никогда не взлетит