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

В рамках развития типовых конфигураций в сторону CRM-систем в конфигурациях появился почтовый клиент. Возникает желание использовать его для рассылки печатных форм документов. Штатные средства такого не позволяют. (Оригинал:http://infostart.ru/blogs/161/

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

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

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

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

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


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

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

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

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

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

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


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

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


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

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

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

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

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

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

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

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