Отправка отчетов (или других табличных документов) из 1С по электронной почте.

Автоматизация (регламентное задание) рассылки отчетов (или других табличных документов) из 1С по электронной почте.

Здравствуйте, уважаемые форумчане. Чтобы ответить на 1 вопрос (я типо экстрасенс) оставлю ссылку с поиском, так как сам недавно нуждался, но пришлось все собирать по кирпичикам: Поиск
А теперь 2 вопрос — Зачем?
Итак, руководству понадобилось получать отчет по производству к началу планерки, сперва шло все хорошо — девочка на поддержке заходила в 1С, создавала отчет, сохраняла в Excel и всем отправляла. но наступил кризис, девочку сократили, а от отчета никто не отказался. Вот собственно для автоматизации всего этого процесса и было решено добавить регламентное задание, создать отчет, сохранить в читаемый (любимый для руководителй) тип файла и отправить по электронке.


Создаем общий модуль (ОтправкаОтчетов) с процедурами:
1) Общая процедура, будет запускаться из фонового задания:

Процедура Отчет() Экспорт
ТекстПисьма = "Отчет по ... за " + Строка(НачалоДня(ТекущаяДата())-60*60*16) + " - " + Строка(НачалоДня(ТекущаяДата())+60*60*8) + Символы.ПС;
Таб = СоздатьОтчет(ТекстПисьма);

ПутьКФайлу = "C:UsersPublic";
ИмяФайла = "temp.xls";
ПолноеИмяФайла = ПутьКФайлу+ИмяФайла;

ВыгрузитьТДвФайл(Таб, ПолноеИмяФайла, ТекстПисьма);

ОтправкаУведомлений(ТекстПисьма, ПолноеИмяФайла);
КонецПроцедуры

2) Формируем отчет (по идее можно переделать для любого табличного документа, если возникают сложности спрашивайте как):

Функция СоздатьОтчет(ТекстПисьма)
Таб = Новый ТабличныйДокумент;
Попытка
//Получаем схему из макета
СхемаКомпоновкиДанных = Отчеты.УниверсальныйОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
//Из схемы возьмем настройки по умолчанию
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
//Настроим период
НачальнаяДата = Настройки.ПараметрыДанных.Элементы.Найти("НачальнаяДата");
НачальнаяДата.Значение = НачалоДня(ТекущаяДата())-60*60*16;
КонечнаяДата = Настройки.ПараметрыДанных.Элементы.Найти("КонечнаяДата");
КонечнаяДата.Значение = НачалоДня(ТекущаяДата())+60*60*8;

//Помещаем в переменную данные о расшифровке данных
Расшифровка = Новый ДанныеРасшифровкиКомпоновкиДанных;
//Формируем макет, с помощью компоновщика макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
//Передаем в макет компоновки схему, настройки и данные расшифровки
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, Расшифровка);
ВнешниеПараметры = Новый Структура;
//Выполним компоновку с помощью процессора компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеПараметры, Расшифровка);
//Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Таб);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных, Истина);
Возврат Таб;

Исключение
ТекстПисьма = ТекстПисьма + "Ошибка при создании отчета! " + ОписаниеОшибки() + Символы.ПС;
Возврат Таб;
КонецПопытки;
КонецФункции

3) Сохраняем в файл (Excel):

Процедура ВыгрузитьТДвФайл(Таб, ПолноеИмяФайла, ТекстПисьма)
Попытка
Таб.Записать(ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLS);

Исключение
ТекстПисьма = ТекстПисьма + "Не удалось создать файл! " + ОписаниеОшибки() + Символы.ПС;
КонецПопытки;
КонецПроцедуры

4) Отправляем почту:

Процедура ОтправкаУведомлений(ТекстПисьма, ПолноеИмяФайла)
ИПП = Новый ИнтернетПочтовыйПрофиль;
ИПП.АдресСервераSMTP = "mail.ru";
ИПП.ПарольSMTP = "pass";
ИПП.ПользовательSMTP = "login";
ИПП.ПортSMTP = 25;

Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Кодировка = "UTF-8";
Сообщение.Получатели.Добавить("1@mail.ru");
Сообщение.Получатели.Добавить("2@mail.ru");

Сообщение.Отправитель.Адрес = "0@mail.ru";

Сообщение.Тема = "Регл.задание: Отчет";
Попытка
Сообщение.Вложения.Добавить(ПолноеИмяФайла,"Отчет");
Исключение
ТекстПисьма = ТекстПисьма + "Не удалось добавить вложение! " + ОписаниеОшибки() + Символы.ПС;
КонецПопытки;
Сообщение.Тексты.Добавить(ТекстПисьма);

Почта = Новый ИнтернетПочта;
Почта.Подключиться(ИПП);
Почта.Послать(Сообщение);
Почта.Отключиться();
КонецПроцедуры

