Автоматизация рутинных процессов — одна из ключевых задач при работе с информационными системами. Представим ситуацию: ежедневно в определенное время на почтовый ящик компании поступает несколько десятков писем, содержащих отчеты в формате Excel, упакованные в ZIP-архивы. Ручная обработка таких данных занимает много времени и чревата ошибками. В этой статье мы подробно разберем, как реализовать автоматическую загрузку таких файлов средствами платформы 1С, используя регламентные задания и встроенные механизмы работы с почтой и архивами.
Для решения задачи нам не потребуется использование сторонних библиотек или внешних компонент. Платформа 1С:Предприятие обладает всеми необходимыми инструментами «из коробки». Весь процесс можно разделить на несколько логических этапов, которые мы проанализируем далее:
Первым делом нам необходимо создать объект ИнтернетПочтовыйПрофиль. В нем указываются адрес сервера, порт, логин и пароль. Важно понимать, что современные почтовые сервисы (такие как Gmail, Яндекс или Mail.ru) требуют использования паролей приложений вместо основных паролей от учетных записей для обеспечения безопасности.
Рассмотрим пример создания профиля для работы по протоколу IMAP, который является более предпочтительным, так как позволяет управлять папками на сервере:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераIMAP = "imap.yandex.ru";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.Пользователь = "login@yandex.ru";
Профиль.Пароль = "ваш_пароль_приложения";
Профиль.ТолькоЗащищенныйВходIMAP = Истина;
После подготовки профиля мы инициализируем объект ИнтернетПочта и устанавливаем соединение. Важно всегда использовать блоки Попытка...Исключение, так как проблемы с сетью или авторизацией — частое явление.
Для оптимизации работы мы не будем скачивать все письма. Платформа позволяет загружать только заголовки или фильтровать сообщения по дате или теме. Выясним причину, по которой стоит использовать IMAP: этот протокол позволяет нам прочитать только те письма, которые еще не были обработаны (не помечены как прочитанные).
Разберем пример получения непрочитанных писем с вложениями:
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
Исключение
ЗаписьЖурналаРегистрации("Почта", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
Возврат;
КонецПопытки;
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("НеПрочитанные", Истина);
ВыборкаПисем = Почта.Выбрать(Ложь, ПараметрыОтбора); // Ложь означает, что мы не помечаем сразу как прочитанные
Когда мы нашли нужное письмо, нам необходимо извлечь из него файл. Вложения хранятся в свойстве Вложения объекта ИнтернетПочтовоеСообщение. Рассмотрим подробнее процесс сохранения вложения во временную папку и его последующую распаковку. Для работы с архивами в 1С предусмотрен объект ЧтениеZipФайла.
Для Каждого Письмо Из ВыборкаПисем Цикл
Для Каждого Вложение Из Письмо.Вложения Цикл
Если НРег(Вложение.Расширение) = ".zip" Тогда
ПутьКАрхиву = КаталогВременныхФайлов() + Вложение.ИмяФайла;
Вложение.Данные.Записать(ПутьКАрхиву);
// Распаковываем архив
Архив = Новый ЧтениеZipФайла(ПутьКАрхиву);
ПутьРаспаковки = КаталогВременныхФайлов() + "Unzipped_Data\";
Архив.ИзвлечьВсе(ПутьРаспаковки, РежимВосстановленияПутейФайловZip.НеВосстанавливать);
Архив.Закрыть();
// Удаляем временный файл архива
УдалитьФайлы(ПутьКАрхиву);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Важный момент: при работе в серверном режиме (через регламентное задание) необходимо убедиться, что у пользователя, под которым запущен агент сервера 1С, есть права на запись в папку, возвращаемую функцией КаталогВременныхФайлов().
Многие разработчики по привычке используют COM-объекты для работы с Excel. Однако на сервере устанавливать Microsoft Excel не рекомендуется из-за лицензионных ограничений и низкой производительности. Мы проанализируем более эффективный метод — использование объекта ТабличныйДокумент.
Метод Прочитать() позволяет загрузить файл .xlsx напрямую в табличный документ 1С, после чего мы можем обходить ячейки программно:
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(ПутьКРаспакованномуФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
// Перебор строк таблицы
Для НомерСтроки = 1 По ТабДок.ВысотаТаблицы Цикл
ДанныеЯчейки = ТабДок.Область(НомерСтроки, 1).Текст;
// Здесь реализуем логику создания или обновления объектов в 1С
КонецЦикла;
Исключение
Сообщить("Ошибка чтения Excel: " + ОписаниеОшибки());
КонецПопытки;
Чтобы процесс выполнялся «в определенный час», создадим в конфигураторе объект РегламентноеЗадание. Укажем для него метод (процедуру в серверном общем модуле) и настроим расписание. Помните, что код внутри регламентного задания должен быть полностью автономным — он не может выводить диалоговые окна или запрашивать подтверждение у пользователя.
В конце выполнения процедуры обязательно закройте соединение с почтой с помощью метода Отключиться(). Это освободит ресурсы сервера и корректно завершит сессию на почтовом сервере.
При реализации загрузки данных из внешних источников всегда следуйте принципу «безопасного программирования»:
temp может привести к сбоям в работе сервера.Таким образом, мы убедились, что платформа 1С предоставляет мощный инструментарий для полной автоматизации обмена данными через электронную почту. Использование стандартных объектов ИнтернетПочта, ЧтениеZipФайла и ТабличныйДокумент делает ваше решение быстрым, надежным и независимым от стороннего программного обеспечения.