Неправильный формат конфигурации 1с мобильное приложение

Обновлено: 07.07.2024

Любая программа, установленная на компьютер, может время от времени работать неправильно. Периодические сбои, которые приводят к невозможности использования ПО, называются ошибки. Чтобы суметь диагностировать и устранять ошибки в 1С, пользователь должен хотя бы немного разбираться в особенностях работы программ. Наличие минимальных знаний позволяет решать проблемы самостоятельно.

Прежде чем рассматривать основные разновидности ошибок, стоит заметить, что они отличаются между собой по происхождению. Приложение может привести к физическому или логическому сбою. В результате 1С просто не запускается или начинает работать в режиме «Конфигуратор». Пользовательский режим бывает недоступен или, при использовании определенных команд, будет появляться сбой.

Чтобы научиться быстро исправлять ошибки в 1С необходимо изначально их проанализировать. Часто во всплывающем окне написана суть некорректного поведения, что помогает решить проблему.

Причины появления ошибки в 1С

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

Одна из самых частых причин нарушение работы связанна с компьютером, на который установлена база данных 1С. Рабочая область может автоматически закрываться из-за нехватки оперативной памяти на сервере. Все возникающие неисправности должны быстро устраняться. В противном случае есть вероятность потери данных.

Часто возникающие ошибки 1С

Все имеющиеся сбои выводят на экран разные уведомления. Одинакового текста не бывает. Чтобы проще ориентироваться, разделим существующие ошибки 1С на следующие пункты:

  1. Недостаточно памяти.
  2. Ошибка доступа.
  3. Ошибка формата потока.
  4. Ошибка СУБД: Файл базы данных поврежден.
  5. Неправильное отображение блоков формы.
  6. Внутренняя ошибка компоненты dbeng.
  7. Dump при запуске.
  8. Неверный формат хранилища.
  9. Ничего не работает.

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

Недостаточно памяти

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

Пользователь может самостоятельно решить проблему с памятью. По умолчанию операционная система выделят фиксированное значение гигабайт на обслуживание приложения: 32 bit ОС – 2 Гб, 64 bit – 4 Гб.

Увеличить размер выделенной памяти можно вручную. Для этого запускается адресная строка (Пуск – Выполнить, вводиться фраза cmd). После нажатия «Ентер» достаточно ввести фразу bcdedit /set increaseuserva 4096 и подтвердить действие (клавиша «Enter»). Цифра 4096 – новый выделяемый объем «оперативки». Выполняется перезагрузка системы. Проблема должна быть устранена.

Ошибка доступа

Она возникает, если учетная запись не имеет достаточно прав. Проявляется при выполнении определенного действия, которое доступно только ограниченному кругу пользователей. Для исправления ситуации достаточно изменить роль выбранного профиля в конфигураторе (вкладка «Администрирование – Пользователи»). В некоторых случаях это увеличивает безопасность базы данных, если необходимо защитить файлы от изменения сторонними людьми.

Ошибка формата потока

Когда пользователь только запускает программу, на экране может появиться окно сбоя. Оно предлагает завершить работу или перезапустить. Причиной выступает некорректное завершение работы приложения.

Устранение подобной ошибки 1С выполняется простой чисткой кэша. Для этого необходимо перейти в папку, где хранятся временные файлы. В Windows 7 и выше она находится по адресу C:\Users\Username\AppData\Local\1C или C:\Users\Username\AppData\Roaming\1C. Для Windows ХР другой путь – Local Settings\Application Data\1C\. Все файлы, начинающиеся на 1cv8, кроме «1Cv8.1CD» полностью удаляются.

Если «Ошибка формата потока» возникает в процессе работы, то нужно провести тестирование (Администрирование – Тестирование и исправление), выбрать первые 2 галочки и запустить процесс.

Ошибка СУБД: Файл базы данных поврежден

Если всплывает информационное окно с подобной надписью, неисправность базы данных решается тестированием файла и всей информационной базы. Такое мероприятие может проводиться 2 способами:

  • Запуск утилиты chdbfl.exe. Эта программа предназначена для того, чтобы проверять целостность базы данных при совместном ее использовании с информационной базой. Данный метод хорош тем, что дает возможность решать сбои даже в тех ситуациях, когда конфигуратор запустить невозможно. Сначала выполняется резервное копирование информации. В папке, где установлен 1С (директория bin) находится файл chdbfl.exe. Он запускается, в окне прописывает путь к файлу базы данных и ставится галочка, чтобы провести исправление ошибок. Нажимается кнопка «Выполнить». После завершения процесса все должно заработать. Если нет – используется конфигуратор.
  • Через конфигуратор. Нужное окно вызывается после нажатия «Администрирование – Тестирование и исправление». На экране появляется форма, где выставляются галочки на следующе строчки: «Реиндексация таблиц…», «Проверка логической целостности…», «Проверка ссылочной…», «Реструктуризация таблиц…», «Тестирование и исправление» и 2 раза «Создать объекты». Нажимается кнопка «Выполнить». После завершения процедуры сбой устраняется.

Неправильное отображение блоков формы

Такая неисправность возникает от разных факторов. Чтобы привести программу к нормальной работоспособности, пользователю необходимо последовательно выполнить несколько команд. После проведения каждой проверяется устранение сбоя:

Если приведенные методы не помогают, рационально будет провести обновление платформы.

Внутренняя ошибка компоненты dbeng

Dump при запуске

Возвращение 1С в рабочее состояние проводится простым обновлением MS Visual Studio (Visual C++) и дополнительными манипуляциями. Чтобы отследить конкретный файл, в котором возникает ошибка, открывается «Просмотр событий». Для этого пользователь переходит в «Панель управления – Система и безопасность – Администрирование». С левой стороны раскрывается «Журнал Windows – Приложение».

