Как реализовать автоматическое получение и загрузку прайса из электронной почты в 1С

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

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

Основные инструменты: объект ИнтернетПочта и профили подключения

Для работы с электронными письмами в платформе 1С предусмотрен специализированный объект ИнтернетПочта. Однако, прежде чем начать работу с письмами, нам необходимо настроить параметры соединения. Для этого используется объект ИнтернетПочтовыйПрофиль. Проанализируем, какие параметры являются критически важными для успешного подключения.

В первую очередь нам нужно определиться с протоколом. Чаще всего для входящей почты используются POP3 или IMAP. Мы рекомендуем использовать IMAP, так как он более современный, позволяет работать с папками на сервере и эффективнее фильтровать сообщения без необходимости скачивать их целиком. Разберем пример настройки профиля для защищенного соединения (SSL), которое сейчас требует большинство почтовых сервисов, таких как Mail.ru, Yandex или Gmail.


Профиль = Новый ИнтернетПочтовыйПрофиль;

// Настройки для протокола IMAP (рекомендуется)
Профиль.АдресСервераIMAP = "imap.yandex.ru";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Профиль.ПользовательIMAP = "your_login@yandex.ru";
// Важно: для современных почтовиков здесь используется пароль приложения
Профиль.ПарольIMAP = "ваш_пароль_приложения"; 
Профиль.Таймаут = 60;

Важный нюанс по безопасности: В современных реалиях обычный пароль от почтового ящика в коде не сработает. Почтовые сервисы требуют создания специальных "Паролей приложений" в настройках безопасности аккаунта. Это 16-значный код, который выдается именно для работы сторонних программ (в нашем случае — для 1С).

Установление соединения и получение списка писем

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


Почта = Новый ИнтернетПочта;
Попытка
    Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
Исключение
    Сообщить("Ошибка при подключении: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Рассмотрим ситуацию, когда в почтовом ящике тысячи писем. Скачивать их все — нерационально. Мы воспользуемся механизмом фильтрации. Рассмотрим подробнее объект ИнтернетПочтовыеПараметрыОтбора. С его помощью мы можем ограничить выборку только непрочитанными письмами или письмами от конкретного отправителя.


ПараметрыОтбора = Новый ИнтернетПочтовыеПараметрыОтбора;
ПараметрыОтбора.Отправитель = "supplier@example.com";
ПараметрыОтбора.Непрочитанные = Истина;

// Сначала получаем только заголовки (это быстро)
Заголовки = Почта.ПолучитьЗаголовки(ПараметрыОтбора);
// Теперь скачиваем письма целиком только по найденным заголовкам
МассивПисем = Почта.Выбрать(Ложь, Заголовки);

Обработка вложений и сохранение прайса

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

Посмотрим на пример кода, который ищет файл по маске имени и сохраняет его на диск:


Для Каждого Письмо Из МассивПисем Цикл
    Если Письмо.Вложения.Количество() > 0 Тогда
        Для Каждого Вложение Из Письмо.Вложения Цикл
            // Проверяем имя файла, например, нам нужен Excel-файл
            Если СтрНайти(НРег(Вложение.ИмяФайла), "price") > 0 Тогда
                ПутьКФайлу = "C:\Exchange\price_new.xlsx";
                Вложение.Данные.Записать(ПутьКФайлу);
                Сообщить("Файл успешно сохранен: " + ПутьКФайлу);
                
                // После успешной обработки помечаем письмо как прочитанное (для IMAP)
                Почта.УстановитьПометкиСообщений(Письмо, , Истина);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецЦикла;

// Не забываем закрыть соединение
Почта.Отключиться();

Использование Библиотеки стандартных подсистем (БСП)

Если вы работаете в современной конфигурации (например, 1С:Управление торговлей 11 или Бухгалтерия 3.0), мы рекомендуем использовать механизмы БСП вместо написания кода с нуля. Это позволит хранить настройки почты в справочнике УчетныеЗаписиЭлектроннойПочты и использовать готовые функции общих модулей. Разберем по шагам, как это упрощает жизнь программисту.

В БСП за работу с почтой отвечает общий модуль РаботаСПочтой. Нам не нужно вручную прописывать порты и SSL — достаточно передать ссылку на учетную запись, настроенную пользователем в интерфейсе.

  1. Выбираем учетную запись из справочника.
  2. Используем метод РаботаСПочтой.ВыбратьСообщения().
  3. Обрабатываем результат в стандартном цикле.

Автоматизация через регламентные задания

Чтобы система работала без участия человека, мы должны создать РегламентноеЗадание. Проанализируем алгоритм его настройки:

Во-первых, создадим процедуру в общем модуле (с флагом "Сервер"). В этой процедуре будет располагаться весь код, который мы разобрали выше. Во-вторых, в ветке конфигурации "Общие -> Регламентные задания" добавим новое задание, укажем наше расписание (например, каждые 15 минут) и привяжем к процедуре.

Нюанс серверного исполнения: Учтите, что регламентное задание выполняется под пользователем операционной системы, от имени которого запущен сервер 1С (обычно USR1CV8). У этого пользователя должны быть права на запись в ту папку, куда вы планируете сохранять скачанные прайсы. Рекомендуем использовать КаталогВременныхФайлов() для промежуточного хранения.

Рекомендации по стабильности решения

Разберем несколько советов, которые помогут сделать вашу интеграцию надежной:

Таким образом, мы выяснили, что реализация получения прайса через почту в 1С — это комплексная, но вполне решаемая задача. Используя объект ИнтернетПочта, правильно настраивая профили и не забывая про современные требования безопасности (пароли приложений), вы сможете построить надежный мост для обмена данными с вашими контрагентами.

← На главную