Разберем ситуацию, которая часто ставит в тупик разработчиков: при программном получении почты через объект ИнтернетПочта по протоколу IMAP, система загружает сообщения, которых фактически нет в почтовом ящике (он пуст при просмотре через Outlook, Thunderbird или веб-интерфейс). Более того, эти письма могут быть «древними», то есть удаленными несколько месяцев назад. Рассмотрим подробнее причины этого явления и выясним, как с этим бороться.
Первое, что мы должны проанализировать — это специфика самого протокола IMAP. В отличие от POP3, где удаление обычно происходит сразу, в IMAP этот процесс состоит из двух этапов:
\Deleted. В этот момент письмо все еще физически находится на сервере, но большинство почтовых клиентов (Outlook, Thunderbird) скрывают такие сообщения от пользователя.EXPUNGE, которая окончательно стирает помеченные письма из базы данных сервера.В 1С метод Выбрать() с параметром Истина должен инициировать удаление. Посмотрим на стандартный пример кода:
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
// Параметр Истина означает "Удалять сообщения после получения"
Сообщения = Почта.Выбрать(Истина);
Почта.Отключиться();
Однако, если сервер настроен специфическим образом или сессия завершилась некорректно, команда окончательной очистки может не выполниться. В результате при следующем подключении 1С снова «видит» эти письма, так как библиотека 1С зачастую игнорирует флаг \Deleted при формировании списка заголовков, если не заданы дополнительные фильтры.
Проанализируем поведение популярных почтовых сервисов, таких как Gmail, Yandex или Mail.ru. Они часто используют систему меток (ярлыков) вместо физических папок.
Например, в Gmail письмо может быть удалено из папки «Входящие», но оно продолжает существовать в системной папке «Вся почта» (All Mail). Если объект ИнтернетПочта подключается без явного указания папки, сервер может отдавать письма из общего архива, которые вы давно считали удаленными. Аналогично работают механизмы «защиты от удаления» в корпоративных почтовых системах, где письма перемещаются в скрытый архивный слой, доступный по протоколу IMAP, но невидимый в обычном интерфейсе.
Если проблема возникает в типовой конфигурации 1С:Документооборот, стоит обратить внимание на внутренние регистры системы. Выясним причину появления «фантомных» задач, связанных с почтой.
В «1С:ДО» процесс получения почты автоматизирован через регламентные задания. Процедура обработки выглядит так:
Если на этапе 3 произошел программный сбой, транзакция может откатиться частично, либо письмо останется в статусе «не обработано» во внутреннем кэше 1С. При следующем запуске система может подхватить старые данные из своих же таблиц, создавая иллюзию повторного получения письма с сервера. Проверьте состояние регистра ОчередьСообщений и убедитесь, что там нет зависших записей прошлых периодов.
Важным объектом в работе с IMAP является UID (Unique Identifier). Каждое сообщение имеет свой уникальный номер. Однако существует параметр UIDValidity. Если на почтовом сервере произошла переиндексация базы или сбой, значение UIDValidity меняется. В этом случае 1С может некорректно сопоставлять идентификаторы и начинать скачивать старые письма, считая их новыми.
Также стоит рассмотреть ситуацию с «зависшими» сессиями. Если предыдущее соединение 1С было разорвано без вызова метода Отключиться(), сервер может удерживать состояние сессии, включая список писем, актуальный на момент открытия, игнорируя изменения, сделанные другими клиентами.
Чтобы окончательно убедиться, что именно передает сервер, рекомендуется включить технологический журнал или специализированный лог почты. Для этого в файл logcfg.xml можно добавить настройки для сбора данных по событию InternetMail. Это позволит увидеть сырые ответы сервера на команды FETCH и LIST.
Если использование логов затруднительно, попробуйте явно указать папку для получения, чтобы исключить влияние архивов:
// Пример выбора конкретной папки перед получением
Папки = Почта.ПолучитьСписокПапок();
Для Каждого Папка Из Папки Цикл
Если Папка.Имя = "INBOX" Тогда
Почта.ТекущаяПапка = Папка;
Прервать;
КонецЕсли;
КонецЦикла;
Сообщения = Почта.Выбрать(Истина);
Если вы столкнулись с «фантомными» письмами в 1С, выполните следующие шаги:
EXPUNGE выполняется сразу после пометки письма на удаление (в некоторых почтовых сервисах это настраивается в веб-интерфейсе).ТекущаяПапка объекта ИнтернетПочта в значение "INBOX" (или иное целевое), чтобы не сканировать скрытые архивы.Используя эти методы, мы сможем обеспечить стабильную и корректную работу почтового модуля, исключив обработку неактуальных данных.