Вылетает мобильное приложение 1с

Обновлено: 07.07.2024

📝 Столкнулись с ситуацией, когда в тихом режиме, сама по себе, закрывается программа 1С. Файловая база, ПК на «боевом» железе с набором обновлений, пусть и на Windows 7. По времени 10-15 минут, а потом самозакрытие. Без ошибок и уведомлений. Раз, и закрылась.

🚩 Приступили к расследованию. Возможно, не с той стороны, но главное — начали.

Первая гипотеза сводилась к сбросу кэша, проверке базы на платформе другой разрядности (x86/x64), а также переустановке версии. Не помогло. Протестировали запуск в тонком и толстом клиентах. Та же ошибка.

🚩 Следующая партия гипотез касалась настроек операционной системы. Проверили следующее: удаление антивируса, отключение Защитника Windows, замена драйверов видеоадаптера, переключение на стандартный драйвер VGA.

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

Без результата. Платформа как падала, так и продолжала.

🚩 Быстро ситуация не разрешалась. Подключили «тяжёлую артиллерию»: разбор дампов программы и включение технологического журнала.

Разбор ошибок показал, что «сыплются» ошибки доступа к файлам базы, кэша и сетевых подключений к портам.

Через поиск в Интернете вышли на проверку имени компьютера.

Изменили наименование по рекомендациям, перезагрузили и, чудо, программа заработала. «Здравствуй, опыт, сын ошибок трудных».

🎯 Если у вас 1С ведет схожим образом и «вылетает» через

10 минут, рекомендуем:

  • переименуйте ПК (новое имя на латинице, без спецсимволов, не более 8 букв);
  • проверьте путь к информационной базе (короткий, без пробелов, чтобы содержал только латинские символы).

✅ После этих изменений вылеты прекратятся. Как минимум, надеемся, что будет вам счастье. Наш клиент — 100% обрадовался. И кажется, новому имени ПК больше всех. 1С радует по умолчанию, как всегда.

⚡ Подписывайтесь на канал или задавайте вопрос на сайте — постараемся помочь всеми техническими силами. Безопасной и производительной работы в Windows и 1С.

Наконец у меня дошли руки до разбора нового функционала по мобильной платформе.

В частности, как вы поняли из заголовка статьи – речь пойдет о таком новом объекте, как ЗапускПриложенияМобильногоУстройства .

К сожалению, я не смогу в статье поделиться абсолютно всеми вещами, и добиться понимания читателем всей информации, так как тут будет слишком много специфики по Андроиду .

Но в любом случае попробую донести основную идею.

В двух словах – этот объект позволяет вызвать другое приложение из андроида , и получить ответ от него.

Например, вы можете открыть почту и передать в нее все нужные данные.

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

Для этого необходимо установить на телефон программу Далее – создаем кнопку в 1С с вот такой функцией:

Обновляем конфигурацию и нажимаем кнопку. У меня отображается вот такое окно:


Выбираем Сканер штрих-кодов и сканируем что-то, и видим ответ:


В ответ мы получили результат работы, тот что «-1», и получили результаты сканирования, а именно – штрих-код и тип штрих-кода .

Ну как? Интересно? Если да, то давайте будем копать глубже.

Тут нам однозначно поможет справка 1С, или не поможет?

ЗапускПриложенияМобильногоУстройства ( MobileDeviceApplicationRun )

Свойства:

Данные ( Data )
Действие ( Action )
ДополнительныеДанные ( AdditionalData )
ИмяКласса ( ClassName )
Категория ( Category )
Приложение ( Package )
Тип ( Type )

Методы:

Описание:

Предназначен для запуска внешних приложений.
В отличие от метода ЗапуститьПриложение позволяет передать в приложение параметры.
Доступен только на устройствах под управлением операционной системы Android .

Из справки, нам стало понятно, что работает это все только на Андроид , ну в принципе ничего странного.

Идем дальше. У нас есть определенные свойства и есть один метод.

Давайте разберем некоторые свойства:

Данные – это URI ссылка, помните, мы ранее уже говорили про это в вот этой статье. Т.е. если мы хотим запустить браузер, тот тут мы передаем адрес страницы.