Вот собственно всего 4 несложных процедурки и у нас все готово для настройки регламентного задания: Имя метода выбираем наш общий модуль с 1 процедурой (ОтправкаОтчетов.Отчет) и настраиваем расписание.


Теперь и руководство довольно — все вовремя приходит, и нам (программистам/администраторам 1С) время не надо тратить.

21 Comments

  1. Danil.Potapov

    рекомендую за основу брать подсистему рассылки отчетов от 1с в БСП.

    Reply
  2. DoctorRoza

    Самый простой, рабочий вариант.

    Reply
  3. burlakov

    давно подобный механизм сам реализовывал. только тут не хватает много чего еще.

    1. справочник рассылок нужен

    2. сформированные сообщения надо ставить в очередь и задание должно отправлять их каждые 5 мин допустим

    3. все настройки должны задаваться, а не в коде писаться напрямки. изменят вам сервер — в код полезете переделывать?

    4. помимо отчетов это можно использовать для информирования групп пользователей о любы событиях в системе (например о создании элемента справочника или проведении документа (в т.ч. с описаниями изменений по версионированию))

    если кому интересно могу выложить такой механизм.

    Reply
  4. bashinsky

    (3) burlakov, Интересно.

    Reply
  5. burlakov

    (4) bashinsky, хорошо. сделаю вариант решения сбоку и выложу на днях. у нас работает уже четвертый год — вполне успешно.

    Reply
  6. bashinsky

    (5) burlakov, Спасибо, буду ждать.

    Reply
  7. succub1_5

    (3) burlakov, согласен — совершенству нет предела =)

    1) в конечной версии у нас из excel файла берется список абонентов

    2) зачем? более 30 абонентов всем приходит

    3) да, а можно из настроенного почтового профиля брать

    4) так я получается сразу 3 момента описал: программная отправка почтовых сообщений (много для чего нужно), программное создание отчета из СКД и 1 строчная выгрузка полученного табличного документа в excel

    =)

    Reply
  8. LexSeIch

    Мир этому дому!

    Как раз столкнулся с подобной задачей в маленькой самописной системе. Автору большое спасибо.

    Reply
  9. burlakov

    (7)

    очередь нужна на случай если упадет почтовик. у нас тоже вначале ее не было. много проблем было с потерями из-за этого периодически. а потом я придумал очередь и про проблемы вообще забыли.

    Reply
  10. succub1_5

    (9) burlakov, понятно, мы пока не сталкивались, но я был бы очень признателен за код, отвечающий за формирование очереди =)

    Reply
  11. GreenDragon

    (9) burlakov, реализовать очередь через регистр сведений, в случае успешной отправки отмечать записи или удалять их. Я правильно понял мысль? Сейчас как раз пишу подобное для отправки печатных форм документов клиентам(регламентным заданием).

    Reply
  12. succub1_5

    (11) GreenDragon, кстати сам принцип отправки писем интересен: 1) если 1С отправляет все данные скопом на почтовый сервер, то очередь (хотя зачем — по идее одно письмо рассылается 20+ адресатам) формировать на самом сервере, 2) если же в 1С формировать разные письма (в силу каких-то условий: разный тест сообщения, разные прикрепляемые файлы, разные заголовки тем и т.п.) — то да уже в 1С формировать очередь и отчет по отправке.

    Reply
  13. burlakov

    выложил свой механизм по Вашим просьбам http://infostart.ru/public/329175/

    Reply
  14. jaroslav.h

    Дякую, реально робочий варіант, багато часу зекономив, дякую тобі добра людино! Дякую!

    Reply
  15. simgo83

    Спасибо, реально помогло для розницы 2.0

    Reply
  16. mila1231

    лучше поздно, чем никогда)) встал вопрос о формировании отчёта в фоновом режиме..

    вопрос в том, как поступить, если отчёт формируется в табличный документ по запросу, т.е по сути как заполнить сам макет??

    Reply
  17. Manticor

    Как обойти эту ошибку при отрпавке??

    Ошибка при вызове метода контекста (Подключиться): Can’t connect to mail.ru,25: Refused

    Reply
  18. Shurgent

    (17) На сколько я понимаю, mail.ru, как и другие почтовые службы, уже давно перешли на SSL и на 25-й порт подключиться не удастся. Нужно использовать порт 465 и устанавливать признак использования SSL:

    ИПП.ПортSMTP = 465;
    ИПП.ИспользоватьSSLSMTP = Истина;
    Reply
  19. kostyaspb010

    Добрый день! А куда 3 остальных модулю поместить? 1 -ый в общий модуль, это понятно.

    Reply
  20. user1202361

    Спасибо, очень интересная статья.

    Reply
  21. vladimir-89

    Спасибо! Класс!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *