Автоматизация загрузки документов из электронной почты — одна из самых востребованных задач в 1С. Часто мы сталкиваемся с ситуацией, когда сторонний сервис или контрагент присылает отчеты в формате PDF, которые необходимо оперативно «затянуть» в базу, минуя ручной труд и промежуточные папки. В данной статье мы разберем, как построить надежный механизм забора почты из Gmail, обойти ограничения безопасности Google и правильно обработать вложения для сохранения в ХранилищеЗначения.
Прежде чем приступать к написанию кода в 1С, проанализируем ситуацию с доступом к почтовому ящику. Если мы просто укажем логин и пароль от аккаунта Google в коде, система выдаст ошибку авторизации. Это происходит потому, что Google блокирует подключения от «небезопасных приложений». Выясним причину: для работы по протоколу IMAP стандартного пароля недостаточно.
Для успешного подключения выполним следующие шаги:
Рассмотрим, как правильно сконфигурировать объект ИнтернетПочтовыйПрофиль. Ошибки в портах или протоколах — самая частая причина неудач. Для работы с 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С мы можем реализовать гораздо более оперативную проверку. Для этого воспользуемся механизмом РегламентныеЗадания.
Как настроить мгновенную реакцию:
РегламентноеЗадание и назначим ему эту процедуру.Проанализируем нагрузку: если писем много, желательно выполнять проверку в транзакции и предусмотреть обработку ошибок, чтобы регламентное задание не «зависало» при временных проблемах с интернетом или сервером Gmail.
Если работа через ИнтернетПочта кажется нестабильной (например, из-за специфических настроек прокси-серверов), можно рассмотреть использование Gmail REST API. Этот метод сложнее в реализации, так как требует регистрации приложения в Google Cloud Console и работы по протоколу OAuth 2.0, но он обладает рядом преимуществ:
has:attachment filename:pdf).Для реализации этого метода в 1С используется объект HTTPСоединение, а взаимодействие происходит через JSON-запросы. Однако для большинства задач типового функционала объекта ИнтернетПочта вполне достаточно.
Таким образом, мы выяснили, что ключ к автоматизации загрузки вложений из Gmail лежит в правильной настройке паролей приложений и корректном использовании коллекции Вложения объекта ИнтернетПочтовоеСообщение. Совместное использование этих инструментов с регламентными заданиями позволяет создать мощный и надежный шлюз для интеграции почты и 1С. При необходимости быстро добавить функционал обмена без доработки конфигурации можно использовать расширение для отправки и получения почтовых сообщений с вложениями.