Как программно получать и сохранять вложения из почты Gmail в 1С

Программист IT и автоматизация бизнеса
← На главную

Автоматизация загрузки документов из электронной почты — одна из самых востребованных задач в 1С. Часто мы сталкиваемся с ситуацией, когда сторонний сервис или контрагент присылает отчеты в формате PDF, которые необходимо оперативно «затянуть» в базу, минуя ручной труд и промежуточные папки. В данной статье мы разберем, как построить надежный механизм забора почты из Gmail, обойти ограничения безопасности Google и правильно обработать вложения для сохранения в ХранилищеЗначения.

Разбираемся с настройками безопасности Gmail

Прежде чем приступать к написанию кода в 1С, проанализируем ситуацию с доступом к почтовому ящику. Если мы просто укажем логин и пароль от аккаунта Google в коде, система выдаст ошибку авторизации. Это происходит потому, что Google блокирует подключения от «небезопасных приложений». Выясним причину: для работы по протоколу IMAP стандартного пароля недостаточно.

Для успешного подключения выполним следующие шаги:

  1. Зайдем в настройки аккаунта Gmail и включим двухфакторную аутентификацию.
  2. В разделе безопасности создадим «Пароль приложения». Система сгенерирует 16-значный код. Именно этот код мы будем использовать в 1С вместо основного пароля.
  3. В настройках самой почты Gmail (веб-интерфейс) на вкладке «Пересылка и POP/IMAP» обязательно установим переключатель в положение «Включить IMAP».

Настройка почтового профиля в 1С

Рассмотрим, как правильно сконфигурировать объект ИнтернетПочтовыйПрофиль. Ошибки в портах или протоколах — самая частая причина неудач. Для работы с Gmail по современным стандартам безопасности необходимо использовать шифрование SSL.

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


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераIMAP = "imap.gmail.com";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;

// ВАЖНО: ПарольIMAP — это 16-значный пароль приложения, а не основной пароль
Профиль.ПользовательIMAP = "your_mail@gmail.com";
Профиль.ПарольIMAP = "abcd efgh ijkl mnop"; 

Профиль.Таймаут = 30;

Обратим внимание, что использование протокола IMAP предпочтительнее POP3, так как он позволяет гибко управлять письмами: помечать их как прочитанные, перемещать в папки или оставлять на сервере без необходимости скачивания всей переписки.

Программное получение писем и обработка вложений

Теперь разберем по шагам процесс получения почты. Основным объектом здесь выступает ИнтернетПочта. Нам необходимо не просто получить заголовки писем, а загрузить всё содержимое, включая вложенные файлы.

Проанализируем цикл обработки входящих сообщений:


Почта = Новый ИнтернетПочта;
Попытка
    Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
Исключение
    Сообщить("Ошибка подключения: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

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

Для Каждого Письмо Из МассивПисем Цикл
    Для Каждого Вложение Из Письмо.Вложения Цикл
        // Проверим, является ли файл PDF-отчетом
        Если Найти(Вложение.ИмяФайла, ".pdf") > 0 Тогда
            СохранитьВложениеВБазу(Вложение.Данные, Вложение.ИмяФайла);
        КонецЕсли;
    КонецЦикла;
    
    // После обработки письмо можно удалить или переместить, чтобы не обрабатывать повторно
    Почта.УдалитьСообщения(Письмо);
КонецЦикла;

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

Выясним важный нюанс: свойство Вложение.Данные имеет тип ДвоичныеДанные. Это именно то, что нам нужно для записи в базу 1С.

Сохранение файла в ХранилищеЗначения

Когда мы получили ДвоичныеДанные из письма, их нужно поместить в базу данных. В 1С для хранения произвольных файлов (картинок, PDF, Excel) используется объект ХранилищеЗначения. Рекомендуем использовать сжатие, чтобы база не росла слишком быстро.

Рассмотрим процедуру записи данных в реквизит справочника или документа:


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

Повышение частоты обработки и регламентные задания

Автор исходного вопроса столкнулся с проблемой задержки в 15 минут при использовании внешних сервисов. В 1С мы можем реализовать гораздо более оперативную проверку. Для этого воспользуемся механизмом РегламентныеЗадания.

Как настроить мгновенную реакцию:

  1. Создадим общую серверную процедуру, содержащую описанный выше код подключения к почте.
  2. Создадим новое РегламентноеЗадание и назначим ему эту процедуру.
  3. В расписании настроим повтор каждые 60 секунд. Это обеспечит практически мгновенную загрузку PDF-отчетов сразу после их поступления в Gmail.

Проанализируем нагрузку: если писем много, желательно выполнять проверку в транзакции и предусмотреть обработку ошибок, чтобы регламентное задание не «зависало» при временных проблемах с интернетом или сервером Gmail.

Альтернативный метод: Использование Gmail API

Если работа через ИнтернетПочта кажется нестабильной (например, из-за специфических настроек прокси-серверов), можно рассмотреть использование Gmail REST API. Этот метод сложнее в реализации, так как требует регистрации приложения в Google Cloud Console и работы по протоколу OAuth 2.0, но он обладает рядом преимуществ:

Для реализации этого метода в 1С используется объект HTTPСоединение, а взаимодействие происходит через JSON-запросы. Однако для большинства задач типового функционала объекта ИнтернетПочта вполне достаточно.

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

← На главную