ВК для 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 не будет опубликован. Обязательные поля помечены *