gifts2017

Использование встроенного почтового клиента

Опубликовал Poppy (poppy) в раздел Программирование - Практика программирования

В рамках развития типовых конфигураций в сторону CRM-систем в конфигурациях появился почтовый клиент. Возникает желание использовать его для рассылки печатных форм документов. Штатные средства такого не позволяют.

Статья является продолжением цикла статей и разработок:
Внешние печатные формы в восьмерке http://infostart.ru/blogs/157
Обработка для тестирования внешних печатных форм в восьмерке http://infostart.ru/projects/833/
Использование встроенного почтового клиента - http://infostart.ru/blogs/161/
Документ с печатью и подписью - http://infostart.ru/blogs/162/
Внешние печатные формы в восьмерке II - http://infostart.ru/blogs/324/
Заполнение табличных частей документов в восьмерке (внешние обработки) http://infostart.ru/blogs/345/
Обработка для тестирования внешних обработок изменения табличных частей http://infostart.ru/projects/1749/
Использование свойств объектов при доработке типовых конфигураций http://infostart.ru/blogs/692/
В рамках развития типовых конфигураций в сторону CRM-систем в конфигурациях появился почтовый клиент. Возникает желание использовать его для рассылки печатных форм документов. Штатные средства такого не позволяют.

Попробуем устранить рассмотренное упущение. Код можно добавить в саму конфигурацию или использовать технологию внешних печатных форм http://infostart.ru/articles/157/?ref=4246 .

Для начала нам нужно получить табличный документ с подготовленной печатной формой. К сожалению, воспользоваться методом Печать() документа не получится. Если в конфигурации разрешены изменения, то можно добавить ключевое слово Экспорт функциям, которые непосредственно формируют печатные формы. Если такой возможности нет, придется копировать алгоритм формирования печатной формы в свою обработку.

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

ИмяФайла = "Счет #" + Шапка.Номер + " от " + Формат(Шапка.Дата, "ДЛФ=D");
ИмяФайлаПолное = "" + КаталогВременныхФайлов() + ИмяФайла + ".mxl";
ТабДокумент.Записать(ИмяФайлаПолное);
	
СтруктураФайла = Новый Структура;
СтруктураФайла.Вставить("ИмяФайла", ИмяФайла + ".mxl");
СтруктураФайла.Вставить("Наименование", ИмяФайла);
СтруктураФайла.Вставить("Хранилище", Новый ДвоичныеДанные(ИмяФайлаПолное));
	
СписокФайловВложений = Новый СписокЗначений;
СписокФайловВложений.Добавить(СтруктураФайла);
	
Кому = Новый СписокЗначений;
Кому.Добавить(ОпределитьАдресПолучателя(Шапка.Получатель), Шапка.Получатель.НаименованиеПолное);
	
СтруктураНовогоПисьма = Новый Структура;
СтруктураНовогоПисьма.Вставить("СписокФайловВложений", СписокФайловВложений);
СтруктураНовогоПисьма.Вставить("Тема", ИмяФайла);
СтруктураНовогоПисьма.Вставить("Кому", Кому);
	
СтруктураВозврата = НаписатьПисьмо(глТекущийПользователь, СтруктураНовогоПисьма,,,,,,, Ложь);
СтруктураВозврата.Форма.Открыть();
	
Возврат Неопределено;
 


Недостатком такого способа является то, что пользователь может проконтролировать печатную форму только после того, как письмо создано и записано. Это связано с ограничениями функция НаписатьПисьмо().

Второй способ. В обработке добавить форму, на которой разместить ТабличныйДокумент и кнопку "Отправить". В этом случае, пользователь видит печатную форму и только потом принимает решение об отправке ее в письме. В функции формирования печатной формы пишем:

Форма = ЭтотОбъект.ПолучитьФорму();
ТабДокумент = Форма.ЭлементыФормы.ПолеТабличногоДокумента;

// Здесь алгоритм формирования печатной формы

Форма.Открыть();

Возврат Неопределено;


В модуле формы пишем:

