No Image

1C внешней компоненты android pdf

СОДЕРЖАНИЕ
1 просмотров
11 марта 2020

Реализовано в версии 8.3.9.1818.

Для мобильной платформы мы реализовали механизм внешних компонент. Он позволяет вам создавать внешние компоненты по технологии Native API аналогично тому, как это делается в платформе для персональных компьютеров. Конечно, есть некоторые особенности, связанные с мобильными операционными системами. Но в целом всё очень похоже.

Разрабатывая внешнюю компоненту, вы должны создать её варианты для всех интересующих вас операционных систем, и для всех процессоров мобильных устройств, на которых предполагается её работа. Все эти варианты нужно собрать в ZIP архив, и поместить его в макет конфигурации типа Внешняя компонента (это единственный способ добавить компоненту в конфигурацию). Это новый тип макета, который мы добавили в платформу.

После этого в мобильном приложении вы устанавливаете и подключаете её точно так же, как и в обычной платформе. Например, так:

Когда конфигурация написана, вы через пункты меню Конфигуратора Конфигурация – Мобильное приложение – Записать в файл выгружаете файл 1cem.zip для сборщика мобильных приложений.

В сборщике мобильных приложений мы добавили соответствующую возможность загружать такие архивы:

В целях отладки, вы можете вручную подменять файлы в выгруженном архиве, корректируя поведение собираемых приложений.

Включение необходимых библиотек в конечные приложения сборщик выполняет автоматически при сборке.

Архив внешней компоненты

ZIP архив внешней компоненты должен содержать набор обязательных файлов. Сборщиком автоматически отключается формирование конечных приложений для операционных систем, для которых нет в поставочном архиве всех обязательных файлов.

