gifts2017

Как отправить по почте НЕтиповой документ, используя стандартные средства БП 3.0

Опубликовал Ирина Удачливая (config) в раздел Программирование - Практика программирования

После работы с отладчиком в 23-х Общих модулях в поисках того, как же формируется тема, отправитель и тело письма, было принято решение поделиться найденными строчками кода с коллегами в надежде на то, что это поможет сократить их время при работе с похожей задачей.

Отправка сообщения

Тот, кто будет создавать новый документ в Бухгалтерии 3.0 и поставит перед собой цель отправлять его печатные формы по электронной почте, столкнется с задачей: при отправке нетипового документа в форме "Отправка почтового сообщения" поля Кому, Тема и Тело письма пустые, когда как в типовом варианте отправка сообщения выглядит намного красивее. Почему?

Сравнение отправки письма

Дело в том, что типовой варинант отработает только если в вашем документе есть реквизит "Организация" с типом значения СправочникСсылка.Организации и реквизит "Контрагент" с типом значений СправочникСсылка.Контрагенты/Организации/ФизическиеЛица. Если есть реквизиты, названные по-другому, к примеру, "Клиент", "Поставщик", "Партнер" и пр., то будет постоянно появляться пустая форма отправки письма, и все нужно добавлять вручную каждый раз.

Как сделать так, чтобы форма отправки письма заполнялась?

1.В общих командах, в "ОтправитьПоЭлектроннойПочте" выбираем наш документ в "ТипПараметраКоманды".

ОтправитьПоЭлектроннойПочте

2. В модуле менеджера нашего нового документа (в моем примере это Коммерческое предложение) необходимо добавить команды отправки. Идентификаторы должны быть такие же, как в процедуре Печать().

// Заполняет список команд отправки по электронной почте.
// 
// Параметры:
//   КомандыОтправки - ТаблицаЗначений - состав полей см. в функции ОтправкаПочтовыхСообщений.КомандыОтправки
//
Процедура ДобавитьКомандыОтправки(КомандыОтправки) Экспорт
	
	// Коммерческое предложение
	КомандаОтправки = КомандыОтправки.Добавить();
	КомандаОтправки.Идентификатор               = "ПечатьКоммерческогоПредложения";
	КомандаОтправки.Представление               = НСтр("ru='Коммерческое предложение'");
	КомандаОтправки.Порядок                     = 10;
	
	// Коммерческое предложение для крупного клиента
	КомандаОтправки = КомандыОтправки.Добавить();
	КомандаОтправки.Идентификатор               = "ПечатьКоммерческогоПредложенияДляКК";
	КомандаОтправки.Представление               = НСтр("ru='Коммерческое предложение для крупного клиента'");
	КомандаОтправки.Порядок                     = 20;
	
КонецПроцедуры

3.В процедуре, которая возвращает ТабличныйДокумент, непосредственно перед Возврат ТабДок, нужно вставить следующее:

// В табличном документе зададим имя области, в которую был 
 // выведен объект. Нужно для возможности печати покомплектно.
 УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДокумент, 
 НомерСтрокиНачало, ОбъектыПечати, МассивОбъектов);
 
 
 Возврат ТабДокумент;

Параметр НомерСтрокиНачало нужно получить раньше, после создания ТабличногоДокумента

НомерСтрокиНачало = ТабДокумент.ВысотаТаблицы + 1;

4. Идем в общий модуль "ОтправкаПочтовыхСообщений", в процедуре "ЗаполнитьТемуТелоПисьма" видим, как получаются ОрганизацияПоПисьму и КонтрагентПоПисьму

СтруктураТиповОбъектыПечати = РазложитьСписокПоТипамОбъектов(МассивОбъектов);
ОписаниеДопустимыхТиповКонтрагента = ОписаниеТиповИзСтроки("Контрагенты, Организации, ФизическиеЛица");
	
ОрганизацияПоПисьму = ПолучитьЗначениеОбщегоРеквизита(СтруктураТиповОбъектыПечати, "Организация", ОписаниеТиповИзСтроки("Организации"));
КонтрагентПоПисьму  = ПолучитьЗначениеОбщегоРеквизита(СтруктураТиповОбъектыПечати, "Контрагент",  ОписаниеДопустимыхТиповКонтрагента);

Тут-то и понимаем, что нам доступны только реквизиты "Организация" и "Контрагент" с видами справочников Организации, Контрагенты и ФизическиеЛица.

Остается в этом месте добавить наши реквизиты. и далее все будет заполняться очень красиво. Например, добавим реквизит "Клиент" типа СправочникСсылка.Клиенты

СтруктураТиповОбъектыПечати = РазложитьСписокПоТипамОбъектов(МассивОбъектов);
ОписаниеДопустимыхТиповКонтрагента = ОписаниеТиповИзСтроки("Контрагенты, Организации, ФизическиеЛица");
    
ОрганизацияПоПисьму = ПолучитьЗначениеОбщегоРеквизита(СтруктураТиповОбъектыПечати, "Организация", ОписаниеТиповИзСтроки("Организации"));
КонтрагентПоПисьму  = ПолучитьЗначениеОбщегоРеквизита(СтруктураТиповОбъектыПечати, "Контрагент",  ОписаниеДопустимыхТиповКонтрагента);

//08.02.2016 старт
Если ТипЗнч(МассивОбъектов[0]) = Тип("ДокументСсылка.КоммерческоеПредложение") Тогда
    КонтрагентПоПисьму  = ПолучитьЗначениеОбщегоРеквизита(СтруктураТиповОбъектыПечати, "Клиент",  ОписаниеТиповИзСтроки("Клиенты"));
КонецЕсли;
//конец

См. также

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

Комментарии

1. Xer shi (Xershi) 08.02.16 21:31
Может просто стоит клиента записать в заголовке, а имя оставить контрагент?
Если заказчик хочет видеть типовой справочник названный по другому, не нужно переименовывать справочник или реквизит, достаточно поменять синоним или заголовок у ярлыка.
2. TMV 12.02.16 08:09
Не в тему, но все же отмечу. Отличный пример, как НЕ нужно подписывать вносимые изменения:

08.02.2016 старт
Если ТипЗнч(МассивОбъектов[0]) = Тип("ДокументСсылка.КоммерческоеПредложение") Тогда
КонтрагентПоПисьму = ПолучитьЗначениеОбщегоРеквизита(СтруктураТиповОбъектыПечати, "Клиент", ОписаниеТиповИзСтроки("Клиенты"));
КонецЕсли;
конец
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа