ВК для 1С:Предприятие 8.2 NativeAPI на Delphi (запуск приложений, раскладка клавиатуры, события и др.)

Внешняя компонента на основе разработки Крипича http://infostart.ru/public/81644/ — NativeAPI на Delphi реализует запуск процесса с заданным приоритетом и видимостью окна, переключение раскладки клавиатуры, всплывающие сообщения в трее, паузу sleep без загрузки процессора и внешние события.

На основе разработки участника Крипич //infostart.ru/public/81644/ сделана компонента, которая выполняет несколько полезных действий. Исходный код, тестовая конфигурация и страница с подробным описанием приведены в комплекте. Реализует следующие методы:

ПереключитьРаскладкуКлавиатуры — позволяет программно включить требуемую языковую раскладку клавиатуры.

ЗапуститьПриложение — запускает приложение, чтобы обойти ограничения 1с. Позволяет выставить видимость окна, приоритет и процессоры.

ПоказатьСообщениеВТрее
  — показывает всплывающие сообщения в трее Windows (рядом с часами).

Сон (Sleep) — делает паузу на указанное количество миллисекунд, не нагружая процессор.

ВнешнееСобытие — инициирует внешнее событие

В шаблон _CallAsFunc и _CallAsProc и др. модуля v8napi.pas добавлена обработка исключения и добавлен параметр для вызова событий.

UPD: NativeAPI — это новая технология для внешних компонент без использования COM, которая появилась в 1С 8.2. На диске ИТС 1С выложила образец в папке VNCOMP82 только для C++ (не написали чем компилить, но методом исключения — VS 2008), участник Кирпич (см. ссылку выше) изготовил образец для Delphi, который собственно тут и применен. Список методов скорее всего будет дополняться, это первое что пришло в голову (переключатель языка клавиатуры попросили, т.к. через WScrpit.Shell не сделаешь, и с запуском внешних приложений была у коллеги проблема).

А чем может быть удобна NativeAPI для конечных пользователей и распространителей решений — COM создает известные проблемы для пользователей, у которых нет расширенных (админских) прав в системе, и соответственно компоненты то работают, то не работают, то загружаются, то не загружаются, то загружаются неизвестно откуда и т.д. В 8.2 проблемы с этим устранены путем отказа от технологии COM в пользу более традиционной технологии DLL, для которой не нужны права на запись к реестру. Также можно из браузера FF и IE (пока не проверял) эти новые компоненты вызывать.

Сам код компоненты выглядит намного яснее.

UPD2: Добавлены внешние события, тестовая конфигурация и подробное описание (readme.html) в комплекте. Страница обсуждения на форуме mista.ru: http://forum.mista.ru/topic.php?id=562506

