Как реализовать работу с веб-камерой в 1С:Предприятие 8.3 для автоматического создания снимков?

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

В современной разработке на платформе 1С:Предприятие 8.3 часто возникает задача автоматизации захвата изображений. Будь то фотографирование сотрудника для пропуска, фиксация состояния товара на складе или прикрепление скана документа, стандартный путь «открыть стороннее приложение — сохранить файл — выбрать файл в 1С» оказывается слишком громоздким и неудобным для пользователя. Разберем, как реализовать бесшовную работу с камерой прямо в интерфейсе программы. Если доработка конфигурации нежелательна, для исключения ручных действий при переносе файлов между окнами можно настроить автоматизацию повторяющихся операций пользователя с помощью платформы One RPA.

Метод 1: Использование интерфейса WIA (Windows Image Acquisition)

Проанализируем самый доступный способ, который не требует установки специализированных драйверов или платных библиотек. WIA — это стандартный интерфейс Windows для работы с видеоустройствами и сканерами. В 1С мы можем взаимодействовать с ним через COM-объект.

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

  1. Создаем объект WIA.CommonDialog.
  2. Вызываем метод захвата изображения.
  3. Сохраняем полученный объект во временный файл.
  4. Загружаем файл в информационную базу как ДвоичныеДанные.

Посмотрим на пример кода, который инициализирует работу с WIA:


Попытка
    Диалог = Новый COMОбъект("WIA.CommonDialog");
    Снимок = Диалог.ShowAcquireImage();
    Если Снимок <> Неопределено Тогда
        ИмяВременногоФайла = ПолучитьИмяВременногоФайла("jpg");
        Снимок.SaveFile(ИмяВременногоФайла);
        // Далее загружаем файл в 1С
        ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
    КонецЕсли;
Исключение
    Сообщить("Ошибка работы с WIA: " + ОписаниеОшибки());
КонецПопытки;

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

Метод 2: Внедрение WebRTC через поле HTML-документа

Выясним, как использовать современные возможности платформы 1С. Начиная с версии 8.3.14, 1С поддерживает современный движок рендеринга HTML (Chromium). Это открывает нам доступ к технологии WebRTC и API navigator.mediaDevices.getUserMedia.

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

  1. Размещаем на управляемой форме реквизит с типом Строка и вид элемента Поле HTML-документа.
  2. Подготавливаем HTML-код с JavaScript, который инициализирует камеру и выводит поток в тег video.
  3. Для захвата кадра используем скрытый элемент canvas, в который «рисуем» текущий кадр из видео.
  4. Передаем полученную строку в формате Base64 обратно в 1С.

Проанализируем фрагмент JavaScript-кода, который будет работать внутри 1С:


async function startCamera() {
    const stream = await navigator.mediaDevices.getUserMedia({ video: true });
    videoElement.srcObject = stream;
}

function takeSnap() {
    const canvas = document.createElement('canvas');
    canvas.width = videoElement.videoWidth;
    canvas.height = videoElement.videoHeight;
    canvas.getContext('2d').drawImage(videoElement, 0, 0);
    const dataURL = canvas.toDataURL('image/jpeg');
    // Передаем данные в 1С через событие
    window.external.notification('SnapTaken', dataURL);
}

В самой 1С мы перехватываем это событие в обработчике ПриНажатии (для старых версий) или через механизм СредстваКлиентскогоПриложения.УстановитьРезультатОбработчикаСобытия.

Метод 3: Использование внешних компонент (Native API)

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

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

  1. Подключаем компоненту через УстановитьВнешнююКомпоненту или ПодключитьВнешнююКомпоненту.
  2. Инициализируем объект и передаем ему идентификатор окна (Handle) для вывода видео.
  3. Вызываем метод компоненты, возвращающий ДвоичныеДанные снимка.

Рассмотрим пример подключения такой компоненты:


&НаКлиенте
Процедура ПодключитьКамеру()
    Результат = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаРаботыСКамерой", "CameraLib", ТипВнешнейКомпоненты.Native);
    Если Результат Тогда
        КамераОбъект = Новый("AddIn.CameraLib.CameraControl");
        КамераОбъект.ОткрытьОкноПредпросмотра();
    КонецЕсли;
КонецПроцедуры

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

Метод 4: Использование консольных утилит (FFmpeg)

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

Мы можем вызвать FFmpeg из кода 1С в скрытом режиме (используя ЗапуститьПриложение). Программа захватит один кадр и сохранит его в файл, который 1С тут же подберет.

Пример командной строки для FFmpeg:

ffmpeg -f dshow -i video="Имя_Вашей_Камеры" -frames:v 1 snapshot.jpg

В 1С это будет выглядеть так:


КомандаЗапуска = "ffmpeg -f dshow -i video=""USB Camera"" -frames:v 1 " + ПутьКФайлу;
ЗапуститьПриложение(КомандаЗапуска, , Истина); // Ждем завершения
Если ФайлСуществует(ПутьКФайлу) Тогда
    КартинкаОбъект = Новый Картинка(ПутьКФайлу);
КонецЕсли;

Метод 5: Особенности мобильной платформы

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

Рассмотрим, как это выглядит в коде:


&НаКлиенте
Процедура СделатьФото(Команда)
    Если СредстваМультимедиа.ПоддерживаетсяФотоснимок() Тогда
        СредстваМультимедиа.СделатьФотоснимок(Новый ОписаниеОповещения("ПослеСнимка", ЭтотОбъект));
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеСнимка(Результат, ДополнительныеПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        // Данные снимка в Результате
        СохранитьСнимокВБазу(Результат);
    КонецЕсли;
КонецПроцедуры

Подведем итоги и выберем лучшее решение

Выбор метода зависит от ваших конкретных условий:

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

← На главную