Как организовать загрузку фотографий в 1С со смартфона через e-mail и QR-код

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

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

Архитектура решения: как это работает

Проанализируем весь цикл передачи фотографии от мобильного устройства до информационной базы:

  1. Генерация QR-кода в документе: В печатную форму или прямо на экранную форму документа выводится QR-код, содержащий специальную ссылку формата mailto: с указанием почтового ящика системы и идентификатора документа в теме письма.
  2. Формирование письма на смартфоне: Пользователь сканирует код стандартной камерой телефона. Мобильная операционная система распознает ссылку и автоматически создает новое письмо с уже заполненным адресом и темой. Пользователю остается только прикрепить снимок и нажать кнопку отправки.
  3. Фоновая обработка в 1С: На стороне сервера 1С по расписанию срабатывает регламентное задание, которое опрашивает почтовый ящик, находит нужный документ по идентификатору из темы письма и сохраняет вложенные изображения.

Шаг 1. Формирование строки для QR-кода

Рассмотрим, как заставить смартфон автоматически создать черновик письма без использования сторонних сайтов и приложений. Для этого применяется стандартная URI-схема почтовых ссылок RFC 6068. В строку QR-кода зашивается адрес получателя и тема, содержащая уникальный идентификатор целевого документа (УникальныйИдентификатор):


// Формирование строки mailto для QR-кода
СтрокаQR = "mailto:photo-receiver@company.ru?subject=" + Строка(ДокументСсылка.УникальныйИдентификатор());

Камера современного смартфона (как на базе Android, так и на iOS) распознает такой формат нативно и сразу предлагает открыть почтовый клиент по умолчанию.

Шаг 2. Настройка регламентного задания для получения почты

Разберем процесс фонового сбора писем. Для автоматического выполнения операций без участия пользователя создадим объект конфигурации Регламентное задание с периодичностью выполнения (например, раз в 1–2 минуты) и свяжем его с процедурой в общем модуле с признаком Сервер.

Для подключения к почтовому ящику используем объекты платформы ИнтернетПочтовыйПрофиль и ИнтернетПочта. Рекомендуется использовать протокол IMAP вместо POP3, так как IMAP позволяет быстро получать только непрочитанные сообщения и корректно помечать их после обработки.


Процедура ЗагрузитьФотографииИзПочты() Экспорт

    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервераIMAP = "imap.company.ru";
    Профиль.ПортIMAP = 993;
    Профиль.ИспользоватьSSLIMAP = Истина;
    Профиль.Пользователь = "photo-receiver@company.ru";
    Профиль.Пароль = "СекретныйПароль";

    Почта = Новый ИнтернетПочта;

    Попытка
        Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
    Исключение
        ЗаписьЖурналаРегистрации("ЗагрузкаФото", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
        Возврат;
    КонецПопытки;

    // Получаем только непрочитанные письма
    ПараметрыОтбора = Новый Структура;
    ПараметрыОтбора.Вставить("НеПрочитанные", Истина);
    МассивПисем = Почта.Выбрать(Ложь, ПараметрыОтбора);

    Для Каждого Письмо Из МассивПисем Цикл
        
        ИдентификаторСтрокой = СокрЛП(Письмо.Тема);
        ДокументСсылка = НайтиДокументПоИдентификатору(ИдентификаторСтрокой);

        Если ЗначениеЗаполнено(ДокументСсылка) Тогда
            
            Для Каждого Вложение Из Письмо.Вложения Цикл
                
                // Проверяем расширение файла на соответствие изображениям
                Расширение = ВРег(Вложение.ИмяФайла);
                Если СтрЗаканчиваетсяНа(Расширение, ".JPG") 
                    Или СтрЗаканчиваетсяНа(Расширение, ".JPEG") 
                    Или СтрЗаканчиваетсяНа(Расширение, ".PNG") Тогда
                    
                    СохранитьФотоВДокумент(ДокументСсылка, Вложение.Данные, Вложение.ИмяФайла);
                    
                КонецЕсли;
                
            КонецЦикла;
            
        КонецЕсли;

    КонецЦикла;

    Почта.Отключиться();

КонецПроцедуры

Шаг 3. Поиск документа и сохранение прикрепленных файлов

Посмотрим на пример процедуры сопоставления полученного из темы GUID со ссылкой на документ в информационной базе и сохранения вложенного файла:


Функция НайтиДокументПоИдентификатору(СтрокаGUID)
    
    Попытка
        УИД = Новый УникальныйИдентификатор(СтрокаGUID);
        Возврат Документы.ПриходнаяНакладная.ПолучитьСсылку(УИД);
    Исключение
        // Если в теме передан некорректный GUID
        Возврат Неопределено;
    КонецПопытки;

КонецФункции

Процедура СохранитьФотоВДокумент(ДокументСсылка, ДвоичныеДанныеФото, ИмяФайла)
    
    // Пример создания элемента справочника присоединенных файлов
    НовыйФайл = Справочники.ПриходнаяНакладнаяПрисоединенныеФайлы.СоздатьЭлемент();
    НовыйФайл.ВладелецФайла = ДокументСсылка;
    НовыйФайл.Наименование = ИмяФайла;
    НовыйФайл.ФайлХранилище = Новый ХранилищеЗначения(ДвоичныеДанныеФото, Новый СжатиеДанных(9));
    НовыйФайл.ДатаМодификацииУниверсальная = ТекущаяУниверсальнаяДата();
    НовыйФайл.Записать();

КонецПроцедуры

Рекомендации по оптимизации и безопасности

Выясним основные нюансы, которые необходимо учесть при промышленной эксплуатации решения:

  1. Сетевые права сервера: Убедимся, что службе сервера 1С разрешен исходящий сетевой доступ в интернет к портам почтового сервера (включая проверку доверенных корневых SSL-сертификатов на серверах под управлением Linux).
  2. Хранение файлов на томах: Фотографии с камер современных телефонов имеют большой объем. Чтобы не раздувать размер таблицы базы данных (особенно в файловых версиях или на СУБД с ограничениями объема), рекомендуется настроить подсистему «Присоединенные файлы» на хранение данных в томах на диске, а не в теле базы данных.
  3. Сжатие изображений на лету: Перед помещением в хранилище целесообразно пережимать полученные фотографии средствами платформы (объект Картинка), уменьшая разрешение до разумных пределов (например, Full HD).

Альтернативные варианты реализации

Рассмотрим другие способы интеграции мобильной фотосъемки с базой 1С, которые можно применить при необходимости прямой передачи:

  1. HTTP-сервис 1С с мобильной веб-формой: QR-код кодирует URL-ссылку на опубликованный HTTP-сервис 1С. При наведении камеры открывается легкая браузерная страница с кнопкой загрузки фото из галереи или напрямую с камеры. Фото отправляется методом POST прямо в базу, исключая почтовую задержку.
  2. Чат-боты (Telegram, мессенджеры): Пользователь отправляет фото боту, указывая номер документа или пересылая сгенерированный код, а 1С считывает входящие сообщения через REST API мессенджера.
  3. Мобильный клиент 1С: Использование стандартных мобильных механизмов платформы (метод СредстваМультимедиа.СделатьСнимок()), что полностью исключает сторонние протоколы передачи.
← На главную