Процедура КнопкаОтправитьНажатие(Кнопка)
	
	ИмяФайла = "Счет #" + СсылкаНаОбъект.Номер + " от " + Формат(СсылкаНаОбъект.Дата, "ДЛФ=D");
	ИмяФайлаПолное = "" + КаталогВременныхФайлов() + ИмяФайла + ".mxl";
	ЭлементыФормы.ПолеТабличногоДокумента.Записать(ИмяФайлаПолное);
	
	СтруктураФайла = Новый Структура;
	СтруктураФайла.Вставить("ИмяФайла", ИмяФайла + ".mxl");
	СтруктураФайла.Вставить("Наименование", ИмяФайла);
	СтруктураФайла.Вставить("Хранилище", Новый ДвоичныеДанные(ИмяФайлаПолное));
	
	СписокФайловВложений = Новый СписокЗначений;
	СписокФайловВложений.Добавить(СтруктураФайла);
	
	Кому = Новый СписокЗначений;
	Кому.Добавить(ОпределитьАдресПолучателя(СсылкаНаОбъект.Контрагент), СсылкаНаОбъект.Контрагент.НаименованиеПолное);
	
	СтруктураНовогоПисьма = Новый Структура;
	СтруктураНовогоПисьма.Вставить("СписокФайловВложений", СписокФайловВложений);
	СтруктураНовогоПисьма.Вставить("Тема", ИмяФайла);
	СтруктураНовогоПисьма.Вставить("Кому", Кому);
	
	СтруктураВозврата = НаписатьПисьмо(глТекущийПользователь, СтруктураНовогоПисьма,,,,,,, Ложь);
	СтруктураВозврата.Форма.Открыть();
	УдалитьФайлы(ИмяФайлаПолное);
	
	ЭтаФорма.Закрыть();
	
КонецПроцедуры


Третий способ. Без использования дополнительной формы.
Как и в первом случае используем функцию НаписатьПисьмо() и обходим ее ограничения.

ИмяФайла = "Счет #" + Шапка.Номер + " от " + Формат(Шапка.Дата, "ДЛФ=D");
ИмяФайлаПолное = "" + КаталогВременныхФайлов() + ИмяФайла + ".mxl";
ТабДокумент.Записать(ИмяФайлаПолное);

Кому = Новый СписокЗначений;
Кому.Добавить(ОпределитьАдресПолучателя(Шапка.Получатель), Шапка.Получатель.НаименованиеПолное);

СтруктураНовогоПисьма = Новый Структура;
СтруктураНовогоПисьма.Вставить("Тема", ИмяФайла);
СтруктураНовогоПисьма.Вставить("Кому", Кому);

СтруктураВозврата = НаписатьПисьмо(глТекущийПользователь, СтруктураНовогоПисьма,,,,,,, Истина);

ВложенияПисьма = СтруктураВозврата.Форма.ВложенияПисьмаТЗ;
НовоеВложение = ВложенияПисьма.Добавить();
НовоеВложение.ИмяФайла = ИмяФайла + ".mxl";
НовоеВложение.Наименование = ИмяФайла;
НовоеВложение.Данные = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайлаПолное), Новый СжатиеДанных());
УдалитьФайлы(ИмяФайлаПолное);

Возврат Неопределено;

В рассмотренном случае пользователь получает готовое письмо, которое еще не записано. Он может посмотреть печатную форму и принять решение об отправке письма.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Сhe Burashka (CheBurator) 09.04.07 11:20
Да, как однако все непросто...
в 7.7 - решается в полпинка.. программить вообще ничего не надо.
Решение для 7.7 смотрим здесь: http://www.infostart.ru/projects/316/?ref=174
[BEST] МАЛЕНЬКИЙ ШЕДЕВР 1.2 Мгновенная отправка по почте ЛЮБОЙ печатной формы БЕЗ ИЗМЕНЕНИЯ КОДА
2. Drock (d.snissarenko) 03.05.07 08:21
НУ почему сразу програмить, все достаточно быстро, я при переходе решал проблему, в течении часа ковыряния конфигурации, пришел к следующему , была сделана дополнительная обработка по формированию печатной формы документа, ее сохранению и формированию письма, практически все было сделано с помощью Ctrl+C -> Ctrl+V
3. Дмитрий Корнев (santa0) 29.03.16 23:18
Почему не работает следующая конструкция:

	СтруктураНовогоПисьма.Вставить("Кому", СписокПолучателей);
	СтруктураНовогоПисьма.Вставить("Копии", "info@domen.ru");


Не ставится КОПИЯ.

Подскажите, пожалуйста!