gifts2017

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

Опубликовал Иван Сидоров (succub1_5) в раздел Обмен - Email рассылки

Автоматизация (регламентное задание) рассылки отчетов (или других табличных документов) из 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С) время не надо тратить.

См. также

Подписаться Добавить вознаграждение

Комментарии

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

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

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