Действие – тут мы с вами описывали то, что мы хотим от мобильной платформы. В справке 1С очень скромно про это написали. Но мы вернемся чуть позже.

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

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

Приложение - тут мы можем указать какое именно приложение (его идентификатор) мы хотим использовать для наших действий, например - "com.google.android.gm" , в этом случае откроется Gmail.

ИмяКласса - указывается в паре с приложением, выудить его можно при декомпиляции программы в манифесте, ну или в мануале, если есть, в случае Gmail - "com.google.android.gm.ComposeActivityGmail" .

Если казать только приложение или только имя класса - ничего не произойдет. Их есть смысл указывать только в том случае, если вы понимаете о чем идет речь :) При этом можно не указывать Категорию.

В мобильной платформе у обьекта ЗапускПриложенияМобильногоУстройства при вызове метода Запустить игнорируется свойство Приложение, если не установлено свойство ИмяКласса.

ДополнительныеДанные – это ( типо ) структура, в которой мы описываем все параметры для передачи нашему приложению. И в ЭТУ ЖЕ структуру возвращается ответ. Тут не стоит забывать про третий параметр, это тип данных, например, в случае работы с фото, или прикрепляя к письму вложения - мы должны указать Uri представление, так как 1С не значет что это такое, то мы указываем путь и третьим параметром указываем тип, например - "Uri".

Метод Запустить – на самом деле тут два метода. Если передаете в параметр Истина, то приложение может вернуть некий код своей работы. Вот как в браузере, если страница не найдена – возвращает код ошибки 404. Если же его переключить в режим Ложь, то он будет работать как индикатор успешного выполнения приложения, т.е. вернет Истину, если же была ошибка, то вернет Ложь.

Что же это все за данные и откуда их брать?

Если в двух словах, то программы на Андроиде могут создавать Намерения ( Intent ) и обрабатывать их.

Т.е., когда программа написана специальным образом, то при установке она создает ассоциации с некоторыми событиями и их обработкой. В 1С есть хороший аналог – Оповестить( ) и ОбработкаОповещения (), но только в случае 1С – это локально, а в случае Андроид – глобально.

И ясное дело, что должны быть соответствующие инструкции по работе с ними.

Вот это определение доступных режимов. Например, можете попробовать вызвать вот такой экшн (действие ) :

Посмотрите, что будет.

Теперь давайте отправим почту, за основу я взял первую попавшуюся статью:

Первое на что я смотрю:

Теперь тут надо быть внимательней. Так как вот это Intent . ACTION _ SEND сокращение от android.Intent.action.SEND , а 1С не понимает сокращений, так что не попадайтесь на такие детские ошибки.

Поэтому пишет вот так и тестируем.

В ответ мы получим «0», и ничего не произойдет. Почему? Ну так все же очевидно, видь должно быть написано не:

android . intent . action . SEND

Разве не понятно? J

Меняем регистр букв, и, о чудо – у нас открылась куча приложений, которые могут отработать это событие. Давайте уточним поиск, для этого укажем тип, но не тот, который в статье той, так как количество приложений не уменьшится, а вот такой:

Теперь нажав кнопку – у нас откроется значительно меньше приложений.

Ну и можем выбрать Gmail .

Теперь давайте заполним что-то, ну, например, тему и тело письма. В том примере это делается вот так:

emailIntent . putExtra ( Intent . EXTRA_SUBJECT , "subject of email" );

emailIntent . putExtra ( Intent . EXTRA_TEXT , "body of email" );

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

Мы же должны написать вот так:

НовВз.ДополнительныеДанные.Добавить ( "android.intent.extra.SUBJECT" , "Тема письма" );

НовВз.ДополнительныеДанные.Добавить ( "android.intent.extra.TEXT" , "Текст письма" );

В итоге – открыв Gmail , там заполнятся эти поля. Кроме этого, если у вас установлен скайп, то можете попробовать это же выполнить с ним.

Итог

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

Дополнение

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

Работать с ней вот так:

При этом вам вернется ответ в виде 3 данных разных типов.

Удачи!

Фабрика знаний

Тут будут писаться примеры реализации тех или иных механизмов.

Как сделать фото (видео) в любом качестве?