В ZIP архив могут входить:

  • Варианты компоненты для Windows (x86, ARM);
  • Варианты компоненты для Android (x86, ARM);
  • Дополнительно вы можете включить файл *.apk для кода Java;
  • Варианты компоненты для iOS (ARM и ARM64, объединенные в единый универсальный файл);
    • Важно, что для iOS требуется как динамическая (*.dylib), так и статическая библиотека *.a;
    • Файл MANIFEST.XML с описанием содержимого архива;
    • Дополнительно вы можете включить файл ANDROID_MANIFEST_EXTENTIONS.XML для описания изменений в AndroidManifest.xml, если они необходимы.
    • Также, при необходимости, вы можете включить файл WINDOWS_RT_MANIFEST_EXTENTIONS.XML и / или файл WINDOWS_RT_PHONE_MANIFEST_EXTENTIONS.XML для внесения изменений в AppxManifest.xml.
    • Особенности для разных операционных систем

      Специфика разработки приложений для iOS не позволяет использовать несистемные динамические библиотеки для публикации в AppStore. Поэтому, разрабатывая вариант внешней компоненты для iOS, вам надо иметь файл динамической библиотеки *.dylib для целей тестирования и отладки. А кроме этого вам понадобится бинарный файл *.a для статической линковки, которую выполнит сборщик мобильных приложений.

      Для исключения конфликта имен, код внешней компоненты должен находиться в собственном уникальном пространстве имен. Наименование пространства имен должно соответствовать имени внешней компоненты, или включать его как составляющую. Регистрация компоненты производится статически, при загрузке приложения.

      Чтобы разрабатывать вариант внешней компоненты для Windows Runtime, вам потребуется как минимум Windows 8.1 с MS Visual Studio 2013 SP4 (пакет Windows Phone SDK). Результатом разработки должна быть группа динамических библиотек (*.dll) для мобильных устройств и планшетов всех поддерживаемых процессоров.

      Разрабатывая вариант внешней компоненты для Android, вы можете писать код на языке программирования c++, а так же можете использовать технологии Java Native Interface. Результатом разработки должна быть группа динамических библиотек (*.so) для всех поддерживаемых процессоров. А если вы используете код Java, то должен присутствовать файл *.apk

      Во время публикации приложения в настройках http-сервера необходимо добавить типы MIME для следующих расширений: .so, .apk, .dylib, .a. Тип MIME: application/octet-stream.

      Ограничения

      Функциональность внешних компонент для мобильных приложений имеет ряд ограничений:

      • Нельзя использовать пользовательский интерфейс;
      • Запрещен вызов следующих методов из системного потока:
      • bool ADDIN_API Confirm(const WCHAR_T* queryText, tVariant* retVal);
      • bool ADDIN_API Alert(const WCHAR_T* text);
      • Причина заключается в том, что показ модальных окон в таком случае может вызвать «зависание» приложения;
    • Для Windows Runtime не реализована возможность загрузки динамических библиотек из публикации http-сервера.
    • Примеры

      В документацию по созданию внешних компонент мы добавили несколько материалов, которые помогут вам использовать эту технологию в мобильных приложениях.

      Во-первых, мы добавили шаблон внешней компоненты для мобильной платформы. Он облегчит вам создание компоненты “с нуля”. А во-вторых, мы добавили пример использования в конфигурации готовой внешней компоненты, разработанной с использованием технологии Native API. С описанием его свойств, методов и событий.

      Поддержка технологии внешних компонент (ТВК) мобильной платформой 1С начиная с 8-го релиза является почти революционным шагом. Особое ее значение проявляется в сегменте приложений для терминалов сбора данных и другого специального оборудования, где дизайн приложения (минус платформы 1С) играет второстепенную роль по отношению к функциональности. Мобильная технология внешних компонент, точно также как и стационарная, поддерживает работу с внешними устройствами. Кроме того, она позволяет расширить функциональность приложений, используя возможности ОС Андроид, напрямую обращаясь к API SDK.

      Со стороны программистов 1С с момента выхода к этой технологии проявляется устойчивый интерес. Вместе с тем в библиотеке Инфостарта и в сети пока мало реальных рабочих примеров, пусть даже с закрытым кодом, хотя ее описание и учебный пример опубликованы на официальном ресурсе 1С в открытом доступе. Как мне кажется, есть несколько препятствий для освоения технологии. Во-первых, примеры не содержат указания на среду разработки (кроме компонент для Windows 8 phone, но это выходит за рамки статьи), во-вторых, они скорее предназначены для профессионалов, имеющих опыт программирования на C++ под Android NDK и Java. Огромную трудность представляет отладка и поиск ошибок, половина из которых приводят к "падению" платформы. Для программиста с малым опытом в Android SDK и C++ JNI поиск источника ошибки будет непреодолимой преградой, если учесть, что сама ошибка может быть не в собственном коде, а в мобильной платформе.

      Читайте также:  Как правильно добавить оперативную память в компьютер

      В этой статье я попытаюсь объяснить по шагам процедуру создания внешних компонент на трех простых примерах. Но следует предупредить начинающих, что даже собрав и запустив эти примеры, на каждом следующем шаге в процессе самостоятельного освоения, вы будете сталкиваться с большими преградами. "Серебряной пули" на этом пути не существует! Мобильная разработка требует специфического опыта. К освоению технологии лучше приступать, если вы сталкивались с написанием нативных (NativeAPI) компонент для стационарной платформы 1С, знаете как и в какой последовательности платформа вызывает API компоненты, какие внешние интерфейсы и зачем должна реализовать компонента – эти вопросы здесь рассматриваться не будут. Также вам необходим опыт разработки приложений под Андроид. Особое внимание уделите средствам взаимодействия управляемого и неуправляемого кода (JNI). В награду, если у вас получится создать несколько мобильных компонент, вы окажетесь на голову выше не только ваших коллег 1С-ников, но и многих разработчиков Android, которые часто ограничиваются Java, Android SDK и frontend’ом. В отличие от них, вы будете знать такие сложные темы, как JNI, NDK, многопоточность, устройство ядра.

      Мобильная платформа предоставляет разработчикам внешних компонент интерфейс IComponetnBase (файл ComponentBase.h). Он является базой функционирования как мобильной так и десктопной внешней компоненты и состоит из интерфейсов:

      • IInitDoneBase – шлюз для получения функциональности платформы: загрузка/выгрузка, управление памятью, генерация внешних событий
      • ILanguageExtenderBase – описатель типа компоненты, предоставляет возможности для расширения встроенного языка 1С
      • LocaleBase – управление локализацией компоненты

      При начале работы с компонентой 1С вызывает несколько классических экспортных C-функций из динамической библиотеки компоненты:

      • GetClassNames – возвращает имена объектов вашей компоненты, это то, что пишется после на месте в коде 1С:
      • Get >Таким образом, наша задача – реализовать методы интерфейса IComponentBase. Минимальную компоненту можно сделать на C++, используя API ядра Linux. Но, к сожалению, их множество очень ограничено, поэтому трудно обойтись без JNI. С его помощью можно создавать и вызывать функции объектов java и, за некоторыми исключениями, написать компоненту полностью. Но перевести весь java-код в JNI очень трудоемко и чревато трудно обнаруживаемыми ошибками. Это может пригодится только, если вы хотите защитить свой код. В обычной практике лучше использовать часть на C++ как промежуточный слой, а главную реализацию сделать на Java.

      Разработчики платформы предоставляют нам доступ к движку Java через API getJniEnv() и интерфейс IAndroidComponentHelper. Последний обеспечивает доступ к контексту мобильного приложения через GetActivity() – функцию, возвращающую активность приложения. Класс java, отвечающий за взаимодействие с кодом на C++ реализует интерфейс Runnable. Это – признак многопоточности, т.е. компонента запускается в отдельном потоке (thread) приложения. Одно из следствий этого – невозможность взаимодействия с интерфейсом приложения и создания собственных активностей.

      Обратные вызовы платформы из Java-кода функций C++ выполняются через Java native call. Часто в технологии внешних компонент эти вызовы используются для генерации внешних событий.

      В примерах я покажу, как создать простейшую компоненту на C++ (пример 1), как вызвать методы классов Java стандартных библиотек Андроида (пример 2) из C++ кода. Пример 3 представит приложение, реализующее все участки архитектуры.

      В принципе, для создания мобильных внешних компонент необходим компилятор C++ и Java под Android SDK. Для них существует много RAD и вы можете использовать любые по своему вкусу. Содержание этого раздела отражает лишь мой личный опыт использования MS Visual Studio 2017 и Android studio. Но кто-то захочет предпочесть NetBeans, Eclipse и др. – выбор широк.

      Для разработки на VS2017 + Android studio на вашем компьютере должны быть:

      1. Операционная система Windows 10 pro или выше.
      2. Платформа 1С:Предприятие 8.3, необходимо скачать архив свежего релиза мобильной платформы (рекомендуем не ниже 12го!), распаковать и установить сборщик мобильных приложений. (Этот этап и настройку сборщика не описываем, полагаем программисты 1С мобильных приложений знают, как это делать).
      3. С сайта ИТС скачать и распаковать в отдельную папку примеры внешних компонент, нам впоследствии понадобятся из них отдельные заголовочные файлы для C++ проекта.
      4. Со страницы https://visualstudio.microsoft.com загружаем небольшой установщик Visual studio community edition. Эта версия свободная и может использоваться индивидуальными разработчиками для создания коммерческих продуктов. (Если у вас есть платная версия – конечно используйте ее).
      5. Запускаем установщик, после того, как он подготовит среду, ожидаем экран, похожий на этот: Если вы планируете использовать студию только для разработки мобильных компонент, вам достаточно включить флажок "Mobile development with C++". Запускаем установку и ожидаем ее окончания. Все компоненты студия загружает из интернет, поэтому позаботьтесь о хорошем канале.
      6. Загружаем установщик Android studio: https://developer.android.com/studio. Запускаем и устанавливаем продукт.
      7. Запускаем Android studio, чтобы она загрузила и установила необходимые компоненты, в первую очередь Android SDK.

      Пример 1: "Задержка"

      Внешняя компонента без использования JNI

      Реализация первого примера очень простая, буквально пара строчек кода, которые я приведу в конце раздела (не считая реализации архитектуры компоненты конечно). Вначале сосредоточимся на создании проекта. В Visual studio создаем новый проект с типом C++ cross platform mobile – android – dynamic shared library:

      Читайте также:  База данных растений access

      После открытия проекта Visual studio создаст два файла с именем проекта: SharedObject1.h и SharedObject1.cpp. Я их удаляю – мы будем использовать заготовки из шаблона внешних компонент 1С.

      На этом рисунке показаны из шаблона, которые вам необходимо включать в проект каждой компоненты. Вносить изменения в них не рекомендуется. Теперь настроим свойства проекта. На закладке General я изменяю имя выходного файла с учетом архитектуры процессора (выделено жирным), чтобы их можно было помещать в архив компоненты без переименования. В качестве компилятора можно использовать любой, я предпочитаю GCC, по отзывам генерирующий более эффективный код для ARM процессоров:

      Версию языка (закладка Language с разделе C/C++) установим 11-ю, чтобы использовать преимущества современного C++ при разработке.

      Теперь необходимо создать основной класс компоненты, который будет вызываться из 1С кодом:

      Он наследуется от IComponentBase. Начинающий разработчик может взять за образец файлы AddInNative.h и AddInNative.cpp. В определении класса следует модифицировать перечисления Props и Methods и приватную часть класса. Наш пример будет выполнять задержку в ходе работы приложения на заданное число миллисекунд, логично для этого сделать метод: в перечислении Methods добавим значение eMethDelay. В файле AddInNative.cpp прописываем в статические массивы g_MethodNames и g_MethodNamesRu английское и русское имя метода. Сигнатуры методов задаются в GetNParams, GetParamDefValue и в HasRetValue. Пусть метод Delay принимает один параметр – целое число – количество миллисекунд задержки, соответственно GetNParams должен вернуть 1, HasRetValue – false. Реализацию метода пишем в CallAsProg. В ОС Андроид задержку можно реализовать, вызвав API ядра Linux – sleep или воспользоваться стандартной библиотекой C++ (здесь нам пригодилось использование версии 11 языка). Выберем последний вариант как более универсальный:

      После компиляции проекта для процессоров ARM и x86 создадим манифест компоненты:

      Если мы хотим ограничиться только первым или вторым примерами, apk-составляющие в архив можно не включать. Независимо от архитектуры устройства, имя разворачиваемой компоненты будет ru_infostart_education – оно нам потребуется в третьем примере, когда мы будет из java делать обратный вызов в библиотеку C++. Помещаем в архив динамические библиотеки so и этот манифест – и компонента готова.

      Пример 2: "Информация об устройстве"

      Внешняя компонента с вызовами JNI

      Задача следующего примера – продемонстрировать вызовы сущностей объектов java из C++. Для этого попробуем получить имя производителя и модели устройства с помощью класса Build. В компоненте реализуем свойство ePropDevice только для чтения. Для настройки сигнатур свойств IComponentBase предоставляет ряд методов, которые должны быть читателю известны по технологии внешних компонент для настольной платформы. Сосредоточимся на коде:

      Фактически это – классический вызов статических свойств класса java через JNI с той разницей, что указатель на окружение виртуальной машины извлекается не из функции main, а из getJniEnv() или IAndroidComponentHelper. Вспомогательные функции ToWStringJni и ToV8String выполняют преобразования строк и параметров, их код вы найдете в примере к статье. В коде C++ внешней компоненты следует строго следовать правилам программирования JNI, по собственному опыту сформулирую наиболее важные моменты:

      • возвращайте как можно раньше указатели сборщику мусора с помощью DeleteLocalRef и DeleteGlobalRef
      • локальные указатели преобразовывайте в глобальные, если их следует передавать в другие процедуры, а также если в процессе их "жизни" используются методы интерфейсов 1С (например, передается внешнее событие ExternalEvent)
      • при работе с java-строками GetStringChar, а не GetStringUTFChar, не забывайте о ReleaseStringChars. Помните, что в Андроид размер переменной char равен 16 битам

      Пример 3: "Состояние экрана"

      Внешняя компонента с кодом java

      Создадим внешнюю компоненту, отслеживающую событие разблокировки экрана устройства и посылающую об этом оповещение в 1С. В андроиде все оповещения получает класс BroadcastReceiver, который перед регистрацией в контексте приложения предварительно необходимо настроить, указав в отслеживаемые намерения (Intent) и возможно другие параметры. Настройка выполняется в коде или в манифесте приложения. Во внешней компоненте доступен только первый вариант, так как манифест создается сборщиком приложений автоматически. Логика работы компоненты будет реализована на java, а код C++ будет вызывать сущности из apk и передавать внешние события в 1С. Создание объектов и вызов сущностей из созданной вами компоненты на java точно такое же как в примере 2 для стандартных библиотек – через JNI. Чтобы объекты apk были доступны из C++, они должны быть публичными (public). Для создания java-приложения компоненты сделайте в Android studio проект без активностей, я также удаляю из него лишние ресурсы (папка res), но это не обязательно. Ни ресурсы ни манифест проекта для компоненты значения не имеют и в ней не используются. В проект добавляем класс, реализующий интерфейс Runnable, например так:

      И реализуем его как класс внешней компоненты. Для генерации внешних событий будет необходимо вызывать функцию из нашей динамической библиотеки. Имя ее мы задали в манифесте компоненты – "ru_infostart_education", а имя экспортной функции, вызываемой по правилам языка C должно состоять из префика Java_, имени пространства имен в apk (у нас это будет ru.infostart.education) и имени нативной java функции, которую нужно задекларировать в классе. Первые два аргумента зависят от типа функции (статический член класса или нет), остальные аргументы должны соответствовать декларации. Подробнее об этом смотрите в правилах вызова нативных функций из java. После сборки apk в Android studio, его следует переименовать в infostart.apk и поместить в архив.

      Читайте также:  Lenovo b320 нет изображения

      Подробнее покажем взаимодействие класса LockState с C++ кодом. В нем объявим такой член:

      Соответствующая функция C в коде компоненты должна быть следующей:

      в ней реализуем генерацию внешнего события в 1С через ExternalEvent. Требует пояснения аргумент pObject – это указатель на интерфейс 1С платформы, который передается в класс LockState в его конструкторе. Он нужен, чтобы вернуть его обратно в экспортную функцию, так как функции типа extern с C++ не могут принадлежать какому-то классу и мы не можем в них получать адреса интерфейсов, который хранит AddInNative. Другое решение данной проблемы – глобальная переменная в коде C++ компоненты, но оно с точки зрения объектно-ориентированного подхода хуже. Приведем код начала класса LockState:

      Член m_Activity необходим для получения контекста приложения, с его помощью можно зарегистрировать BroadcastReceiver. В методе run выполняется загрузка so-библиотеки в управляемый код. Метод show стандартен, он позволяет выполнить код компоненты в контексте вашего приложения.

      Полный код этого и предшествующих примеров, а также конфигурацию 1С для их вызовов участники INFOSTART 2018 Education могут получить на форуме конференции. Для всех – ссылка на эти же примеры в приложении.

      Данная статья написана по итогам доклада, прочитанного на конференции INFOSTART EVENT 2018 EDUCATION. Больше статей можно прочитать здесь.

      В 2020 году приглашаем всех принять участие в 7 региональных митапах, а также юбилейной INFOSTART EVENT 2020 в Москве.

      Общее описание

      Отлично подходит для печати прикрепленных файлов в формате PDF, а также печатных форм, есть возможность загрузки PDF из двоичных данных, позволяет показывать диалог печати с установкой диапазона страниц и количества копий или же задавать принтер и диапазон страниц непосредственно в вызове.

      Для подключения компоненты используются стандартные методы УстановитьВнешнююКомпоненту() на Клиенте в синхронном режиме, ПодключитьВнешнююКомпоненту() на Сервере или на Клиенте в синхронном режиме, и НачатьУстановкуВнешнейКомпоненты() и НачатьПодключениеВнешнейКомпоненты() на Клиенте в асинхронном режиме вызовов.

      Перед началом работы на стороне клиента в асинхронном режиме необходимо вызвать установку компоненты:

      Далее необходимо ее подключить и можно вызывать ее методы:

      Примерный код использования компоненты на стороне Клиента в асинхронном режиме может выглядеть так:

      Есть возможность вызова компоненты из внешней обработки, чтобы не снимать типовую конфигурацию с поддержки, рабочий код использования компоненты представлен в обработке TestPrintPDF.epf (в обработке отсутствует компонента, поэтому ее нужно загрузить в макет после покупки).

      Компонента работает как на x86, так и x86_64 платформах, в режиме Сервера, Тонкого клиента и Веб-клиента (для браузеров Firefox и Chrome), распространяется в виде пакетного файла, который содержит в себе все версии компоненты.

      Протестировано на всех версиях платформы, начиная от 8.2.19.130.

      Методы:

      Печать / Print – основной и пока единственный метод, отправляет файл на печать

      Может вызываться как с передачей имени файла, так и двоичных данных

      Параметры при передаче имени файла:
      ПутьКФайлу – обязательный, тип "Строка", полный путь к файлу PDF
      Описание – обязательный, тип "Строка", описание задания печати
      ПоказыватьДиалогПечати – необязательный, тип "Булево", определяет показывать диалог печати или нет, значение по умолчанию – Ложь
      ИмяПринтера – необязательный, тип "Строка", имя принтера, на который будет отправлен документ, если не определен, то печать осуществляется на принтер, установленный по умолчанию в система
      Пароль – необязательный, тип "Строка", пароль для чтения защищенного PDF-файла
      Страницы – необязательный, тип "Строка", диапазоны страниц для печати, разделенные запятыми (например "1,5,6", или "1-3,7-9", или "1,3-5")
      Автоповорот – необязательный, тип "Булево"
      Копий – необязательный, тип "Число", количество копий
      ДвусторонняяПечать – необязательный, тип "Число", режим двусторонней печати:
      0 – использовать настройки принтера (по умолчанию);
      1 – односторонняя печать;
      2 – двусторонняя печать (поворот вверх);
      3 – двусторонняя печать (поворот влево);

      Параметры при передаче двоичных данных:
      Данные – обязательный, тип "ДвоичныеДанные", двоичные данные файла PDF
      Описание – обязательный, тип "Строка", описание задания печати
      ПоказыватьДиалогПечати – необязательный, тип "Булево", определяет показывать диалог печати или нет, значение по умолчанию – Ложь
      ИмяПринтера – необязательный, тип "Строка", имя принтера, на который будет отправлен документ, если не определен, то печать осуществляется на принтер, установленный по умолчанию в система
      Пароль – необязательный, тип "Строка", пароль для чтения защищенного PDF-файла
      Страницы – необязательный, тип "Строка", диапазоны страниц для печати, разделенные запятыми (например "1,5,6", или "1-3,7-9", или "1,3-5"
      Автоповорот – необязательный, тип "Булево"
      Копий – необязательный, тип "Число", количество копий
      ДвусторонняяПечать – необязательный, тип "Число", режим двусторонней печати:
      0 – использовать настройки принтера (по умолчанию);
      1 – односторонняя печать;
      2 – двусторонняя печать (поворот вверх);
      3 – двусторонняя печать (поворот влево);

      Важно

      В асинхронном режиме вызовы методов должны выполняться через НачатьВызов, например:

      Гарантия возврата денег

      ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом в течение 14-ти дней со дня поступления денег на наш счет.

      Программа настолько проверена в работе, что мы с полной уверенностью можем дать такую гарантию. Мы хотим, чтобы все наши покупатели оставались довольны покупкой.

      Для возврата оплаты просто свяжитесь с нами.

      Комментировать
      1 просмотров
      Комментариев нет, будьте первым кто его оставит

      Это интересно
      No Image Компьютеры
      0 комментариев
      No Image Компьютеры
      0 комментариев
      No Image Компьютеры
      0 комментариев
      No Image Компьютеры
      0 комментариев
      Adblock detector