53 Comments

  1. CaSH_2004

    А есть ли к ней описание методов?

    Reply
  2. CaSH_2004

    Скачал, описание есть. За исходники спасибо. Функционал явно бедный, Sleep — можно делать и через вызов VBScipt, балоны вызывать удобнее

    ShowTray http://infostart.ru/public/20531/

    Tray1C http://infostart.ru/public/18821/

    MiracleV8 http://dev.1tsm.ru/project/110 — на мой взгляд самая продвинутая

    а ПереключитьРаскладкуКлавиатуры и ЗапуститьПриложение для меня всегда было загадкой в 1С

    Так что выглядит как перепевки уже страых решений, возможно я и не прав, если автор готов объснить для чего все это?

    Reply
  3. Serj1C

    (2) вы перечисляете ВК на старой методике. а это новая — NativeAPI (возможность использования в управляемых формах, линуксе и т.д.) // если я не ошибаюсь

    Reply
  4. DrAku1a

    Пригодится как пример и шаблон для разработки своих ВК. Однозначно плюсую!

    Reply
  5. cool.vlad4

    (2) послушайте 3, это native ВК — так, что не путайте, …были у меня кое-какие дельфийские примочки,нативная работа с excel и т.д. надо будет попробовать эти ВК…

    Reply
  6. cool.vlad4

    (6) Не придирайтесь, а прочитайте название «ВК для 1С:Предприятие 8.2 NativeAPI » Куда яснее уж…

    Reply
  7. CaSH_2004

    cool.vlad4,

    Да не было и в мыслях, я не разработчик ВК (когда то пытался, но не впечатлило), хотя плотно ими пользуюсь, тем не менее мне ничего не говорит надпись «ВК для 1С:Предприятие 8.2 NativeAPI», кроме того что она:

    1. ВК

    2. для 1С 8.2

    3. называется NativeAPI

    А т.к. пользуюсь другими то вот и спрашиваю автора, а в чем принципиальная разница? Нигде не указано что это «проба пера» — тогда было бы ясно, так что пока очередной «велосипед»

    Думаю другим также будет непонятно, так что думаю вопрос закономерен и не бесполезен

    Reply
  8. Diversus

    (8) NativeAPI это технология внешней компоненты.

    Если Вам ничего это слово не говорит, то прежде чем писать, стоит про нее узнать побольше.

    Reply
  9. CaSH_2004
    Diversus пишет:

    (8) NativeAPI это технология внешней компоненты.

    Если Вам ничего это слово не говорит, то прежде чем писать, стоит про нее узнать побольше.

    А я тут что по вашему делаю? Или мне нужно каждое незнакомое слово гуглить? в описании сложно сказать об этом или все должны догадываться? Может эта разработка только для разработчиков ВК?

    Reply
  10. Diversus

    (10) Ну в таком случае Вам сюда: http://v8.1c.ru/overview/Term_000000545.htm

    Reply
  11. CaSH_2004

    Diversus, Это уже лучше, а чем же отличается это от того что в ShowTray, Tray1C, MiracleV8? они написаны без этого?

    Reply
  12. cool.vlad4

    😀 😥 😮 (12) берете ИТС и находите ТСВК — технология создания ВК

    Reply
  13. Diversus

    (12) Это можете, как справедливо заметил cool.vlad4, прочитать на диске ИТС либо в интернете.

    Reply
  14. CaSH_2004

    Мда, получается разговор барана с воротами — непонятно кто прав, но не один не уступит. Я вам говорю про элементарные вроде вещи, что если выкладывается разработка нужно указать в чем ее преимущества/отличия перед уже имеющимися (зарекомендованными). А вы мне в ответ: разбирайся сам. Зачем тогда это все человеку который не увидел преимущества? Ведь проще использовать уже имеющееся чем перенастраивать. Как говорилось в фильме «Пароль Рыба-меч» — «Тема-то не раскрыта».

    Reply
  15. K_A_O

    (15) Но ведь слово NativeAPI — это и есть описание преимуществ/отличий перед уже имеющимися. Если вы не хотите посмотреть, что это такое, как угадать какие слова в описании вас устроят.

    Reply
  16. CaSH_2004

    (16)Я уже давно глянул и прочитал, вот только никак не пойму каким образом незнакомое слово в названии разработки может дать понимание того что это какая то технология которую нужно найти в поисковике и прочитать про нее. Если бы так рекламировали продукты 1С, Microsoft и другие то их никто бы не знал, т.к. название ни о чем не говорит, а говорит об этом описание которого у данной обработки не наблюдается. Вот что я хотел бы сказать, но что то никто не поймет меня, может потому что все уже знают что такое NativeAPI, а я до этого не знал. Но это никак не дает понимание разработки для других «непосвященных» в создание ВК. Вообще странно отсылать к разработке ВК для того чтобы понять ее преимущества, исходя из этой логики чтобы понять что такое 1С мне нужно сначала пройти курсы бухгалтера, поработать без ПК 1-2 годика, потом пройти курсы программирования на C++, поработать программистом и только потом я вдруг пойму что такое 1С и для чего она нужна и как ее сделали. Но вроде для этого есть понятие гиперссылки которые ведут на другие ресуры с пояснениями — вот чего я хотел в описании. Вроде тривиально, ан нет…

    Reply
  17. cool.vlad4

    (17) Платите автору ВК деньги как платят деньги производителям проприетарного софта (1С, микрософт) и будет вам описание и реклама…а так нахаляву, вам на блюдечке преподносят пример-шаблон ВК, будьте добры хоть посидеть, почитать, разобратся…задача программиста заключается в постановке цели и ее исследовании, и ее достижение, а не в слепом следовании пунктам чьих-то руководств…

    Reply
  18. cool.vlad4

    (19) Вы серьезно? Не потроллить? КАКАЯ нафиг документация, два с половиной метода, в описании все есть, сделано явно как пример для обучения, тем, кто будет разрабатывать ВК, но вы не собираетесь ни вникать, ни разрабатывать, так, что проходите мимо.

    Reply
  19. CaSH_2004

    (20)Не надо так наезжать. Где это вам удалось увидеть у меня слово «документация»? Я сказал вцелом документирование, а не применительно к данному случаю. В данном случае я думаю всем пользователям разработки будет полезно знать в чем ее преимущество перед уже имеющимися. Если это просто пример разработки то где это написано? Или это рабочий вариант? Я уже начинаюсь сомневаться что оно вообще работает раз тут столько говорят про разработку, а не про использование. Про личные догадки не надо говорить, т.к. выводы каждого инивидума его личные проблемы. Выходит разработка относится к категории «разберись сам и пойми нужно ли оно тебе». Очень занятный подход.

    Reply
  20. CaSH_2004

    Спасибо romix за реакцию на просьбы пользователей!

    Reply
  21. nicxxx

    проверка

    Reply
  22. I_G_O_R

    Reply
  23. Собеседник

    много флуда.

    вещь нужная — спс

    а перехват нажатий клавиш (чтоб потом вызвать событие) буит?

    Reply
  24. pulpik

    платформа 8.2.14.533

    использую описанный на ИТС от 1С метод загрузки из конфигурации (из макета с двоичными данными)

    создал архив из dll + файл манифест xml

    <?xml version=»1.0″ encoding=»utf-8″?>

    <bundle xmlns=»http://v8.1c.ru/8.2/addin/bundle»>

    <component os=»Windows» path=»exec82.dll» type=»native» arch=»i386″ />

    <component os=»Windows» path=»exec82.dll» type=»native» arch=»x86_64″ />

    </bundle>

    установка и подключение проходят без ошибок, но при создании объекта ОбъектВК = Новый(«AddIn.DemoLib.ExecExtention»); выдает ошибку «тип не определен»

    Не подскажите в чем ошибка

    Reply
  25. pulpik
    pulpik пишет:

    платформа 8.2.14.533

    использую описанный на ИТС от 1С метод загрузки из конфигурации (из макета с двоичными данными)

    создал архив из dll + файл манифест xml

    <?xml version=»1.0″ encoding=»utf-8″?>

    <component os=»Windows» path=»exec82.dll» type=»native» arch=»i386″ />

    <component os=»Windows» path=»exec82.dll» type=»native» arch=»x86_64″ />

    установка и подключение проходят без ошибок, но при создании объекта ОбъектВК = Новый(«AddIn.DemoLib.ExecExtention»); выдает ошибку «тип не определен»

    Не подскажите в чем ошибка

    Показать

    вопрос снят, разобрался.

    Reply
  26. pulpik

    а как можно изменить иконку появления в трее?

    Reply
  27. zahar33

    Подскажите наилучший вариант кода , чтоб отловить событие нажатия клавиш «+++» на Delfi для этой компонеты

    Reply
  28. zahar33

    Если, конечно, это возможно

    Reply
  29. mur611

    Здравствуйте, сложно данный пример переделать для работы с COM портами? если все функции и процедуры готовые есть, правда из СОМ объекта. и где нужно вставлять данные функции и процедуры?

    Reply
  30. slaviksoft

    (19) CaSH_2004,

    ну про барана тут все понятно 🙂

    Reply
  31. slaviksoft

    спасибо за пример.

    есть вопрос.

    когда мы вызываем насильственно ошибку Raise Exception.Create(‘Ошибка записи в порт’);

    она обрабатывается и вызывается процедура: addError(1006, ‘Внешняя компонента’, pWideChar(err), E_FAIL);

    она, как я понял напрямую выводит сообщение в окно сообщений 1С.

    можно ли сделать так что-бы описание ошибки попадало в 1с-методы «ИнформацияОбОшибке()» или «ОписаниеОшибки()»?

    Reply
  32. slaviksoft
    Reply
  33. tango

    (19) минус за «о непрофессионализме и неуважении» — по отношению к автору публикации это ваще не гуд

    Reply
  34. gavrikprog

    Почитал достаточно всего, инет порыл.

    Вопрос остался без ответа(ибо уровень ввода в тему все равно на уровне 0 почти).

    Есть ли возможность манипулировать данными базы 1С из внешней компоненты(не создавая OLE или Com соединение специально в компоненте).

    К примеру в документе есть реквизит Сумма, нажали команду Изменить компоненты Native API и у нас выполнилась процедура, кот. без возвращаемых значений изменила значение этого реквизита ?

    Или к примеру выполнить функцию общего модуля 1С

    /***********************

    Прошел еще раз документацию/

    Правильно я понял, что это возможно только в COM-компонентах ?

    Reply
  35. h_ex_ak_74@mail.ru

    спасибо автору за пример,

    но такой вопрос, как запустить такую компоненту на 64х сервере?

    пробовал перекомпилировать dll, приложение падает при выполнении ПодключитьВнешнююКомпоненту.

    Reply
  36. Abadonna

    (2) CaSH_2004,

    Sleep — можно делать и через вызов VBScipt

    Да уж фиг нормальный слип через него сделаешь. Сам скрипт будет просто запускаться минимум миллисекунд 50-200

    Пробовал я ради интереса.

    Reply
  37. phabi0z

    Присоединяюсь к antoni

    Компилирую для x64 и сервер падает при вызове ПодключитьВнешнююКомпоненту

    Может быть нужно что-нибудь в manifest.xml подправить

    Нужно написать ВК для 64 сервера.

    Кто сталкивался — отзовитесь…

    Reply
  38. vladon

    Проблема с x64 явно в стандартах вызова (stdcall), если убрать stdcall из процедуры _Init, то падает и на win32.

    Сделал полный лог каждой строчки, так вот на win64 тормозится перед _Init.

    Что делать — пока ума не приложу, кто сталкивался?

    Reply
  39. DrZombi

    (38) Если пойти дальше, то Пауза на сервере через Джаву вообще не отработает по политике безопасности 🙂

    Что не говори, но если есть возможность написать паузу через ВК, что в тонком клиенте это лучше не упустить 🙂

    Reply
  40. uvsd2014

    спасибо, хорошая программа.

    Reply
  41. capitan

    Спасибо, то что нужно для быстрого старта.

    Reply
  42. Alien_job

    8.3.5.1570 при запуске тестовой базы вываливается с ошибкой {МодульУправляемогоПриложения(9)}: Тип не определен (AddIn.DemoLib.ExecExtention)

    Reply
  43. frkbvfnjh

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

    with AddFunc(‘ExternalEvent’, ‘ВнешнееСобытие’, @TMyClass.CreateEventFunc, 3) do
    begin
    DefParams.AddWString(‘Первый Параметр’, 0);
    DefParams.AddWString(‘Второй Параметр’, 1);
    DefParams.AddWString(‘Первый Параметр’, 2);
    end;

    Тоже вылетает, что ожидаемо… Нумерацию с 1-це тоже делал — не помогает. Было бы хорошо если бы в пример включили пример вызова с параметрами по умолчанию. Кстати в 1С вызываю так:

    ОбъектВК.ВнешнееСобытие(, , );
    Reply
  44. frkbvfnjh

    Что бы было понятней о каком участке кода идет речь:

    begin
    with ClassRegList.RegisterClass(TMyClass, ‘ExecExtention’, ‘TMyClass’) do
    begin
    AddFunc(‘RunApp’, ‘ЗапуститьПриложение’, @TMyClass.ExecFunc, 3);
    AddFunc(‘Sleep’, ‘Сон’, @TMyClass.SleepFunc, 1);
    AddFunc(‘ActivateKeyboardLayout’, ‘ПереключитьРаскладкуКлавиатуры’, @TMyClass.ActivateKeyboardLayoutFunc, 1);
    AddFunc(‘ShowBalloon’, ‘ПоказатьСообщениеВТрее’, @TMyClass.ShowBalloonFunc, 3);
    with AddFunc(‘ExternalEvent’, ‘ВнешнееСобытие’, @TMyClass.CreateEventFunc, 3) do
    begin
    DefParams.AddWString(‘Первый Параметр’, 0);
    DefParams.AddWString(‘Второй Параметр’, 1);
    DefParams.AddWString(‘Первый Параметр’, 2);
    end;
    //AddFunc(‘ExternalEvent’, ‘ВнешнееСобытие’, @TMyClass.CreateEventFunc, 3);
    AddFunc(‘SetStatusLine’, ‘УстановкаСтатуснойСтроки’, @TMyClass.SetStatusLineFunc, 1);
    
    AddProp(‘Visible’,’Видимость’,True,True, @TMyClass.PropertyVisibleGetSet);
    AddProp(‘Priority’,’Приоритет’,True,True, @TMyClass.PropertyPriorityGetSet);
    AddProp(‘Processors’,’Процессоры’,True,True, @TMyClass.PropertyProcessorsGetSet);
    AddProp(‘EventBufferDepth’,’ГлубинаБуфераСобытий’,True,True, @TMyClass.PropertyEventBufferDepthGetSet);
    end;
    
    
    end.

    Показать

    Reply
  45. premierex

    Ребята, а что же человеку (CaSH_2004) никто так и не объяснил, в чём отличие NatveAPI компонент от COM? Там же всё просто — в NativeAPI кроссплатформенность достигается зп счет отказа от COM технологий.

    COM, он же ActiveX, он же OLE — это одна и та же технология, построенная на использовании так называемых интерфейсов. Ну а поскольку эта технология (COM) — разработка компании Microsoft, то и работать она будет только под управлением OS Windows!.

    NaitiveAPI не позволяет использовать интерфейсы, поэтому и кроссплатформенная, и будет работать под всеми OS.

    Ну и минусы: все объекты ссылочного типа в 1С — это COM объекты. Поэтому из компонент, созданных по технологии NativeAPI в них попросту нельзя будет использовать.

    Какую технологию написания внешней компоненты использовать зависит только от того, будет ли компонента работать с объектами 1С ссылочного типа или нет. Если да — несомненно COM, иначе — NativeAPI (поскольку кроссплатформенная).

    Кстати, прикольно, 1С в примерах ВК по технологии NativeAPI тоже использует терминологию интерфесов. Только их там нет. Есть указатели на классы и куча подключаемых библиотек, которые, если писать по технологии СОМ, уже входят в поставку операционной системы (если, конечно писать на «чистом» С или С++ без использования фрэймворков).

    Поздно посмотрел на дату публикации ))) Полчаса коту под хвост )))

    Reply
  46. vla.dik67

    Добрый день!

    Подскажите, пожалуйста, почему в Lazarus не работает AllocMemory?

    Вот код:

    function _V8String(V8MM: TV8MemoryManager; W: WideString): PWideChar;
    var
    L: longword;
    begin
    result := nil;
    if Pointer(V8MM) = nil then
    Log(‘  _V8String: Pointer(V8MM) = nil’)
    else
    begin
    L := Length(W);
    L := L + L + 2;
    if V8MM.AllocMemory(@result, L) then
    begin
    if Pointer(result) = nil then
    Log(‘_V8String:  result = nil !!!’)
    else
    Move(W[1], result#k8SjZc9Dxk, L);
    end
    else
    Log(‘_V8String:  NO AllocMemory !!!’)
    end;
    end;
    

    Показать

    Переменная result — всегда равна nil после вызова V8MM.AllocMemory(@result, L).

    Такое ощущение, что AllocMemory не вызывается.

    Последовательность вызовов такая:

    _Init

    _setMemManager

    _SetLocale

    _GetInfo

    _RegisterExtensionAs

    _V8String: result = nil !!!

    В Turbo Delphi Explorer всё нормально работает.

    Версия Lazarus — 1.6

    Версия 1С — 8.3.7.1917

    Windows 7 Pro 32 bit

    Файлы проекта во вложении.

    Спасибо.

    Reply
  47. vla.dik67

    Добрый день!

    Подскажите, пожалуйста, почему в Lazarus не работает AllocMemory?

    Вот код:

    function _V8String(V8MM: TV8MemoryManager; W: WideString): PWideChar;
    var
    L: longword;
    begin
    result := nil;
    if Pointer(V8MM) = nil then
    Log(‘  _V8String: Pointer(V8MM) = nil’)
    else
    begin
    L := Length(W);
    L := L + L + 2;
    if V8MM.AllocMemory(@result, L) then
    begin
    if Pointer(result) = nil then
    Log(‘_V8String:  result = nil !!!’)
    else
    Move(W[1], result#k8SjZc9Dxk, L);
    end
    else
    Log(‘_V8String:  NO AllocMemory !!!’)
    end;
    end;
    

    Показать

    Переменная result — всегда равна nil после вызова V8MM.AllocMemory(@result, L).

    Такое ощущение, что AllocMemory не вызывается.

    Последовательность вызовов такая:

    _Init

    _setMemManager

    _SetLocale

    _GetInfo

    _RegisterExtensionAs

    _V8String: result = nil !!!

    В Turbo Delphi Explorer всё нормально работает.

    Версия Lazarus — 1.6

    Версия 1С — 8.3.7.1917

    Windows 7 Pro 32 bit

    Файлы проекта во вложении.

    Спасибо.

    Reply
  48. 7OH

    Добрый день.

    Прошу помощи ещё раз.

    Компоненту наваял — всё работает.

    Но когда дошло дело до внедрения на СЕРВЕРЕ — при подключении компоненты возвращает ложь.

    На х32 сервере — всё ОК.

    Как собирать компоненту под х64 — не подскажете ?

    Reply
  49. slaviksoft

    в этом модуле проблема с типами под х64 (думаю связано с разрядностью)

    есть на инфостарте пример с модулем под х64

    http://infostart.ru/public/81644/

    Reply
  50. 7OH

    (51) да — там есть немного — спасибо за наводку.

    Почитал — надо ставить новую среду (XE).

    Поставил XE8, но появилась новая проблема:

    мною используемый компонент dsPack использует в коде ASM, а гибридное содержимое в 64 компиляторе запрещено.

    Переписывать dsPack я не решился.

    А вот логику работы на клиент перенести — оказалось проще.

    Reply
  51. raider-rec@ya.ru

    (39)

    Еще актуально?

    Reply
  52. raider-rec@ya.ru

    (50)

    Но когда дошло дело до внедрения на СЕРВЕРЕ — при подключении компоненты возвращает ложь.

    В ТВК вроде так написано:

    Интерфейс 1С:Предприятия

    При инициализации объекта компоненты, ему передается указатель на интерфейс 1С:Предприятия, с помощью которого можно вызывать ниже перечисленные методы. Следует помнить, что эти методы не будут работать на сервере приложений.

    Reply
  53. and60

    Добрый день.

    Может подскажете, поможет ли мне эта компонента, или совет дадите :

    мне необходимо из одной программы :

    — желательно кодом на C# передать в 1С параметр (строку)

    — в 1С отловить это событие

    — обработать

    — каким то макаром вернуть результат обработки в вызвавшую событие программу(пока не знаю как это реализовать)

    И поясните, если не сложно :

    1) 1С без внешней компоненты не может перехватить внешнее событие?

    2) Какие есть варианты возврата результата обработки из 1С ? Не хочется проверять периодически на наличие файла с результатом…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *