Как настроить отправку писем в 1С:ЗУП 3.1 и организовать автоматическую очистку истории переписки

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

В процессе работы с программой 1С:Зарплата и управление персоналом 3.1 пользователи часто сталкиваются с ситуацией, когда системная учетная запись почты настроена корректно и проходит все тесты, но реальные письма (например, расчетные листки) не доходят до адресатов. Рассмотрим подробно, почему это происходит в клиент-серверных базах, где искать «зависшие» письма и как автоматизировать очистку базы от старых сообщений, чтобы они не увеличивали объем данных.

Причина задержки отправки в клиент-серверном режиме

Проанализируем ситуацию: в файловой версии 1С отправка почты часто инициируется непосредственно в момент нажатия кнопки пользователем. Однако в клиент-серверном режиме за это отвечает регламентное задание. Если письмо «исчезает» из интерфейса, но не приходит получателю, первым делом необходимо проверить состояние серверных процессов.

Выясним причину: в типовых конфигурациях на базе БСП (Библиотеки стандартных подсистем) отправка писем происходит асинхронно. Программа помещает письмо в очередь, а специальное задание на сервере должно его подхватить и отправить. Если это задание выключено, письма будут накапливаться в базе бесконечно.

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

  1. Перейдем в раздел Администрирование — Обслуживание.
  2. Откроем ссылку Регламентные и фоновые задания.
  3. Найдем в списке задание с наименованием Отправка и получение сообщений электронной почты (в некоторых версиях может называться Получение и отправка почты).
  4. Проверим, стоит ли флаг Использовать. Если нет — включим его и настроим расписание (например, каждые 60 секунд).

Где найти очередь исходящих писем

Рассмотрим вопрос о том, где хранятся письма, которые уже созданы, но еще не были отправлены или были отправлены ранее. В 1С:ЗУП нет отдельного ярлыка «Исходящие» на рабочем столе, поэтому проанализируем структуру хранения данных.

Все электронные письма являются документами. Чтобы увидеть их список, можно воспользоваться следующими способами:

Автоматическое удаление старых писем и вложений

При массовой рассылке расчетных листков база данных начинает стремительно расти из-за вложений в формате PDF или Excel. Разберем, как реализовать механизм автоматической очистки писем старше 7 дней. Поскольку конфигурация ЗУП часто находится на поддержке (на «замке»), лучше всего использовать расширение конфигурации.

Посмотрим на пример кода, который выполняет удаление устаревших документов. Нам необходимо создать процедуру в общем модуле расширения:


Процедура УдалениеУстаревшихПисем() Экспорт
    // Вычисляем дату, старше которой письма будут удалены (7 дней назад)
    ДатаОкончания = ТекущаяДата() - 7 * 86400; 
    
    // Выбираем документы, созданные ранее этой даты
    Выборка = Документы.ЭлектронноеПисьмоИсходящее.Выбрать(, ДатаОкончания);
    
    Пока Выборка.Следующий() Цикл
        ТекущийОбъект = Выборка.ПолучитьОбъект();
        // Используем непосредственное удаление для очистки базы
        Попытка
            ТекущийОбъект.Удалить();
        Исключение
            ЗаписьЖурналаРегистрации("ОчисткаПочты", УровеньЖурналаРегистрации.Ошибка,,, "Не удалось удалить письмо: " + ТекущийОбъект.Ссылка);
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры

Очистка присоединенных файлов

Проанализируем важный нюанс: удаление самого документа ЭлектронноеПисьмоИсходящее не всегда автоматически очищает физические файлы из справочника присоединенных файлов. Чтобы база не «раздувалась», нужно очистить и их. Разберем, как дополнить наш алгоритм запросом:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    Файлы.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.ЭлектронноеПисьмоИсходящееПрисоединенныеФайлы КАК Файлы
    |ГДЕ
    |    Файлы.ДатаСоздания < &ДатаОкончания";

Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
РезультатЗапроса = Запрос.Выполнить().Выбрать();

Пока РезультатЗапроса.Следующий() Цикл
    ТекущийОбъект = РезультатЗапроса.Ссылка.ПолучитьОбъект();
    ТекущийОбъект.Удалить();
КонецЦикла;

Как запустить очистку, если нельзя добавить новое регламентное задание

Иногда возникают сложности с добавлением новых объектов РегламентноеЗадание через расширение (например, если версия платформы ниже 8.3.12). В такой ситуации рассмотрим альтернативный метод — «подписку» на уже существующее задание.

Найдем в системе задание, которое выполняется часто (например, Загрузка курсов валют или Классификаторы). С помощью механизма расширений добавим процедуру &После к основному методу этого задания. Таким образом, каждый раз после загрузки курсов валют система будет проверять и удалять старые письма.

Дополнительные рекомендации по диагностике

Если регламентное задание включено, но письма все равно не уходят, проанализируем следующие факторы:

Используя данные методы, мы обеспечим стабильную работу почтового модуля в 1С:ЗУП 3.1 и предотвратим избыточный рост базы данных за счет своевременного удаления ненужной информации.

← На главную