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

Динамическая компиляция для использования .Net событий в 1С

Динамическая компиляция для использования .Net событий в 1С
Я
   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
   oleg_km
 
301 - 04.12.15 - 16:30
(300) Сейчас попробую все перечислить:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ОберткаСобытий= врап.СоздатьОберткуДляСобытий77(ОбертываемыйОбъект,ГлобальныйКонтекст);
   Serginio1
 
334 - 17.12.15 - 10:05
(331) Посмотри 1C Messenger для отправки сообщений, файлов и обмена данными между пользователям
SignalR это аналог udp только по HTTP со всеми вытекающими.
Плюс простота программирования.
   Serginio1
 
335 - 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Объект);
        
    КонецЕсли; 
    
    
    
    
КонецПроцедуры// ПолучитьОбертку()
   Serginio1
 
336 - 30.12.15 - 11:14
Кстати посмотрел многих заинтересовала Строка в дату
http://catalog.mista.ru/public/434345/

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

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

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

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

Не проблема завернуть в функцию. С этим справится не только взрослый, но даже
   Garykom
 
342 - 30.12.15 - 11:54
(341) так это нужно знать c# чтобы "правильно завернуть"

иначе при заворачивания ничего не будет работать
   Serginio1
 
343 - 30.12.15 - 12:00
(342) Знать надо .Net. Есть документация например https://msdn.microsoft.com/ru-ru/library/system.datetime.parseexact(v=vs.110).aspx

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

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

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

http://catalog.mista.ru/public/434771/
   Serginio1
 
347 - 30.12.15 - 19:17
Кроме того динамическая компиляция событий
   Serginio1
 
348 - 30.12.15 - 19:22
346 + 
Добавил в 1C Messenger  рабочий вариант для Android на Xamarin. Проверял на эмуляторе. На IOS не проверял. 
Из пакетов убрал Xamarin.Forms.2.0.0.6490 он 20 мб
   Serginio1
 
349 - 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;

        }
    }
}
   Serginio1
 
350 - 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));
   Serginio1
 
351 - 21.01.16 - 14:02
В итоге получаем
Надо Заменить Все Первые Буквы В Словах На Заглавные
   Serginio1
 
352 - 21.01.16 - 14:03
Может кто то придумает более интересные примеры и применение делегатов для часто используемых вычислений
   Serginio1
 
353 - 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;", размерГруппы)); 
            });

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

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

MatchEvaluator evaluator = (MatchEvaluator)ПолучитьДелегатДляЗкменыПробела();
            textBoxEval.AppendText(Regex.Replace(words, pattern, evaluator));
   Serginio1
 
355 - 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);
        }
    }
   Serginio1
 
356 - 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);
   Garykom
 
357 - 22.01.16 - 18:15
(356) Не подскажешь как на .net с чужими окнами работать?
К примеру отслеживать текст в них?

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

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

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

или банальной вставки шаблонов тех же типовых циклов или прочих типа получение данных запросом и т.д.
 
 
   Garykom
 
361 - 22.01.16 - 18:43
(360)+ логично к примеру что если пишу
"Для Каждого ТекСтр Из ТЗ Цикл" то после ентер оно "КонецЦикла;" само вставило ниже
и пустую строку еще оставило куда курсор встал автоматом ))
   Garykom
 
362 - 22.01.16 - 18:45
(361)+ хотя да это одна из возможностей опенконфа для 1С 7.7
кроме прочей кучи плагинов
   oleg_km
 
363 - 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);
        }
    }
}
   Garykom
 
364 - 22.01.16 - 19:56
(363) думал проще только через

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

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


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

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

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

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