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

В рамках развития типовых конфигураций в сторону 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-систем в конфигурациях появился почтовый клиент. Возникает желание использовать его для рассылки печатных форм документов. Штатные средства такого не позволяют.

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

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

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

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

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

СписокФайловВложений = Новый СписокЗначений;
СписокФайловВложений.Добавить(СтруктураФайла);

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

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

СтруктураВозврата = НаписатьПисьмо(глТекущийПользователь, СтруктураНовогоПисьма,,,,,,, Ложь);
СтруктураВозврата.Форма.Открыть();

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

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

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

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

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

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

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

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

Процедура КнопкаОтправитьНажатие(Кнопка)

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

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

СписокФайловВложений = Новый СписокЗначений;
СписокФайловВложений.Добавить(СтруктураФайла);

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

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

СтруктураВозврата = НаписатьПисьмо(глТекущийПользователь, СтруктураНовогоПисьма,,,,,,, Ложь);
СтруктураВозврата.Форма.Открыть();
УдалитьФайлы(ИмяФайлаПолное);

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

КонецПроцедуры

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

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

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

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

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

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

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

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

3 Comments

  1. CheBurator

    Да, как однако все непросто…

    в 7.7 — решается в полпинка.. программить вообще ничего не надо.

    Решение для 7.7 смотрим здесь: http://www.infostart.ru/projects/316/?ref=174

    [BEST] МАЛЕНЬКИЙ ШЕДЕВР 1.2 Мгновенная отправка по почте ЛЮБОЙ печатной формы БЕЗ ИЗМЕНЕНИЯ КОДА

    Reply
  2. d.snissarenko

    НУ почему сразу програмить, все достаточно быстро, я при переходе решал проблему, в течении часа ковыряния конфигурации, пришел к следующему , была сделана дополнительная обработка по формированию печатной формы документа, ее сохранению и формированию письма, практически все было сделано с помощью Ctrl+C -> Ctrl+V

    Reply
  3. santa0

    Почему не работает следующая конструкция:

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

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

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

    Reply

Leave a Comment

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