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

Обмен - Email рассылки

автоматизация отчет электронная почта фоновое задание регламентное задание

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

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



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

Процедура Отчет() Экспорт
	ТекстПисьма = "Отчет по ... за " + Строка(НачалоДня(ТекущаяДата())-60*60*16) + " - " + Строка(НачалоДня(ТекущаяДата())+60*60*8) + Символы.ПС;
	Таб = СоздатьОтчет(ТекстПисьма);
	
	ПутьКФайлу = "C:\Users\Public\";
	ИмяФайла = "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С) время не надо тратить.

47

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. Danil.Potapov 09.02.15 16:13 Сейчас в теме
рекомендую за основу брать подсистему рассылки отчетов от 1с в БСП.
2. DoctorRoza 09.02.15 16:27 Сейчас в теме
Самый простой, рабочий вариант.
3. burlakov 75 09.02.15 16:33 Сейчас в теме
давно подобный механизм сам реализовывал. только тут не хватает много чего еще.
1. справочник рассылок нужен
2. сформированные сообщения надо ставить в очередь и задание должно отправлять их каждые 5 мин допустим
3. все настройки должны задаваться, а не в коде писаться напрямки. изменят вам сервер - в код полезете переделывать?
4. помимо отчетов это можно использовать для информирования групп пользователей о любы событиях в системе (например о создании элемента справочника или проведении документа (в т.ч. с описаниями изменений по версионированию))

если кому интересно могу выложить такой механизм.
4. bashinsky 120 09.02.15 16:37 Сейчас в теме
5. burlakov 75 09.02.15 16:39 Сейчас в теме
(4) bashinsky, хорошо. сделаю вариант решения сбоку и выложу на днях. у нас работает уже четвертый год - вполне успешно.
6. bashinsky 120 09.02.15 16:52 Сейчас в теме
(5) burlakov, Спасибо, буду ждать.
7. succub1_5 58 09.02.15 16:56 Сейчас в теме
(3) burlakov, согласен - совершенству нет предела =)
1) в конечной версии у нас из excel файла берется список абонентов
2) зачем? более 30 абонентов всем приходит
3) да, а можно из настроенного почтового профиля брать
4) так я получается сразу 3 момента описал: программная отправка почтовых сообщений (много для чего нужно), программное создание отчета из СКД и 1 строчная выгрузка полученного табличного документа в excel
=)
9. burlakov 75 10.02.15 07:59 Сейчас в теме
(7)

очередь нужна на случай если упадет почтовик. у нас тоже вначале ее не было. много проблем было с потерями из-за этого периодически. а потом я придумал очередь и про проблемы вообще забыли.
10. succub1_5 58 10.02.15 08:09 Сейчас в теме
(9) burlakov, понятно, мы пока не сталкивались, но я был бы очень признателен за код, отвечающий за формирование очереди =)
11. GreenDragon 10.02.15 09:54 Сейчас в теме
(9) burlakov, реализовать очередь через регистр сведений, в случае успешной отправки отмечать записи или удалять их. Я правильно понял мысль? Сейчас как раз пишу подобное для отправки печатных форм документов клиентам(регламентным заданием).
12. succub1_5 58 10.02.15 10:48 Сейчас в теме
(11) GreenDragon, кстати сам принцип отправки писем интересен: 1) если 1С отправляет все данные скопом на почтовый сервер, то очередь (хотя зачем - по идее одно письмо рассылается 20+ адресатам) формировать на самом сервере, 2) если же в 1С формировать разные письма (в силу каких-то условий: разный тест сообщения, разные прикрепляемые файлы, разные заголовки тем и т.п.) - то да уже в 1С формировать очередь и отчет по отправке.
8. LexSeIch 196 10.02.15 06:19 Сейчас в теме
Мир этому дому!
Как раз столкнулся с подобной задачей в маленькой самописной системе. Автору большое спасибо.
13. burlakov 75 10.02.15 16:21 Сейчас в теме
выложил свой механизм по Вашим просьбам http://infostart.ru/public/329175/
14. jaroslav.h 18.06.15 23:12 Сейчас в теме
Дякую, реально робочий варіант, багато часу зекономив, дякую тобі добра людино! Дякую!
15. simgo83 63 20.03.16 19:30 Сейчас в теме
Спасибо, реально помогло для розницы 2.0
16. mila1231 30.05.16 07:59 Сейчас в теме
лучше поздно, чем никогда)) встал вопрос о формировании отчёта в фоновом режиме..
вопрос в том, как поступить, если отчёт формируется в табличный документ по запросу, т.е по сути как заполнить сам макет??
17. Manticor 63 17.08.17 20:24 Сейчас в теме
Как обойти эту ошибку при отрпавке??

Ошибка при вызове метода контекста (Подключиться): Can't connect to mail.ru,25: Refused
18. Shurgent 11 22.08.17 09:30 Сейчас в теме
(17) На сколько я понимаю, mail.ru, как и другие почтовые службы, уже давно перешли на SSL и на 25-й порт подключиться не удастся. Нужно использовать порт 465 и устанавливать признак использования SSL:
ИПП.ПортSMTP = 465;
ИПП.ИспользоватьSSLSMTP = Истина;
Оставьте свое сообщение