На экране появляется список ошибок и точное расположение поврежденного файла. После установки новой версии MS Visual Studio (Visual C++) с папки System32 копируется одноименный файл dll и вставляется в папку платформы 1С. Проблема решилась.

Неверный формат хранилища

Ничего не работает

Если программа перестала нормально работать без видимых причин, значит пользователю придется самостоятельно искать неисправность. Для восстановления работоспособности базы данных проводятся следующие мероприятия:

  • чистится кэш;
  • открывается файл chdbfl.exe из папки установки приложения и выполняется исправление;
  • выполняется запуск «Конфигуратора» для тестирования и исправления сбоев;
  • обновление «1С».

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

Сразу скажу что несмотря на громкое, как кому-то могло показаться, название статьи — тут не будет никакого прям уж совсем хардкора. А также несмотря на то что реверсинг чаще всего связывается с информационной безопасностью — здесь опять же ничего такого не будет, ибо никаких защит (за исключением небольшой минификации) обходить не было необходимости. Нет их. Мобильная 1с бесплатный продукт в который не встроено никаких проверок, защит и платных функций.

Так что обращаюсь к тем кто надеется увидеть применение деобфускаторов, использование Frida/Xposed, другого хитрого софта — ничего интересного вы для себя не найдете. Тут мы просто будем использовать apktool, baksmali, apksigner, adb, jadx, консоль, текстовый редактор, javac, d8 и все.

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

Немного расскажу с чего мне вообще вдруг пришла идея как-то влезать в работу мобилки на 1с. На данный момент я вот уже скоро год как занимаюсь нативной разработкой под андроид, но до этого я проработал 4 года 1с программистом, причем последние года полтора мы часто работали именно с мобильной платформой. Несмотря на то что основные потребности она удовлетворяла, было у нее так же и очень много минусов (помимо языка программирования). В частности нельзя было по-человечески встроить какую нибудь внешнюю библиотеку, по крайней мере штатными средствами и с нашим тогдашним багажом знаний. Так же все было очень грустно, например, с функциональностью отображения меток на карте. Вся возможность ее настройки заключалась в указании текста для меток когда по ним тапаешь. На тот момент единственным способом как-то это обойти было использование специального объекта "ПолеHTMLДокумента", но с ним были свои проблемы. На время работы с 1с все мои знания в нативной разработке под андроид заключались в паре HelloWorld, так что идеи реверсить мобилку 1сную даже в голову не приходило, разные вопросы от заказчиков по нестандартному расширению возможностей 1с мы либо не решали никак, либо пилили очень простые нативные приложения ставившиеся рядом и криво/косо с 1с интегрировали (да и лицензионное соглашение 1с вроде запрещает правки в самой платформе).

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

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

Первое что я сделал, еще когда идея реверсить 1с только смутно бродила в моей голове, просто перетащил мышью apk файл приложения на окно AndroidStudio. Хочу сказать сразу — что мне стало немного грустно, ибо большая часть кода 1с написана на C++ и лежит в .so библиотеках, и их отреверсить посложнее, да и не было интересно. А вот файл classes.dex всецело завладел моим вниманием, тем более что его скромный размер давал мне возможность предположить что и реверсить его будет несложно. В целом так и оказалось. Кстати, интересное следствие того что большая часть кода на C++ — очень много методов и классов избежали обработки с помощью ProGuard. Сложновато делать интероп с минифицированным кодом ;).

Вот что я увидел в окне студии (разбирал x86 версию, чтобы работать с эмулятором а не реальным девайсом)


Как можно видеть на скриншоте выше — минификации приложение почти не подвергалось (в плане переименования классов и методов). Плюс видно что кода на java очень немного и почти все место занимают so библиотеки.

Повтыкав какое-то время на список классов, я увидел любопытный класс MapImpl, навевающий подозрения что именно он виновник такой грустной ситуации с кастомизацией отображения меток.


Список методов и их сигнатуры внушали надежду что все будет очень просто, и я решил заглянуть в smali код, после чего сильно напрягся и пошел читать список команд smali, и как его читать/писать. Впрочем, именно на этом моменте я решил что дело обещает быть несложным и недолгим, а соответственно вот он, повод поиграться с реверсингом. Приняв для себя решение посвятить этому пару вечеров (как же жестоко я ошибался), пошел со спокойной душой спать ложиться.

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

  1. Подготовить конфигурацию 1с для мобильной платформы вся функциональность которой заключается в отображении двух меток на карте.
  2. Распаковать apk мобильной платформы, запаковать без изменений, убедиться в работоспособности конфигурации.
  3. Внести небольшие изменения в smali файлы, не меняющие практически ничего, но которые можно было бы увидеть в логах или изменении логики работы, собрать и убедиться что это работает.
  4. Перегнать smali активности с картой в java, либо же написать активность с таким же интерфейсом, подменить активность в приложении без изменения функциональности. Как альтернативный вариант, если с первым разбираться будет лень или сложновато — написать класс, который будет выполнять часть работы за MapImpl и добавить вызов его методов из smali MapImpl.
  5. Написать эту статью (давно уже хотелось что-то написать, но другие идеи пока еще варятся в голове, а тут показалось что это наконец довольно достойная тема)

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

А вот со вторым пунктом из-за моей неграмотности вышло грустнее. Да что уж там, проблемы были со всеми пунктами кроме первого.

Гугл мне сразу подсказал что есть такой отличный инструмент apktool позволяющий буквально двумя командами разбирать apk до .smali файлов, а так же собирать из них обратно. Им я и решил воспользоваться. Распаковал apk следующей командой (здесь и далее, несмотря на то что временами часть работы делал на linux, все команды буду приводить для windows):

и получил каталог unpacked в котором лежала куча файлов, с ними в будущем предстояло работать. Запаковал apk обратно командой

Попытавшись установить его на эмулятор

я получил следующую ошибку:

В общем нужно было больше внимания базе уделять. Я конечно знал что существуют подписи, и о том что они делятся на дебажные и релизные, но не знал что приложения вообще без подписей не устанавливаются. Я решил воспользоваться своей дебажной подписью, и подписав apk командой

мне удалось запустить приложение. Правда вместо карты с двумя точками меня ждал серый экран с подписью google внизу. Почесав репу я решил что дело в том что используется ключ для гугл карт от 1с, который с моей подписью не работает. Поэтому пойдя в консоль разработчика на сайте google я создал новый проект для работы с api google карт на андроиде, получил api key, который указал в res/values/strings.xml в google_maps_key строке, а так же добавил свой дебажный ключ в разрешенные для проекта. Перепаковал и переподписал apk, запустил, и наконец все снова работало.

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

Сначала я нагуглил и попытался воспользоваться утилитами jadx или dex2jar, чтобы не мучиться с чтением smali, а читать более привычный код на java, но по какой-то причине они не работали (в дальнейшем jadx все таки завести удалось каким то шаманством). Пришлось разбирать smali, благо это оказалось не так ужасно как я боялся.

Чтобы понять, как мобильная платформа получает от десктопной платформы команду на запуск конфигурации при подключении по adb, я решил посмотреть точки входа в приложение и добавить вывод в логи интентов и прочей полезной информации. Начать решил с application ( com.e1c.mobile.E1cApplication ) и активности имеющей android.intent.action.MAIN в intent-filter ( com.e1c.mobile.App ). Также меня заинтересовал reciever com.e1c.mobile.Starter с интересным intent filter на com.e1c.mobile.START_TEMPLATE и com.e1c.mobile.START_CMD . Уж очень похоже на то что он принимает интенты с командами 1с, и именно он стартует конфигурацию из шаблона.

В E1cApplication ничего интересного к сожалению обнаружить не удалось, все что там происходит — установка своего хендлера на крэши.

А вот в двух других классах, Starter и App информации было гораздо больше и оказалась она довольно полезной. Метод App.onCreate(Landroid/os/Bundle;)V довольно большой, так что приводить его целиком не буду, приведу только заинтересовавшие меня части.

Из приведенного выше участка кода видно что приложение получает интент, кладет ссылку на него в регистр p1 , через StringBuilder дописывает к имени класса и метода и передает в статический метод V(Ljava/lang/String;)V класса Utils . Видимо какой-то свой логгер. После чего интент проверяется на наличие дополнительных данных, и, при наличии, из него получается Uri , из которого в свою очередь получается строка методом getQuery() и передается классу Starter . Дальше изучать onCreate смысла не видел, пробежался взглядом и убедился что действия довольно стандартные. Разве что вью вроде бы создается программно абсолютно другим классом, вместо использования LayoutInflater , но сильно глубоко я не копал, так что возможно все и не так как я подумал. Следующий класс куда я пошел — Starter . Благо он и в активити упоминался и в манифесте меня заинтересовал.

К сожалению тот метод что вызывался из активити, оказался нативным ( .method static native startCmd(Ljava/lang/String;)V ), потому обратил внимание на метод onRecieve (в котором приложение принимает интенты на которые подписано). Приводить код не буду, меня в нем заинтересовало что интент так же логигуется методом V(Ljava/lang/String;)V класса Utils . Получается что достаточно дописать немного smali кода в этот метод — и я получу свои логи, причем на тех же местах где их задумывали разработчики платформы. Перейдя в класс Utils я увидел сразу 2 пустых метода, V и W. Видимо пустые они потому как при компиляции релизной версии вырезались. Я просто дописал в них запись переданной строки в стандартный android.utils.Log . Для этого сменил количество требуемых локальных регистров с 0 до 1 (для строки тега), поместил эту самую строку в регистр v0 , а также прописал вызов методов Log

Запустил из 1с десктопной 1с мобильную и получил следующие логи

Как видим — есть вся необходимая информация для автоматизации запуска приложения через adb. Правда к этому моменту я словил двойной фейспалм. Во-первых, наконец подобрал ключи с которыми jadx осилил перевод в java (понятно что писать все равно в smali бы пришлось, но все же). А вторым фейспалмом оказалось то что я осознал что зря я мучаю платформу разработчика (нужна только для разработки и отладки конфигураций), правильнее было бы реверсить сборку релизов 1сных приложений, причем там есть полу готовые gradle проекты для сборки, есть файл с перечнем зависимостей и другие плюшки. Я немного по этому поводу погрустил — и решил все таки закончить с тем что начал. Все равно ради фана делаю все это, а не ради практической пользы.

Автоматизировать установку и запуск через adb приложения я решил с помощью gradle. Все равно к тому моменту у меня уже был написан небольшой перечень тасок (распаковка, копирование модифицированных ресурсов и smali файлов в каталог с распакованным приложением, упаковка, подпись, по сути все таски просто раннеры для команд консольных). К существующим таскам добавил выполняющие следующие команды

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

