При разработке мобильных приложений на платформе 1С специалисты часто сталкиваются с неприятной особенностью: при вызове встроенного сканера штрихкодов на некоторых устройствах автоматически включается фонарик (вспышка). Это приводит к тому, что при попытке считать код с глянцевой поверхности или экрана монитора происходит сильный засвет, и камера не может распознать данные. В этой статье мы подробно разберем, почему стандартные команды управления фонариком не всегда помогают, и как решить эту проблему современными средствами платформы.
Рассмотрим ситуацию, с которой сталкиваются многие разработчики. На первый взгляд, логично использовать средства управления оборудованием, которые предоставляет мобильная платформа. Типичный код, который пытаются применить для принудительного отключения фонарика перед сканированием, выглядит следующим образом:
#Если МобильноеПриложениеКлиент Тогда
Если СредстваУстройства.ПоддерживаетсяФонарик Тогда
СредстваУстройства.ВключитьФонарик(Ложь);
КонецЕсли;
Если НЕ СредстваМультимедиа.ПоддерживаетсяСканированиеШтрихКодов Тогда
ВызватьИсключение НСтр("ru='Сканирование штрихкодов не поддерживается'");
КонецЕсли;
// Повторная попытка отключения перед вызовом сканера
СредстваУстройства.ВключитьФонарик(Ложь);
ОбработчикСканирования = Новый ОписаниеОповещения("ОбработкаСканирования", ЭтаФорма);
ОбработчикЗакрытия = Новый ОписаниеОповещения("ОбработкаЗакрытияИнтерфейса", ЭтаФорма);
СредстваМультимедиа.ПоказатьСканированиеШтрихКодов(
НСтр("ru='Наведите камеру на штрихкод'"),
ОбработчикСканирования,
ОбработчикЗакрытия,
ТипШтрихКода.Все
);
#КонецЕсли
Проанализируем, почему этот код часто не дает желаемого результата. Проблема заключается в разграничении зон ответственности API. Объект СредстваУстройства.ВключитьФонарик() управляет системным светодиодом в режиме непрерывного свечения (фонарика). Однако, когда вызывается метод СредстваМультимедиа.ПоказатьСканированиеШтрихКодов(), мобильное приложение инициирует новую сессию работы с камерой.
В этот момент управление светодиодом переходит от системного контроллера к драйверу камеры. Если прошивка устройства (особенно на бюджетных моделях или специфических оболочках вроде Flyme OS у Meizu) настроена так, чтобы использовать вспышку при недостаточном освещении в режиме «Авто», камера проигнорирует команду ВключитьФонарик(Ложь) и включит свет самостоятельно, считая, что это необходимо для фокусировки. Выясним, как обойти это ограничение.
Самым простым и эффективным способом решения проблемы является обновление мобильной платформы. Проанализируем изменения в последних версиях. Начиная с версии 8.3.20 и выше, а окончательно в версии 8.3.24.66, разработчики 1С переработали интерфейс и логику встроенного сканера.
В новых версиях платформы реализованы следующие улучшения:
Таким образом, если вы используете устаревшую версию (например, 8.3.14), лучшим решением будет пересборка мобильного приложения на актуальной версии платформы. Это избавит вас от необходимости писать сложные «костыли» для управления железом.
Если по каким-то причинам обновление платформы невозможно, разберем альтернативный вариант — использование внешних приложений для сканирования (например, ZXing или Google Lens). Мы можем вызвать внешнее приложение через механизм ЗапускПриложенияМобильногоУстройства.
Этот метод хорош тем, что специализированные приложения для сканирования имеют гораздо более гибкие настройки. Многие из них запоминают состояние вспышки: если пользователь отключил её один раз, она не включится автоматически при следующем вызове. Для интеграции мы создаем объект «Интент», передаем в него необходимые параметры и ожидаем результат в обработчике оповещения.
Для более профессиональной разработки, особенно если речь идет о складской автоматизации, рекомендуем использовать нативный драйвер сканера штрихкодов из состава БПО. Рассмотрим преимущества этого подхода:
МенеджерОборудования, который позволяет более тонко настраивать параметры устройства.УстановитьПараметр(), где можно явно передать параметр управления вспышкой (например, значение "Off").Иногда корень проблемы кроется не в 1С, а в настройках самого смартфона. Проанализируем ситуацию на примере смартфонов Meizu или Xiaomi. В системном приложении «Камера» часто включены опции «Умная подсветка» или «Автоматическое улучшение». Поскольку 1С использует системное API, эти настройки могут наследоваться.
Попробуем выполнить следующие действия на устройстве:
В ряде случаев это действие принудительно меняет глобальный флаг использования вспышки для всех приложений, использующих камеру, и фонарик перестает беспокоить при сканировании.
Подведем итог. Если вы столкнулись с засветом штрихкода фонариком, в первую очередь проверьте версию вашей платформы. Переход на 8.3.24.66 является приоритетным решением, так как предоставляет пользователю визуальный контроль над вспышкой. Если же требуется жесткое программное управление без участия пользователя, стоит обратить внимание на использование нативных компонент из состава БПО или вызов внешних специализированных сканеров через механизмы Android Intents.