В процессе автоматизации казначейства или бухгалтерского учета часто возникает задача автоматического сбора банковских выписок, которые приходят на электронную почту. Основная сложность заключается не в самом чтении почты, а в правильной организации процесса: как не обрабатывать одно и то же письмо дважды, если мы не хотим удалять его с сервера? Рассмотрим основные подходы к решению этой задачи, проанализируем возможности протоколов и разберем программную реализацию в среде 1С:Предприятие.
Протокол POP3 (Post Office Protocol version 3) изначально проектировался по принципу «забрал почту — удалил с сервера». Несмотря на то что современные почтовые клиенты (и объект ИнтернетПочта в 1С) позволяют скачивать письма без удаления, у этого протокола есть критическое ограничение: он не передает и не хранит состояние письма «прочитано» или «обработано» на сервере. Для сервера POP3 каждое обращение — это просто запрос списка доступных файлов.
Если мы вынуждены использовать POP3, то единственный надежный способ не дублировать загрузку выписок — это ведение собственного реестра в базе 1С. Разберем этот алгоритм:
Идентификатор объекта ИнтернетПочтовоеСообщение.Однако такой подход требует лишних действий в базе данных 1С и не синхронизируется, если почту смотрит кто-то еще через браузер или другой клиент. Поэтому более правильным решением является использование протокола IMAP.
Протокол IMAP (Internet Message Access Protocol) гораздо мощнее. Он позволяет работать с письмами непосредственно на сервере: создавать папки, перемещать сообщения и, самое главное, управлять флагами состояния. Для нашей задачи критически важен флаг Seen (Прочитано).
Рассмотрим пример кода, который позволяет получить только новые (непрочитанные) письма. Это исключает необходимость хранить лишние данные в 1С и позволяет серверу самому «фильтровать» контент.
// Настройка параметров отбора
ПараметрыОтбораЗаголовков = Новый Структура;
ПараметрыОтбораЗаголовков.Вставить("Seen", Ложь); // Выбираем только непрочитанные
// Получаем заголовки писем, соответствующих фильтру
Заголовки = Почта.ПолучитьЗаголовки(ПараметрыОтбораЗаголовков);
Если Заголовки.Количество() > 0 Тогда
МассивСообщений = Почта.Выбрать(Ложь, Заголовки, Истина); // Истина — помечать прочитанными
Для Каждого Сообщение Из МассивСообщений Цикл
// Проанализируем тему и вложения
Для Каждого Вложение Из Сообщение.Вложения Цикл
// Логика обработки файла выписки
Сообщить("Обработка файла: " + Вложение.Имя);
КонецЦикла;
КонецЦикла;
КонецЕсли;
В данном примере метод Выбрать с третьим параметром Истина автоматически установит флаг «Прочитано» на сервере сразу после загрузки сообщения. При следующем сеансе связи 1С эти письма уже не увидит, так как они не пройдут фильтр "Seen", Ложь.
Для еще большей надежности и удобства администрирования (чтобы администратор или бухгалтер мог зайти в ящик и увидеть, что обработано, а что — нет) рекомендуется использовать перемещение писем. Вы можете создать на почтовом сервере папку «Обработано» или «1С_Выписки».
Алгоритм работы в 1С будет выглядеть так:
ПереместитьСообщение.Это «золотой стандарт» автоматизации почты: во входящих всегда пусто или находятся только новые файлы, а все архивы лежат в соответствующих папках на сервере.
Проанализируем современную ситуацию с безопасностью. Если вы используете Gmail (как автор вопроса), то обычного логина и пароля будет недостаточно. Google блокирует подключения от «менее надежных приложений».
Вариант 1: Пароли приложений. В настройках аккаунта Google нужно включить двухфакторную аутентификацию, а затем создать «Пароль приложения». Именно этот сгенерированный код (16 знаков) нужно вставлять в поле Пароль объекта ИнтернетПочтовыйПрофиль в 1С.
Вариант 2: OAuth2. В современных версиях платформы 1С реализована поддержка OAuth2. Это требует регистрации приложения в консоли Google Cloud, получения Client ID и Client Secret. Для конфигураций на базе БСП (Библиотека стандартных подсистем) настройка выполняется в справочнике «Учетные записи электронной почты» выбором способа аутентификации «OAuth 2.0».
Выясним причину, по которой иногда выписки не загружаются корректно. Часто банки присылают файлы в архивах или со специфическими кодировками. Разберем, как правильно извлекать данные:
Если Найти(Вложение.Имя, ".zip") > 0 Тогда
// Распаковываем с помощью ЧтениеZipФайла
КонецЕсли;
РегламентныеЗадания. Это позволит системе работать стабильно, даже если почтовый сервер временно недоступен или письмо содержит тяжелое вложение.ВремяОжиданияСервера в профиле не менее 60 секунд. Банковские выписки могут быть объемными, и стандартных 30 секунд может не хватить для загрузки по медленным каналам связи.Подводя итог, можно сказать: использование устаревшего POP3 для задач маркировки сообщений неоправданно усложняет код. Переход на IMAP в сочетании с паролями приложений (для Gmail) и механизмом перемещения писем — это наиболее профессиональное и отказоустойчивое решение для 1С-программиста.