Тут у меня было несколько вариантов дальнейшего развития событий.

  1. Правлю напрямую MapImpl.smali, что обещало быть довольно сложным занятиям учитывая что библиотека для работы с гугл-картами довольно серьезно минифицирована, да еще и в синтаксисе smali все писать пришлось бы.
  2. Использую полученный благодаря jadx файл MapImpl.java, вношу правки в него, используемые в нем классы подменяю на заглушки, перегоняю в smali, подменяю файл, упаковываю. Вариант показался мне напряжным так как уж больно много заглушек пришлось бы городить, к тому же с некоторыми из них были проблемы с которыми у меня не было желания ковыряться.
  3. Комбинирую подходы 1 и 2, вставляю в smali код вызовы специального класса расширения MapImplExtenstion.java который расширяет часть логики — в итоге выбрал этот вариант, просто потому что он проще первого и второго вариантов, и показался мне пусть возможно чуть более сложным чем вариант 4, но зато менее трудоемким (угу, мечтай, наивный).
  4. Вообще заменить гугл карты на что-то другое, например яндекс. Сделать всю работу в другом проекте, просто повторив сигнатуры MapImpl, затем минифицировать распаковать, и просто закинуть готовые smali файлы перед упаковкой приложения на соответствующие места. Никаких проблем с минифицированными библиотеками, но пришлось бы регистрироваться для получения ключа для карт, создавать отдельный проект, заморачиваться со стыковкой ресурсов и прочее.
  5. То же что вариант 4, но заменить гугл на… Гугл. Но тут у меня были подозрения что удастся минифицировать 1 в 1 maps sdk, а ставить эксперименты не было желания.
Поля Xj:Ljava/util/ArrayList и Xk:Ljava/util/ArrayList

Используя jadx для декомпиляции в java нашел в декомпилированном коде метод отвечающий за их заполнение

Соответственно у класса MapImplExtension добавил метод ArrayList[] kN(String[] titles, double[] coordinates) который в первом элементе массива вернет список который нужно будет поместить в Xj, а во втором список для Xk.

Скомпилировал следующими командами сначала в class, затем в dex, затем декомпилировал в smali чтобы потом упаковать вместе с остальными файлами

Добавил в MapImpl.smali поле extension типа нашего нового класса, и добавил его инициализацию

А также заменил обработку в классе MapImpl данных от 1с на обработку в классе MapImplExtension

Запаковав и запустив приложение — я радостно увидел что все работает. Но на данный момент я не сделал ничего такого что именно расширило бы возможности мобильной платформы. Просто подменил заголовки у меток на карте. А вот захотев изменить изображения меток я здорово обломался и зарылся довольно надолго в исходники и документацию.

Сначала немного пояснений как вообще устанавливается маркер для метки. У класса MarkerOptions есть метод public MarkerOptions icon (BitmapDescriptor iconDescriptor) в который передается объект созданный одним из статических методов класса BitmapDescriptorFactory .

И вот здесь собственно меня ждал облом. Поскольку 1с это дело не использует — соответствующие классы были просто вырезаны при минификации. Пришлось их восстанавливать, и было это больно и долго. Точнее классы то были, но были переименованы и не содержали нужных методов. Путем ковыряния в сорцах полной библиотеки для работы с картами — по сигнатурам и константам выяснил соответствия классов библиотеки классам приложения, добавил необходимые методы и поля, пересобрал, и порадовался что этот квест наконец закончил, поскольку все наконец то заработало, пусть и не с первой попытки (несколько раз косячил с сигнатурами и путал минифицированные классы).

Результат (внешне не сильно впечатляющий). Выбраны методом тыка две точки с координатами (45;45) и (46;46)


Поскольку объем измененного кода довольно большой — включать в статью его не буду, приведу только изменения сигнатур. Если кому интересны все правки которые я сделал на этом шаге — можете посмотреть в этом коммите.

Подводя итоги — опыт был довольно интересный. По крайней мере для меня. Помог разобраться с некоторыми инструментами, узнал немного лучше о работе андроида и формате байткода для dalvik/art, опыт ковыряния минифицированного кода тоже будет полезен (уже был случай когда в релизной версии R8 вырезал поля класса которые на самом деле использовались, в тот раз только методом тыка разобрался, сейчас бы это проблем не доставило).

Если кому-то интересно самому все повторить и возможно расковырять еще больше — я выложил на github все исходники вместе с кривым gradle скриптом осуществляющим сборку из исходного apk модифицированного.



Взявшись за непонятную задачу с почти полным отсутствием примеров можно убить ни один вечер, так ничего не добившись. Особенно когда речь заходит о труднособираемой и еще более трудноотлаживаемой внешней компоненте для мобильной платформы 1С. Кропотливые поиски все же обязательно приведут к успеху и выдадут на-гора пару ценных ссылок:

Собственно эти ссылки, а особенно вторая (спасибо Игорю Кисилю) послужила источником вдохновения и отправной точкой для настоящей компоненты.

1. Что из интересного в архиве компоненты:

  • Собранный zip с макетом компоненты с примерами вызова обычного метода, а также методы вызова внешнего события через Broadcast (может быть полезно для написания драйверов торгового оборудования);
  • Демо конфигурация.

2. API Компоненты

Delay/Пауза - останавливает выполнение кода на заданное число миллисекунд. Процессор в период простоя не грузится

  • миллисекунд - Число - число миллисекунд на которое нужно остановить выполнение кода.

StartScreenWatch/НачатьОтслеживаниеЭкрана - начинает мониторинг состояния активности экрана устройства. Параметры отсутствуют. Если устройство возвращают из спящего режима блокировки, то вызывается внешнее события со следующими параметрами:

  • Источник - org.ripreal.androidutils
  • Событие - LockChanged

StopScreenWatch/ОстановитьОтслеживаниеЭкрана - прекращает мониторинг активности экрана устройства. Параметры отсутствуют.

DeviceInfo/ОписаниеУстройства (только чтение) - ID мобильного устройства

