Как отключить фонарик на смартфоне при сканировании штрихкода в мобильном приложении 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Анализ стандартного подхода и его ограничений

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


#Если МобильноеПриложениеКлиент Тогда
    Если СредстваУстройства.ПоддерживаетсяФонарик Тогда
        СредстваУстройства.ВключитьФонарик(Ложь);
    КонецЕсли;

    Если НЕ СредстваМультимедиа.ПоддерживаетсяСканированиеШтрихКодов Тогда
        ВызватьИсключение НСтр("ru='Сканирование штрихкодов не поддерживается'");
    КонецЕсли;

    // Повторная попытка отключения перед вызовом сканера
    СредстваУстройства.ВключитьФонарик(Ложь);

    ОбработчикСканирования = Новый ОписаниеОповещения("ОбработкаСканирования", ЭтаФорма);
    ОбработчикЗакрытия = Новый ОписаниеОповещения("ОбработкаЗакрытияИнтерфейса", ЭтаФорма);

    СредстваМультимедиа.ПоказатьСканированиеШтрихКодов(
        НСтр("ru='Наведите камеру на штрихкод'"), 
        ОбработчикСканирования, 
        ОбработчикЗакрытия, 
        ТипШтрихКода.Все
    );
#КонецЕсли

Проанализируем, почему этот код часто не дает желаемого результата. Проблема заключается в разграничении зон ответственности API. Объект СредстваУстройства.ВключитьФонарик() управляет системным светодиодом в режиме непрерывного свечения (фонарика). Однако, когда вызывается метод СредстваМультимедиа.ПоказатьСканированиеШтрихКодов(), мобильное приложение инициирует новую сессию работы с камерой.

В этот момент управление светодиодом переходит от системного контроллера к драйверу камеры. Если прошивка устройства (особенно на бюджетных моделях или специфических оболочках вроде Flyme OS у Meizu) настроена так, чтобы использовать вспышку при недостаточном освещении в режиме «Авто», камера проигнорирует команду ВключитьФонарик(Ложь) и включит свет самостоятельно, считая, что это необходимо для фокусировки. Выясним, как обойти это ограничение.

Решение проблемы через обновление платформы

Самым простым и эффективным способом решения проблемы является обновление мобильной платформы. Проанализируем изменения в последних версиях. Начиная с версии 8.3.20 и выше, а окончательно в версии 8.3.24.66, разработчики 1С переработали интерфейс и логику встроенного сканера.

В новых версиях платформы реализованы следующие улучшения:

  1. Интерактивные кнопки управления: В самом диалоге сканирования появились графические элементы (кнопки), которые позволяют пользователю вручную включать и выключать вспышку прямо во время работы камеры.
  2. Запоминание состояния: Платформа стала корректнее обрабатывать настройки камеры, не включая свет принудительно, если внешние условия позволяют считать штрихкод без подсветки.

Таким образом, если вы используете устаревшую версию (например, 8.3.14), лучшим решением будет пересборка мобильного приложения на актуальной версии платформы. Это избавит вас от необходимости писать сложные «костыли» для управления железом.

Альтернативное решение: Использование внешних сканеров (Intents)

Если по каким-то причинам обновление платформы невозможно, разберем альтернативный вариант — использование внешних приложений для сканирования (например, ZXing или Google Lens). Мы можем вызвать внешнее приложение через механизм ЗапускПриложенияМобильногоУстройства.

Этот метод хорош тем, что специализированные приложения для сканирования имеют гораздо более гибкие настройки. Многие из них запоминают состояние вспышки: если пользователь отключил её один раз, она не включится автоматически при следующем вызове. Для интеграции мы создаем объект «Интент», передаем в него необходимые параметры и ожидаем результат в обработчике оповещения.

Работа с Библиотекой подключаемого оборудования (БПО)

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

Настройки операционной системы устройства

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

Попробуем выполнить следующие действия на устройстве:

  1. Откроем стандартное приложение «Камера».
  2. Переведем режим вспышки из «Авто» в состояние «Выключено» (иконка перечеркнутой молнии).
  3. Закроем приложение камеры и вернемся в 1С.

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

Заключение

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

← На главную