В современной разработке на платформе 1С:Предприятие 8.3 часто возникает задача автоматизации захвата изображений. Будь то фотографирование сотрудника для пропуска, фиксация состояния товара на складе или прикрепление скана документа, стандартный путь «открыть стороннее приложение — сохранить файл — выбрать файл в 1С» оказывается слишком громоздким и неудобным для пользователя. Разберем, как реализовать бесшовную работу с камерой прямо в интерфейсе программы. Если доработка конфигурации нежелательна, для исключения ручных действий при переносе файлов между окнами можно настроить автоматизацию повторяющихся операций пользователя с помощью платформы One RPA.
Проанализируем самый доступный способ, который не требует установки специализированных драйверов или платных библиотек. WIA — это стандартный интерфейс Windows для работы с видеоустройствами и сканерами. В 1С мы можем взаимодействовать с ним через COM-объект.
Этот метод позволяет вызвать стандартное диалоговое окно захвата изображения. Плюс в том, что оно уже интегрировано в операционную систему. Рассмотрим примерный алгоритм работы:
WIA.CommonDialog.ДвоичныеДанные.Посмотрим на пример кода, который инициализирует работу с WIA:
Попытка
Диалог = Новый COMОбъект("WIA.CommonDialog");
Снимок = Диалог.ShowAcquireImage();
Если Снимок <> Неопределено Тогда
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("jpg");
Снимок.SaveFile(ИмяВременногоФайла);
// Далее загружаем файл в 1С
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
КонецЕсли;
Исключение
Сообщить("Ошибка работы с WIA: " + ОписаниеОшибки());
КонецПопытки;
Важный нюанс: данный метод лучше всего подходит для простых задач, где не требуется тонкая настройка фокуса или работа в фоновом режиме без открытия окон.
Выясним, как использовать современные возможности платформы 1С. Начиная с версии 8.3.14, 1С поддерживает современный движок рендеринга HTML (Chromium). Это открывает нам доступ к технологии WebRTC и API navigator.mediaDevices.getUserMedia.
Это, пожалуй, самый изящный способ, так как видеопоток отображается прямо на форме 1С в обычном поле HTML-документа. Разберем по шагам, как это реализовать:
video.canvas, в который «рисуем» текущий кадр из видео.Проанализируем фрагмент 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С мы перехватываем это событие в обработчике ПриНажатии (для старых версий) или через механизм СредстваКлиентскогоПриложения.УстановитьРезультатОбработчикаСобытия.
Если нам требуется высокая производительность, работа с несколькими камерами одновременно или специфические настройки (яркость, контрастность, разрешение), стоит рассмотреть использование внешних компонент. В отличие от ActiveX, компоненты Native API не требуют регистрации в реестре и работают стабильнее.
При использовании внешней компоненты работа сводится к следующему сценарию:
УстановитьВнешнююКомпоненту или ПодключитьВнешнююКомпоненту.ДвоичныеДанные снимка.Рассмотрим пример подключения такой компоненты:
&НаКлиенте
Процедура ПодключитьКамеру()
Результат = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаРаботыСКамерой", "CameraLib", ТипВнешнейКомпоненты.Native);
Если Результат Тогда
КамераОбъект = Новый("AddIn.CameraLib.CameraControl");
КамераОбъект.ОткрытьОкноПредпросмотра();
КонецЕсли;
КонецПроцедуры
Преимущество: Снимок попадает в 1С мгновенно, без записи на жесткий диск, что повышает безопасность и скорость работы.
Разберем ситуацию, когда пользователю вообще не нужно видеть окно предпросмотра, а снимок должен делаться «в одно нажатие». Для этого отлично подходит 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 " + ПутьКФайлу;
ЗапуститьПриложение(КомандаЗапуска, , Истина); // Ждем завершения
Если ФайлСуществует(ПутьКФайлу) Тогда
КартинкаОбъект = Новый Картинка(ПутьКФайлу);
КонецЕсли;
Не забудем о том, что если ваше решение будет использоваться на мобильных устройствах, платформа 1С предоставляет нативный механизм. Нам не нужно изобретать велосипед, достаточно использовать встроенные средства мультимедиа.
Рассмотрим, как это выглядит в коде:
&НаКлиенте
Процедура СделатьФото(Команда)
Если СредстваМультимедиа.ПоддерживаетсяФотоснимок() Тогда
СредстваМультимедиа.СделатьФотоснимок(Новый ОписаниеОповещения("ПослеСнимка", ЭтотОбъект));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеСнимка(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
// Данные снимка в Результате
СохранитьСнимокВБазу(Результат);
КонецЕсли;
КонецПроцедуры
Выбор метода зависит от ваших конкретных условий:
Помните, что при работе с камерой важно обрабатывать исключения, так как устройство может быть занято другим приложением или просто отключено. Всегда проверяйте наличие прав доступа к камере в настройках конфиденциальности Windows.