3. Как бонус на github:

  • sln проект для VS Studio 2019 и .idea проект (в каталоге android) для Android Studio 3.5
  • Проект .idea настроен на отладку c++ кода компоненты. Инструкция есть в Readme.MD

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Честно говоря из статьи сложно понять природу вещи.
Чувствуется, что вещь нужная, но. Куча вопросов остается:
Это компонента для общения 1с с андройд?
Если да, то только три метода? (2) Не ставил цель охватить в этой статье весь жизненный цикл разработки внешней компоненты для мобильного приложения. Я лишь хотел поделится исходниками компоненты, которые можно легко открыть иотлаживать через Visual Studio и Android Studio а также использовать как начальный шаблон для разработки своей компоненты. Однозначно нужная статья! А то у меня все никак руки не дойдут до продолжения цикла видео на эту тему. В описании совершенно не раскрыта задача, которую ставил перед собой автор (если это конечно не написание мобильной внешней компоненты ради мобильной внешней компоненты). (4) С целью угадали. Я просто хотел выложить исходники компоненты, на базе которых легко начать разрабатывать свою компоненту. (6) так на ИТС же есть проект. Вопрос как начать его использовать, а не как его допиливать. (7) На ИТС есть sln проект только для десктопной версии компоненты. Для мобильной компоненты проекта нет. Есть только исходники и bat-ник для сборки через cmake, который "завести" лично мне не удалось. Спасибо за исходник. Возник такой вопрос, а как в третьем примере передать данные в обработку внешних событий 1С?
У вас, там стоит nullptr.
Я пытаюсь разобраться на примерах, что бы попробовать свои силы в написании таких компонент.

Этот кусок кода должен помочь:


.
std::wstring dataWString = Utils::jstring2wstring(jenv, jdata);
.

Спасибо, я вроде в этом направлении и двигался. С преобразованием в строку сильно помогли.
Теперь глупый вопрос: Utils - это что?

(11) Это отдельный метод

(12) Я понял про метод. Вопрос немного в другом. В текущем классе (MainApp) есть этот метод и он объявлен в private. Попытка вызвать его предложенным вами способом

приводит к ошибкам:

Ошибка (активно) E0245 нестатическая ссылка не член должна указываться относительно заданного объекта androidUtils
Ошибка (активно) E0265 функцию "MainApp::jstring2wstring" (объявлено в строке 122) недоступно androidUtils

Подскажите, пожалуйста, что не так?

(13)
Это ошибка в синтаксисе из-за незнания C++. Нужно почитать хотя бы пару туториалов. Все равно ведь придется, а без этого компоненту, которая хотя бы что-то умеет кроме слипа не собрать.

(14) Я нашел решение. Закинул объявление метода в public и сделал следующий вызов:

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