Учтите - работает не везде, зависит от приложения, при помощи которого делается фото. У меня на Cyan прошивке - все отрабатывало нормально.

Должен быть установлен клиент Gmail

Пример работы с Viber'ом. Спасибо Снежане

Еще можно открыть контакты устройства и выбрать конкретный контакт, но вот проблема в том, что получаем в итоге Uri-ссылку на контакт, а 1С с ней ничего сделать не может. а хотелось бы данные вытянуть.

Написали в пожелания создание Локального ключа контакта на основании Uri-ссылки.

Спасибо Снежане

Как правильно указывать путь к файлам? Спасибо Вадиму

Когда мы сохраняем файл средствами моб платформы через

То этот файл недоступен другим приложениям. Можно писать так:

но теоретически карты памяти может и не быть. Поэтому есть более методически правильный метод:

Как выбрать файл нужного типа, при помощи менеджера файлов?

Сразу скажу что несмотря на громкое, как кому-то могло показаться, название статьи — тут не будет никакого прям уж совсем хардкора. А также несмотря на то что реверсинг чаще всего связывается с информационной безопасностью — здесь опять же ничего такого не будет, ибо никаких защит (за исключением небольшой минификации) обходить не было необходимости. Нет их. Мобильная 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С просто не запускается или начинает работать в режиме «Конфигуратор». Пользовательский режим бывает недоступен или, при использовании определенных команд, будет появляться сбой.

Чтобы научиться быстро исправлять ошибки в 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С Бухгалтерия. Программа теряет свое главное преимущество в глазах пользователей — «Быстродействие».

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

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

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

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

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

Общие причины зависаний 1C:

  • Нехватка мощности рабочего компьютера;
  • Слишком большой объем информации;
  • Не целевое использование программного продукта;
  • Излишек дополнительных, второстепенных функций;
  • Ошибки в установленных настройках.

Наиболее распространенные виды проблем, возникающих при эксплуатации:

Очень долгий запуск системы

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

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

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

  • Скорость компиляции и исполнение второстепенных задач

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

На заметку! Эта проблема может быть разрешена проведением своевременной модификации—оптимизации. В итоге отключится исполнение многих второстепенных задач подключенных к старту системы, тем самым «облегчив» сам запуск.

  • Разрешение на авто подключение к интернету, автообновление, автопоиск информации.

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

Очень долгое открытие форм

Причиной очень долгого открывания форм может быть:

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

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

Очень долгая реакция на интерактивные действия пользователя

Если программа медленно реагирует на действия пользователя при попытке выбрать значение в элементе формы, то «виновников» возникновения проблемы необходимо искать:

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

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

Очень долгая реакция на обновления

Еще одна существенная проблема при использовании 1С Бухгалтерия — это зависание программы во время стандартного обновления. Как правило, сбои возникают во время запуска резервного копирования. В основном, такое случается в момент обновления программы через интернет. Поводом для возникновения внештатной ситуации бывает:

  • Не соблюдение установленных сроков обновления.

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

Кстати! Фоновое обновление программного обеспечения тоже может стать причиной для замедления некоторых процессов во время работы. Этот фактор нужно обязательно учитывать, при выяснении причин зависаний 1С.

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

Долгая запись объектов/проведение документов

Для выявления точной причины долгой записи или блокировки, желательно провести статистический анализ. Опция «Замер производительности» поможет проанализировать журнал регистрации, где зафиксированы и идентифицированы все транзакции. Итоги анализа могут указать на закономерные причины зависаний 1С:

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

Причина монопольных блокировок интуитивно понятна — количество пользователей. Кто-то из сослуживцев занял что-то для проведения какой-то операции. Оставшимся специалистам остается только ждать, когда получится продолжить свой рабочий процесс. Причем блокировка будет длиться до конца транзакции. Например, чтобы не создавать подобных «пробок», лучше выбирать запрос — для чтения и объектную модель — при записи.

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

Квалифицированное решение

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

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

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

  • Оставьте заявку на нашем сайте или позвоните нам по телефону;
  • Менеджер уточнит причины обращения и зафиксирует проблему;
  • Наши специалисты проведут технический аудит и экспертизу;
  • Проведут полную оптимизацию 1С.

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

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