а не проще ли написать сразу нативное приложение? общение с 1С посредством xml (этим я и занимаюсь) не заводится, хочу уточнить у автора и более опытных коллег, может кто-то подскажет, что я делаю не так. Для начала я решил не компилировать проект, а взять уже готовый билд (конфу и апп).
1. установил учебную версию 1с мобильная платформа 8.3.16 http://online.1c.ru/catalog/free/28765768/ (платформа 16й версии там, а мобильные приложения - 8.15)
2. в 1С открыл предложенную автором конфигурацию, загрузил в ОбщиеМакеты.Компонента zip-архив androidUtils.zip (там org_ripreal_androidutils-debug.apk, 2 манифеста и нативная so-либа под arm и x86 )
3. установил на смартфон (Андройд 10) приложения 1cem-arm.apk
4. опубликовал приложение 1С через Конфигурация-Мобильное приложение-Публиковать
5. в указанном каталоге (доступном так же через веб-сервер по адресу http://192.168.2.211/1с) появились файлы 1Cv8.1CM, 1cema.xml и папка Android с apk и so для двух архитектур
6. на мобильном приложении запустил 1С
7. создал новое приложение прописав путь http://192.168.2.211/1с
8. при попытке загрузить конфигурацию возникает ошибка "Ошибка разбора В итоге я разобрался и смог загрузить приложение на мобильную платформу и даже отладку на него запустить в конфигурации. Но опять же, как ни колдовал с вот этими двумя вещами
a. увидел, что синхронная инициализация внешних компонент запрещена (в вашей конфигурации), изменил «Режим использования синхронных вызовов расширений платформы и внешних компонент» на «Использовать» в конфигураторе.
b. Поиграл с ограничением совместимости (последовательно ставил 8.3.13, 14, 15, Не использовать)
так и не смогу загрузить компоненту. Всё время ошибка "невозможно загрузить компоненту". в отладке всё падает на команде
Как ни проверял, внешняя компонента не подключается. Проверил доступы в apache - все файлы и директории доступны по прямым ссылкам.

(20)
Мобильные внешние компоненты не работают в декстопе и «Режим использования синхронных вызовов расширений платформы и внешних компонент» никак на это не влияет. Кроме этого до версии 8.3.15, включая не работают 64 битные версии - это платформенная ошибка. И кроме того во многих сборка платформы есть ошибка при которой при отладке через конфигуратор компоненты просто не копируются на телефон и таким образом не запускаются.

Самый надежный способ убедится в работоспособности - это собрать конфигурацию через сборщик 1С и запустить на телефоне с 32 битной ОС.
(20)

сейчас я собрал без сборщика в конфигурации 8.3.16 (до этого всё время и в 8.3.15) и по логам апача проверил - файлы .so и .apk не копируются. была ошибочка в manifest.xml и надо было вместо

После этого приложение загружается и по логам апача файлы .so и .apk загружаются. Тем не менее всё так же на строке

формируется ложь и компонента не инициализируется.

Попробую по вашей рекомендации собрать через сборщик.

победил без сборщика. необходимо было использовать 1cem-arm.apk а не 64-х битную версию этого apk. версия мобильной платформы 8.3.16.142. Именно ваш последний комментарий и навёл на мысль о замене 64х битной версии на 32х. Спасибо (26)Здравствуйте. Вы можете по шагам описать как вы заставили работать внешние компоненты в мобильном клиенте без сборки мобильного приложения. (27) Добрый день. Если честно, часть вещей просто забыл, а виртуальную машину уже удалил. Тем не менее, что я точно помню, это 2 проблемы:
1. Была проблема с тем, что на сервере создавались директории, но туда не попадали файлы приложения. Лечил удалением всех автоматически созданных директорий у apache и повторным деплоем приложения.
2. Была проблема, что я установил на телефон неверную версию мобильной платформы (1cem-. apk). После удаления и установки корректной версии, а так же поправки манифеста получил работающую компоненту.
Если напишите, на каком шаге и что именно не получается, постараюсь вспомнить свой опыт и подсказать. (29) К сожалению, ваш путь отличается от моего прежде всего использованием IIS. Насколько я понял, этот сервер не рекомендуется для использования, нужно установить apache 2 и на него уже публиковать. Ну если оттуда всё скачивается, то это уже плюс.
Далее, насколько понимаю, мобильный клиент и мобильная платформа - это разные вещи. очень. Именно мобильная платформа требует компиляции вашей компоненты и/или приложения и повторной установки (если она нужна, допустим обновление) из каталога публикации. Обойти это я не пытался, да мне и не требовалось. (30)Мне в настоящий момент не ясно что меняется с компиляцией приложения в APK, ведь сами компоненты при этом не меняются. К сожалению нигде не могу найти подробную информацию как это все работает. Уверен что все можно решить проще, главное знать что с чем взаимодействует.

Давайте разберёмся в теминологии.
1. Есть приложение "мобильная платформа" которое уже собрано и предоставлено всем в виде 1cem-*.apk файлов
2. Есть ваше собственное приложение, написанное (разработанное) под мобильную платформу с помощью конфигуратора 1С
3. Есть нативная компонента, которая позволяет вашему приложению из пункта 2, запускаясь в приложении из пункта 1 осуществлять работу (вызовы) каких-то нативных возможностей устройства, на котором запущено (или вызывать другие приложения, или какой-то low-level code, или работа с датчиками/сенсорами и другими частями устройства которые 1С само по себе не видит (для которых не написаны вызовы разработчиками 1С).

Так вот нативную компоненту из п.3 вам надо писать на языке той платформы, на которой её будете запускать (Android - Java, iOS - ObjectiveC). После того, как вы напишите Java/ObjC код, вам его надо компилировать и добавлять в приложение из п.2 как внешний компонент, в виде zip-архива. В этом архиве будет манифест и нативная компонента скомпилированная в apk для Android или в ipa для iOS.

(32)Вы подробно и точно все расписали, но все же имеются некоторые вопросы. Если мы рассматриваем вариант работы к примеру в виде обычного клиента, то все внешние компоненты выполнены в виде библиотек dll, их в принципе не требуется даже регистрировать в windows чтобы подключить, все работает нативно. Мы выполняем команду "ПодключитьВнешнююКомпоненту" и далее уже с ней работаем без проблем. В теории в мобильном клиенте все то же самое, то есть для работы с внешней компонентой мы так же используем команду "ПодключитьВнешнуююКомпоненту". Если исходить из того. что идет в поставке БПО, то в качестве внешней компоненты используются файлы so, которые являются кроссплатформенными библиотеками. Значит чтобы ее задействовать нам необходимо разместить соответствующую версию (исходя из разрядности среды запуска) компоненты в макет с типом двоичных данных и далее подключать по аналогии с десктопным вариантом. Но это в теории, на практике они не подключаются. Кроме того в поставке БПО идут еще и apk файлы.. драйверов? То есть сначала нужно установить программу из apk в качестве драйверов, и только затем в конфигурации подключать внешнюю компоненту в виде so?

По сути всё это матрёшка:
1. 1cem-*.apk - самая большая матрёшка, в которой реализованы за вас уже все вызовы по рисованию форм, кнопок, загрузке данных и т.п.
2. ваше приложение - вторая матрёшка, поменьше. в ней вы реализуете уже конкретно вашу форму, пишите названия кнопок и где их отображать (вверху или внизу экрана и тп.)
3. внешняя компонента - самая маленькая матрёшка, которая будет частью вашего приложения, если вашему приложению не хватает того функционала, который дал вам как разработчику конструктор форм и кнопок из 1cem-*.apk и вы, допустим, хотите использовать возможности лидара или какого-то акселерометра, которые есть как датчики на смартфоне, но 1С (бяки такие) не дали вам метод типа ВключитьЛидар.ПолучитьСцену из "коробки", т.е. из 1й матрёшки

Кроме того в поставке БПО идут еще и apk файлы.. драйверов? То есть сначала нужно установить программу из apk в качестве драйверов, и только затем в конфигурации подключать внешнюю компоненту в виде so? Надеюсь, за счёт объяснения выше стало ясно, что хоть ваше рассуждение некорректно в деталях, в последовательности действий оно верно - сначала ставим 1cem-*.apk на телефон, далее пишите свое приложение под мобильную платформу, пакуете в него нужную вам компоненту и вперед, к звёздам.



Взявшись за непонятную задачу с почти полным отсутствием примеров можно убить ни один вечер, так ничего не добившись. Особенно когда речь заходит о труднособираемой и еще более трудноотлаживаемой внешней компоненте для мобильной платформы 1С. Кропотливые поиски все же обязательно приведут к успеху и выдадут на-гора пару ценных ссылок:

Собственно эти ссылки, а особенно вторая (спасибо Игорю Кисилю) послужила источником вдохновения и отправной точкой для настоящей компоненты.

1. Что из интересного в архиве компоненты:

  • Собранный zip с макетом компоненты с примерами вызова обычного метода, а также методы вызова внешнего события через Broadcast (может быть полезно для написания драйверов торгового оборудования);
  • Демо конфигурация.

2. API Компоненты

Delay/Пауза - останавливает выполнение кода на заданное число миллисекунд. Процессор в период простоя не грузится

  • миллисекунд - Число - число миллисекунд на которое нужно остановить выполнение кода.

StartScreenWatch/НачатьОтслеживаниеЭкрана - начинает мониторинг состояния активности экрана устройства. Параметры отсутствуют. Если устройство возвращают из спящего режима блокировки, то вызывается внешнее события со следующими параметрами:

  • Источник - org.ripreal.androidutils
  • Событие - LockChanged

StopScreenWatch/ОстановитьОтслеживаниеЭкрана - прекращает мониторинг активности экрана устройства. Параметры отсутствуют.

DeviceInfo/ОписаниеУстройства (только чтение) - ID мобильного устройства

3. Как бонус на github:

  • sln проект для VS Studio 2019 и .idea проект (в каталоге android) для Android Studio 3.5
  • Проект .idea настроен на отладку c++ кода компоненты. Инструкция есть в Readme.MD

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Честно говоря из статьи сложно понять природу вещи.
Чувствуется, что вещь нужная, но. Куча вопросов остается:
Это компонента для общения 1с с андройд?
Если да, то только три метода? (2) Не ставил цель охватить в этой статье весь жизненный цикл разработки внешней компоненты для мобильного приложения. Я лишь хотел поделится исходниками компоненты, которые можно легко открыть иотлаживать через Visual Studio и Android Studio а также использовать как начальный шаблон для разработки своей компоненты. Однозначно нужная статья! А то у меня все никак руки не дойдут до продолжения цикла видео на эту тему. В описании совершенно не раскрыта задача, которую ставил перед собой автор (если это конечно не написание мобильной внешней компоненты ради мобильной внешней компоненты). (4) С целью угадали. Я просто хотел выложить исходники компоненты, на базе которых легко начать разрабатывать свою компоненту. (6) так на ИТС же есть проект. Вопрос как начать его использовать, а не как его допиливать. (7) На ИТС есть sln проект только для десктопной версии компоненты. Для мобильной компоненты проекта нет. Есть только исходники и bat-ник для сборки через cmake, который "завести" лично мне не удалось. Спасибо за исходник. Возник такой вопрос, а как в третьем примере передать данные в обработку внешних событий 1С?
У вас, там стоит nullptr.
Я пытаюсь разобраться на примерах, что бы попробовать свои силы в написании таких компонент.

Этот кусок кода должен помочь:


.
std::wstring dataWString = Utils::jstring2wstring(jenv, jdata);
.

Спасибо, я вроде в этом направлении и двигался. С преобразованием в строку сильно помогли.
Теперь глупый вопрос: Utils - это что?

(11) Это отдельный метод

(12) Я понял про метод. Вопрос немного в другом. В текущем классе (MainApp) есть этот метод и он объявлен в private. Попытка вызвать его предложенным вами способом

приводит к ошибкам:

Ошибка (активно) E0245 нестатическая ссылка не член должна указываться относительно заданного объекта androidUtils
Ошибка (активно) E0265 функцию "MainApp::jstring2wstring" (объявлено в строке 122) недоступно androidUtils

Подскажите, пожалуйста, что не так?

(13)
Это ошибка в синтаксисе из-за незнания C++. Нужно почитать хотя бы пару туториалов. Все равно ведь придется, а без этого компоненту, которая хотя бы что-то умеет кроме слипа не собрать.

(14) Я нашел решение. Закинул объявление метода в public и сделал следующий вызов:

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

а не проще ли написать сразу нативное приложение? общение с 1С посредством xml (этим я и занимаюсь) не заводится, хочу уточнить у автора и более опытных коллег, может кто-то подскажет, что я делаю не так. Для начала я решил не компилировать проект, а взять уже готовый билд (конфу и апп).
1. установил учебную версию 1с мобильная платформа 8.3.16 http://online.1c.ru/catalog/free/28765768/ (платформа 16й версии там, а мобильные приложения - 8.15)
2. в 1С открыл предложенную автором конфигурацию, загрузил в ОбщиеМакеты.Компонента zip-архив androidUtils.zip (там org_ripreal_androidutils-debug.apk, 2 манифеста и нативная so-либа под arm и x86 )
3. установил на смартфон (Андройд 10) приложения 1cem-arm.apk
4. опубликовал приложение 1С через Конфигурация-Мобильное приложение-Публиковать
5. в указанном каталоге (доступном так же через веб-сервер по адресу http://192.168.2.211/1с) появились файлы 1Cv8.1CM, 1cema.xml и папка Android с apk и so для двух архитектур
6. на мобильном приложении запустил 1С
7. создал новое приложение прописав путь http://192.168.2.211/1с
8. при попытке загрузить конфигурацию возникает ошибка "Ошибка разбора В итоге я разобрался и смог загрузить приложение на мобильную платформу и даже отладку на него запустить в конфигурации. Но опять же, как ни колдовал с вот этими двумя вещами
a. увидел, что синхронная инициализация внешних компонент запрещена (в вашей конфигурации), изменил «Режим использования синхронных вызовов расширений платформы и внешних компонент» на «Использовать» в конфигураторе.
b. Поиграл с ограничением совместимости (последовательно ставил 8.3.13, 14, 15, Не использовать)
так и не смогу загрузить компоненту. Всё время ошибка "невозможно загрузить компоненту". в отладке всё падает на команде
Как ни проверял, внешняя компонента не подключается. Проверил доступы в apache - все файлы и директории доступны по прямым ссылкам.

(20)
Мобильные внешние компоненты не работают в декстопе и «Режим использования синхронных вызовов расширений платформы и внешних компонент» никак на это не влияет. Кроме этого до версии 8.3.15, включая не работают 64 битные версии - это платформенная ошибка. И кроме того во многих сборка платформы есть ошибка при которой при отладке через конфигуратор компоненты просто не копируются на телефон и таким образом не запускаются.

Самый надежный способ убедится в работоспособности - это собрать конфигурацию через сборщик 1С и запустить на телефоне с 32 битной ОС.
(20)

сейчас я собрал без сборщика в конфигурации 8.3.16 (до этого всё время и в 8.3.15) и по логам апача проверил - файлы .so и .apk не копируются. была ошибочка в manifest.xml и надо было вместо

После этого приложение загружается и по логам апача файлы .so и .apk загружаются. Тем не менее всё так же на строке

формируется ложь и компонента не инициализируется.

Попробую по вашей рекомендации собрать через сборщик.

победил без сборщика. необходимо было использовать 1cem-arm.apk а не 64-х битную версию этого apk. версия мобильной платформы 8.3.16.142. Именно ваш последний комментарий и навёл на мысль о замене 64х битной версии на 32х. Спасибо (26)Здравствуйте. Вы можете по шагам описать как вы заставили работать внешние компоненты в мобильном клиенте без сборки мобильного приложения. (27) Добрый день. Если честно, часть вещей просто забыл, а виртуальную машину уже удалил. Тем не менее, что я точно помню, это 2 проблемы:
1. Была проблема с тем, что на сервере создавались директории, но туда не попадали файлы приложения. Лечил удалением всех автоматически созданных директорий у apache и повторным деплоем приложения.
2. Была проблема, что я установил на телефон неверную версию мобильной платформы (1cem-. apk). После удаления и установки корректной версии, а так же поправки манифеста получил работающую компоненту.
Если напишите, на каком шаге и что именно не получается, постараюсь вспомнить свой опыт и подсказать. (29) К сожалению, ваш путь отличается от моего прежде всего использованием IIS. Насколько я понял, этот сервер не рекомендуется для использования, нужно установить apache 2 и на него уже публиковать. Ну если оттуда всё скачивается, то это уже плюс.
Далее, насколько понимаю, мобильный клиент и мобильная платформа - это разные вещи. очень. Именно мобильная платформа требует компиляции вашей компоненты и/или приложения и повторной установки (если она нужна, допустим обновление) из каталога публикации. Обойти это я не пытался, да мне и не требовалось. (30)Мне в настоящий момент не ясно что меняется с компиляцией приложения в APK, ведь сами компоненты при этом не меняются. К сожалению нигде не могу найти подробную информацию как это все работает. Уверен что все можно решить проще, главное знать что с чем взаимодействует.

Давайте разберёмся в теминологии.
1. Есть приложение "мобильная платформа" которое уже собрано и предоставлено всем в виде 1cem-*.apk файлов
2. Есть ваше собственное приложение, написанное (разработанное) под мобильную платформу с помощью конфигуратора 1С
3. Есть нативная компонента, которая позволяет вашему приложению из пункта 2, запускаясь в приложении из пункта 1 осуществлять работу (вызовы) каких-то нативных возможностей устройства, на котором запущено (или вызывать другие приложения, или какой-то low-level code, или работа с датчиками/сенсорами и другими частями устройства которые 1С само по себе не видит (для которых не написаны вызовы разработчиками 1С).

Так вот нативную компоненту из п.3 вам надо писать на языке той платформы, на которой её будете запускать (Android - Java, iOS - ObjectiveC). После того, как вы напишите Java/ObjC код, вам его надо компилировать и добавлять в приложение из п.2 как внешний компонент, в виде zip-архива. В этом архиве будет манифест и нативная компонента скомпилированная в apk для Android или в ipa для iOS.

(32)Вы подробно и точно все расписали, но все же имеются некоторые вопросы. Если мы рассматриваем вариант работы к примеру в виде обычного клиента, то все внешние компоненты выполнены в виде библиотек dll, их в принципе не требуется даже регистрировать в windows чтобы подключить, все работает нативно. Мы выполняем команду "ПодключитьВнешнююКомпоненту" и далее уже с ней работаем без проблем. В теории в мобильном клиенте все то же самое, то есть для работы с внешней компонентой мы так же используем команду "ПодключитьВнешнуююКомпоненту". Если исходить из того. что идет в поставке БПО, то в качестве внешней компоненты используются файлы so, которые являются кроссплатформенными библиотеками. Значит чтобы ее задействовать нам необходимо разместить соответствующую версию (исходя из разрядности среды запуска) компоненты в макет с типом двоичных данных и далее подключать по аналогии с десктопным вариантом. Но это в теории, на практике они не подключаются. Кроме того в поставке БПО идут еще и apk файлы.. драйверов? То есть сначала нужно установить программу из apk в качестве драйверов, и только затем в конфигурации подключать внешнюю компоненту в виде so?

По сути всё это матрёшка:
1. 1cem-*.apk - самая большая матрёшка, в которой реализованы за вас уже все вызовы по рисованию форм, кнопок, загрузке данных и т.п.
2. ваше приложение - вторая матрёшка, поменьше. в ней вы реализуете уже конкретно вашу форму, пишите названия кнопок и где их отображать (вверху или внизу экрана и тп.)
3. внешняя компонента - самая маленькая матрёшка, которая будет частью вашего приложения, если вашему приложению не хватает того функционала, который дал вам как разработчику конструктор форм и кнопок из 1cem-*.apk и вы, допустим, хотите использовать возможности лидара или какого-то акселерометра, которые есть как датчики на смартфоне, но 1С (бяки такие) не дали вам метод типа ВключитьЛидар.ПолучитьСцену из "коробки", т.е. из 1й матрёшки

Кроме того в поставке БПО идут еще и apk файлы.. драйверов? То есть сначала нужно установить программу из apk в качестве драйверов, и только затем в конфигурации подключать внешнюю компоненту в виде so? Надеюсь, за счёт объяснения выше стало ясно, что хоть ваше рассуждение некорректно в деталях, в последовательности действий оно верно - сначала ставим 1cem-*.apk на телефон, далее пишите свое приложение под мобильную платформу, пакуете в него нужную вам компоненту и вперед, к звёздам.

Читайте также: