Как заставить Общий модуль УправлениеЭлектроннойПочтой вставлять электронный адрес Контрагента из документа?

Версия для печатиPDF-версия

Если отправлять письмо из ФормыЭлемена Контрагента, то все отлично. В Кому вписывается адрес из представления Адрес электронной почты контрагента для обмена электронными документами. Причем отлично работает как на встроенном клиенте, так и на внешнем (outlook) Если нужно отправить письмо из документа, то тут проблема. Пустое поля. Прошарил инет: есть способ, который подходит для УП 10.3, но не подходит для нас, т.к у нас своя форма печати, в ней процедура:


Процедура ДействияФормыОтправитьПоEmail(Кнопка)
РасширениеФайла = "";
ТипПересылаемогоФайла = Неопределено;
Если Кнопка.Имя = "ОтправитьКакMXL" Тогда
ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.MXL;
РасширениеФайла = ".mxl";
ИначеЕсли Кнопка.Имя = "ОтправитьКакHTML" Тогда
ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.HTML;
РасширениеФайла = ".html";
ИначеЕсли Кнопка.Имя = "ОтправитьКакXLS" Тогда
ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.XLS97;
РасширениеФайла = ".xls";
ИначеЕсли Кнопка.Имя = "ОтправитьКакPDF" Тогда
ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.PDF;
РасширениеФайла = ".pdf";
Иначе
Возврат;
КонецЕсли; 

НаименованиеПечатнойФормы = СтрЗаменить(ОбъектПредставление,".","_");
// сохраним ПФ во временный каталог
ИмяФайлаСообщения = КаталогВременныхФайлов() + НаименованиеПечатнойФормы + РасширениеФайла;
Если ТипЗнч(ТипПересылаемогоФайла) = Тип("ТипФайлаТабличногоДокумента") Тогда
ЭлементыФормы.ТабличныйДокумент.Записать(ИмяФайлаСообщения, ТипПересылаемогоФайла);
КонецЕсли;

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

Все великолепно работает, кроме вышеописанной проблемки. Поковыряв, своими неопытными рученками нашел где формируется адрес: Общий модуль УправлениеЭлектроннойПочтой:


// Функция определяет адрес электронной почты объекта
//
// Параметры
//  Объект - СправочникСсылка, для которого необходимо определить адрес электронной почты
//
Функция ОпределитьАдресПолучателя(Объект) Экспорт

Запрос = Новый Запрос;

Запрос.УстановитьПараметр("Объект", Объект);
Запрос.УстановитьПараметр("Тип"   , Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);

Запрос.Текст = "
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| КонтактнаяИнформация.Представление,
| КонтактнаяИнформация.ЗначениеПоУмолчанию
|ИЗ
| РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
|ГДЕ
| КонтактнаяИнформация.Объект = &Объект
| И
| КонтактнаяИнформация.Тип = &Тип
|";

Адрес = "";
ТаблицаЗапроса = Запрос.Выполнить().Выгрузить();
ТаблицаЗапроса.Индексы.Добавить("ЗначениеПоУмолчанию");
Если ТаблицаЗапроса.Количество() > 0 Тогда
СтрокаПоУмолчанию = ТаблицаЗапроса.Найти(Истина, "ЗначениеПоУмолчанию");
Если СтрокаПоУмолчанию <> Неопределено Тогда
Адрес = СтрокаПоУмолчанию.Представление;
Иначе
Адрес = ТаблицаЗапроса[0].Представление;
КонецЕсли; 
КонецЕсли;

Возврат Адрес;

КонецФункции

Пожалуйста, помогите, изменить запрос так, чтобы вписывался адрес электронки текущего Контрагента из заказа покупателя. И если возможно, и из РеализацииТоваровУслуг. А если возможно, то Ваще из любого документа имеющего Контрагента.

С запросом всё в порядке. Ничего в нём менять не надо. Достаточно немного изменить код вашей процедуры.

Перед строкой

Если НЕ Константы.ИспользованиеВстроенногоПочтовогоКлиента.Получить() Тогда

добавить следующий код:

АдресКонтрагента = УправлениеЭлектроннойПочтой.ОпределитьАдресПолучателя(Контрагент);

Перед вызовом функции УправлениеЭлектроннойПочтой.ОткрытьПисьмоПочтовогоКлиентаОперационнойСистемы добавить код:

СтруктураПараметров.Вставить("Адрес", АдресКонтрагента);

Перед вызовом функции УправлениеЭлектроннойПочтой.НаписатьПисьмо добавить код:

Кому = Новый СписокЗначений;
Кому.Добавить(АдресКонтрагента, АдресКонтрагента);
СтруктураНовогоПисьма.Вставить("Кому", Кому);
Не сработало.
 
Насколько я понял из-за того, что в общей форме ПечатьДокументов нет привязки к контрагенту.
 
В ней в табличной части открывается (например счет).
 
Она не знает, кто контрагент.
 
На сколько я понял, нужно открывать ее и указывать ей кто контрагент. Например брать его наименование из макета, что открыт.
В макете контрагент выражен так: <ТекстПокупатель> <ПредставлениеПолучателя>
 
Простите, если пишу полную чушь.
 
На всякий, прилагаю код всей формы ПечатьДокументов.
 
 

 



///////////////////////////////////////////////////////////////////////////////
// ПЕРЕМЕННЫЕ МОДУЛЯ
Перем Объект Экспорт;						// Объект, который печатается
Перем ОбъектПредставление Экспорт;			// Представление объекта. Используется для формирования заголовка, имен сохраняемых файлов и т.п. Если не задано, то будет построено по "Объект"
Перем ДополнительноКПредставлению Экспорт;	// Строка, которая будет выведена дополнительно в конец заголовка формы
Перем Принтеры;								// Список установленных в системе принтеров
Перем ИмяТекПринтера;						// Имя принтера (как оно установлено в системе) на который будет осуществляться вывод


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ

Функция ПолучитьПредставление(Объект)
	
	//+CRM 
	Если Объект = Неопределено Тогда
		Возврат "";
	КонецЕсли;
	//-CRM 
	
	// Определим тип переданного нам объекта (для всех "объектов" получим ссылки на них)
	Попытка
		ТипЗнчОбъекта = ТипЗнч(Объект.Ссылка);
	Исключение
		ТипЗнчОбъекта = ТипЗнч(Объект);
	КонецПопытки;
	
	// Определим представление в зависмоти от типа переданного нам объекта
	Представление = "";
	Если Документы.ТипВсеСсылки().СодержитТип(ТипЗнчОбъекта) Тогда
		Представление = дкПолучитьПредставление(Объект);
	ИначеЕсли Справочники.ТипВсеСсылки().СодержитТип(ТипЗнчОбъекта) Тогда
		Представление = Объект.Метаданные().Синоним;
	КонецЕсли;
	
	Возврат Представление;
КонецФункции

// Приводит произвольную строку к идентификатору, который затем можно использовать как ключ структуры
// Преобразование выполняется разрушающим способом (обратное преобразование невозможно)
Функция обСтрокуКID(Стр) Экспорт
	Ст=обСтрокаПоМаске(Стр,"_0123456789
	                       |ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
	                       |АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдеёжзийклмнопрстуфхцчшщьыъэюя");
	Возврат ?(Найти("0123456789",Лев(Ст,1))>0,"_"+Ст,Ст);
КонецФункции // обСтрокуКID()

// Функция возвращает строку символов, полученную из исходной <Стр> GOAN
// заменой всех символов, не входящих в <Маска> на символ <Симв>
Функция обСтрокаПоМаске(Стр,Маска="",Симв="") Экспорт
	Ст=""; Если ПустаяСтрока(Маска) Тогда Возврат Ст; КонецЕсли;
	Для Сч=1 По СтрДлина(Стр) Цикл
		Сим=Сред(Стр,Сч,1);
		Если Найти(Маска,Сим)>0 Тогда Ст=Ст+Сим; Иначе Ст=Ст+Симв; КонецЕсли; 
	КонецЦикла;
	Возврат Ст;
КонецФункции // обСтрокаПоМаске

// Возвращает представление для документа
// Параметры
// ЭтотОбъект - <ДокументСсылка> или <ДокументОбъект>
// АльтернативноеНазвание - Строка, используется, если хотим заменить синоним документа 
// Возвращаемое значение:
// Строка - Строка представления документа
Функция дкПолучитьПредставление(ЭтотОбъект, АльтернативноеНазвание = "") Экспорт
	Попытка
		ТекстПредставления=?(ПустаяСтрока(АльтернативноеНазвание), ЭтотОбъект.Метаданные().Синоним, АльтернативноеНазвание)+" № "+СокрЛП(ЭтотОбъект.Номер)+" от "+Формат(ЭтотОбъект.Дата,"ДФ=dd.MM.yyyy");
	Исключение 
		ТекстПредставления="Неправильный тип объекта!";
	КонецПопытки;
	Возврат ТекстПредставления;
КонецФункции // ПолучитьПредставление()

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ДЕЙСТВИЯ КОМАНДНЫХ ПАНЕЛЕЙ ФОРМЫ

// Процедура отправляет отчет по электронной почте в виде табличного документа mxl
Процедура ДействияФормыОтправитьПоEmail(Кнопка)
	РасширениеФайла = "";
	ТипПересылаемогоФайла = Неопределено;
	Если Кнопка.Имя = "ОтправитьКакMXL" Тогда
		ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.MXL;
		РасширениеФайла = ".mxl";
	ИначеЕсли Кнопка.Имя = "ОтправитьКакHTML" Тогда
		ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.HTML;
		РасширениеФайла = ".html";
	ИначеЕсли Кнопка.Имя = "ОтправитьКакXLS" Тогда
		ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.XLS97;
		РасширениеФайла = ".xls";
	ИначеЕсли Кнопка.Имя = "ОтправитьКакPDF" Тогда
		ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.PDF;
		РасширениеФайла = ".pdf";
	Иначе
		Возврат;
	КонецЕсли; 
	НаименованиеПечатнойФормы = СтрЗаменить(ОбъектПредставление,".","_");
	
	// сохраним ПФ во временный каталог
	ИмяФайлаСообщения = КаталогВременныхФайлов() + НаименованиеПечатнойФормы + РасширениеФайла;
	Если ТипЗнч(ТипПересылаемогоФайла) = Тип("ТипФайлаТабличногоДокумента") Тогда
		ЭлементыФормы.ТабличныйДокумент.Записать(ИмяФайлаСообщения, ТипПересылаемогоФайла);
	КонецЕсли;
	//
	//+CRM
	Если НЕ Константы.ИспользованиеВстроенногоПочтовогоКлиента.Получить() Тогда
		
		СтруктураПараметров = Новый Структура();
		СтруктураПараметров.Вставить("Тема", НаименованиеПечатнойФормы);
		
		УправлениеЭлектроннойПочтой.ОткрытьПисьмоПочтовогоКлиентаОперационнойСистемы(СтруктураПараметров);

	Иначе
		
		СтруктураНовогоПисьма = Новый Структура();
		СтруктураНовогоПисьма.Вставить("Тема",НаименованиеПечатнойФормы);
		
		СтруктураПисьма = УправлениеЭлектроннойПочтой.НаписатьПисьмо(глЗначениеПеременной("глТекущийПользователь"), СтруктураНовогоПисьма,,,,,,);
		Если СтруктураПисьма = Неопределено Тогда
			Возврат
		КонецЕсли;
		ВложенияПисьмаТЗ = СтруктураПисьма.Форма.ВложенияПисьмаТЗ.Добавить();
		Файл = Новый Файл(ИмяФайлаСообщения);
		ВложенияПисьмаТЗ.ИмяФайла = Файл.Имя;
		ВложенияПисьмаТЗ.Наименование = ОбъектПредставление;
		Попытка
			ВложенияПисьмаТЗ.Данные = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайлаСообщения), Новый СжатиеДанных);
		Исключение
			ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки());
		КонецПопытки;
		УдалитьФайлы(ИмяФайлаСообщения);
	КонецЕсли; 
    //-CRM
		
КонецПроцедуры	//	ДействияФормыОтправитьПоEmail()

// Процедура сохраняет табличный документ в формате MXL под введенным пользователем именем файла
Процедура ДействияФормыСохранитьКакMXL(Кнопка)
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.Заголовок		= "Сохранение табличного документа";
	Диалог.Фильтр			= "Табличный документ (*.mxl)|*.mxl";
	Диалог.Расширение		= "mxl";
	Диалог.ПолноеИмяФайла	= СтрЗаменить(ОбъектПредставление,".","_");
	Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),"ОсновнойКаталогФайлов");
	Если Диалог.Выбрать() Тогда
		Если НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла) Тогда
			ЭлементыФормы.ТабличныйДокумент.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.MXL);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

// Процедура сохраняет табличный документ в формате HTML под введенным пользователем именем файла
Процедура ДействияФормыСохранитьКакHTML(Кнопка)
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.Заголовок		= "Сохранение веб-страницы";
	Диалог.Фильтр			= "Веб-страница (*.html)|*.html";
	Диалог.Расширение		= "html";
	Диалог.ПолноеИмяФайла	= СтрЗаменить(ОбъектПредставление,".","_");
	Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),"ОсновнойКаталогФайлов");	
	Если Диалог.Выбрать() Тогда
		Если НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла) Тогда
			ЭлементыФормы.ТабличныйДокумент.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.HTML);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры	//	ДействияФормыСохранитьКакHTML()

Процедура ДействияФормыСохранитьКакXLS(Кнопка)
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.Заголовок		= "Сохранение документа Excel";
	Диалог.Фильтр			= "Документ Excel (*.xls)|*.xls";
	Диалог.Расширение		= "xls";
	Диалог.ПолноеИмяФайла	= СтрЗаменить(ОбъектПредставление,".","_");
	Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),"ОсновнойКаталогФайлов");	
	Если Диалог.Выбрать() Тогда
		Если НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла) Тогда
			ЭлементыФормы.ТабличныйДокумент.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLS97);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

// Процедура сохраняет табличный документ в формате PDF под введенным пользователем именем файла
Процедура ДействияФормыСохранитьКакPDF(Кнопка)
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.Заголовок		= "Сохранение документа PDF";
	Диалог.Фильтр			= "Документ PDF (*.pdf)|*.pdf";
	Диалог.Расширение		= "pdf";
	Диалог.ПолноеИмяФайла	= СтрЗаменить(ОбъектПредставление,".","_");
	Диалог.Каталог = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),"ОсновнойКаталогФайлов");	
	Если Диалог.Выбрать() Тогда
		Если НЕ ПустаяСтрока(Диалог.ПолноеИмяФайла) Тогда
			ЭлементыФормы.ТабличныйДокумент.Записать(Диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.PDF);
		КонецЕсли;
	КонецЕсли;
КонецПроцедуры

// Процедура печатает табличный документ на выбраном принтере
Процедура ОсновныеДействияФормыПечать(Кнопка)
	ЭлементыФормы.ТабличныйДокумент.ИмяПринтера = ИмяТекПринтера;
	ЭкземпляровНаСтранице=0;//обПраво("КоличествоСтраницНаЛисте",глПрава);
	Если ЭкземпляровНаСтранице<>0 И ЭкземпляровНаСтранице<>1 И ЭкземпляровНаСтранице<>2 Тогда
		ЭкземпляровНаСтранице=0;
	КонецЕсли; 
	ЭлементыФормы.ТабличныйДокумент.ЭкземпляровНаСтранице=ЭкземпляровНаСтранице;
	ЭлементыФормы.ТабличныйДокумент.Напечатать(НЕ ПустаяСтрока(ИмяТекПринтера));
	ЧислоКопий = ЭлементыФормы.ТабличныйДокумент.КоличествоЭкземпляров;
КонецПроцедуры

// Получает список принтеров установленных в системе и предлагает пользователю
// выбрать принтер для печати
Процедура ОсновныеДействияФормыСписокПринтеров(Кнопка)
	// Посмотрим был ли ранее составлен список принтеров, которые установлены в системе, если нет, тогда попытаемся получить его
	Если ТипЗнч(Принтеры) <> Тип("СписокЗначений") Тогда
		Принтеры = Новый СписокЗначений;
		Состояние("Составляется список принтеров. Подождите.");
		Попытка
			Locator = Новый COMОбъект("WbemScripting.SWbemLocator");
			Сервисы = Locator.ConnectServer(".");
			Объекты = Сервисы.InstancesOf("Win32_Printer");
			
			// Теперь переберем все принтеры системы
			Для каждого Принтер из Объекты Цикл
				ИмяПринтера = Принтер.Name;
				Пока Найти(ИмяПринтера,"\") > 0 Цикл
					ИмяПринтера = Сред(ИмяПринтера, Найти(ИмяПринтера,"\")+1);
				КонецЦикла;
				ИмяПринтера = СокрЛП(ИмяПринтера);
				
				Принтеры.Добавить(Принтер.Name,ИмяПринтера,(Принтер.Name=ИмяТекПринтера));
			КонецЦикла;
		Исключение
		КонецПопытки;
		Принтеры.Вставить(0,"ДиалогВыбораПринтера","Диалог выбора принтера",ПустаяСтрока(ИмяТекПринтера));
		Состояние();
	КонецЕсли; 
	
	// Предложим пользователю выбрать один из принтеров
	Результат = ВыбратьИзМеню(Принтеры,ЭлементыФормы.кнВспомогательная);
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	// Установим пометку у "текушего" принтера в списке
	Принтеры.ЗаполнитьПометки(ЛОЖЬ);
	Результат.Пометка = ИСТИНА;
	
	// Обработаем результат выбора
	ИмяТекПринтера = ?(Результат.Значение = "ДиалогВыбораПринтера","",Результат.Значение);
	ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Печать.Текст = "Печать"+?(ПустаяСтрока(ИмяТекПринтера),""," на <"+Результат.Представление+">");
	
	// Передвинем вспомогательную кнопку
	СтараяШирина = ЭлементыФормы.кнВспомогательная.Ширина;
	ЭлементыФормы.кнВспомогательная.Заголовок	= "";
	ЭлементыФормы.кнВспомогательная.Ширина		= 10;
	ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево - 1; // необходимо чтобы установилать "автоширина" кнопки
	ЭлементыФормы.кнВспомогательная.Заголовок = ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Печать.Текст;
	ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево + 1; // необходимо чтобы установилать "автоширина" кнопки
	ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево - (ЭлементыФормы.кнВспомогательная.Ширина - СтараяШирина);
	
	// Напечатаем
	ОсновныеДействияФормыПечать(Неопределено);
КонецПроцедуры

// Открывает окно "Предварительный просмотр"
Процедура ОсновныеДействияФормыПредварительныйПросмотр(Кнопка)
	ТекущийЭлемент	= ЭлементыФормы.ТабличныйДокумент;
	
	// Произведем эмуляцию нажатия клавишь. По ходу дела это единственный способ открыть окно просмотра печати
	WHSShell = Новый COMОбъект("WScript.Shell");
	WHSShell.SendKeys("%");
	WHSShell.SendKeys("~");
	WHSShell.SendKeys("{DOWN 10}");
	WHSShell.SendKeys("~");
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ, ВЫЗЫВАЕМЫЕ ИЗ ЭЛЕМЕНТОВ ФОРМЫ

Процедура ЧислоКопийПриИзменении(Элемент)
	ЭлементыФормы.ТабличныйДокумент.КоличествоЭкземпляров = ЧислоКопий;
КонецПроцедуры


////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ

Процедура ПриОткрытии()
	// Сформеруем заголовок формы
	Если ПустаяСтрока(ОбъектПредставление) Тогда
		ОбъектПредставление = ПолучитьПредставление(Объект);
	КонецЕсли;
	Заголовок = "Печать <" + ОбъектПредставление + "> " + ДополнительноКПредставлению;
	
	// Восстановим ранее сохраненные настройки
	//ИмяСохраненияПараметров = "ПечатнаяФормаДокументов_" + обСтрокуКID(СтрЗаменить(ОбъектПредставление," ","_")) + "_" + обСтрокуКID(СтрЗаменить(ДополнительноКПредставлению," ","_"));
	//ЭлементыФормы.ТабличныйДокумент.ИмяПараметровПечати = ИмяСохраненияПараметров;
	ЧислоКопий = ЭлементыФормы.ТабличныйДокумент.КоличествоЭкземпляров;
	
	// "Вспомним" о том, на каком принтере в последний раз печатали
	ИмяТекПринтера = ЭлементыФормы.ТабличныйДокумент.ИмяПринтера;
	ПредставлениеТекПринтера = ИмяТекПринтера;
	Пока Найти(ПредставлениеТекПринтера,"\") > 0 Цикл
		ПредставлениеТекПринтера = Сред(ПредставлениеТекПринтера, Найти(ПредставлениеТекПринтера,"\")+1);
	КонецЦикла;
	ПредставлениеТекПринтера = СокрЛП(ПредставлениеТекПринтера);

	// Допишем имя текущего принтера к кнопке "Печать" и подготовим вспомогательную кнопку
	ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Печать.Текст = "Печать" + ?(ПустаяСтрока(ИмяТекПринтера),""," на <"+ПредставлениеТекПринтера+">");
	ЭлементыФормы.кнВспомогательная.Заголовок = ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Печать.Текст;
	ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево - 1; // необходимо чтобы установилать "автоширина" кнопки
	ЭлементыФормы.кнВспомогательная.Лево = ЭлементыФормы.кнВспомогательная.Лево + 1 - (ЭлементыФормы.кнВспомогательная.Ширина - 46) + 1;
	
	// Если табличный документ в режиме "Только просмотр", то сделаем серыми несколько кнопок
	ДоступностьКнопок = НЕ ЭлементыФормы.ТабличныйДокумент.ТолькоПросмотр;
//	ЭлементыФормы.ДействияФормы.Кнопки.ОткрытьВExcel   .Доступность	= ДоступностьКнопок;
	ЭлементыФормы.ДействияФормы.Кнопки.СохранитьКакMXL .Доступность	= ДоступностьКнопок;
	ЭлементыФормы.ДействияФормы.Кнопки.СохранитьКакHTML.Доступность	= ДоступностьКнопок;
	Для каждого ТекКнопка Из ЭлементыФормы.ДействияФормы.Кнопки.ОтправитьПоEmail.Кнопки Цикл
		ТекКнопка.Доступность = ДоступностьКнопок;
	КонецЦикла;
КонецПроцедуры




////////////////////////////////////////////////////////////////////////////////
// ИСПОЛНЯЕМАЯ ЧАСТЬ МОДУЛЯ
ОбъектПредставление			= Неопределено;
ДополнительноКПредставлению	= Неопределено;
Принтеры					= Неопределено;

Попробуйте в функцию определения адреса передать Объект.Контрагент.

подсказали на другом форума.

Все заработало:

 

 



Процедура ДействияФормыОтправитьПоEmail(Кнопка)
    РасширениеФайла = "";
    ТипПересылаемогоФайла = Неопределено;
    Если Кнопка.Имя = "ОтправитьКакMXL" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.MXL;
        РасширениеФайла = ".mxl";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакHTML" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.HTML;
        РасширениеФайла = ".html";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакXLS" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.XLS97;
        РасширениеФайла = ".xls";
    ИначеЕсли Кнопка.Имя = "ОтправитьКакPDF" Тогда
        ТипПересылаемогоФайла = ТипФайлаТабличногоДокумента.PDF;
        РасширениеФайла = ".pdf";
    Иначе
        Возврат;
    КонецЕсли; 
    
    
    
    НаименованиеПечатнойФормы = СтрЗаменить(ОбъектПредставление,".","_");
    // сохраним ПФ во временный каталог
    ИмяФайлаСообщения = КаталогВременныхФайлов() + НаименованиеПечатнойФормы + РасширениеФайла;
    Если ТипЗнч(ТипПересылаемогоФайла) = Тип("ТипФайлаТабличногоДокумента") Тогда
        ЭлементыФормы.ТабличныйДокумент.Записать(ИмяФайлаСообщения, ТипПересылаемогоФайла);
    КонецЕсли;
    
    // Flexy
    Адрес = "";
    ЭтоДокумент = ЗначениеЗаполнено(Объект) И Метаданные.Документы.Содержит(Объект.Метаданные());     
    Если ЭтоДокумент И ОбщегоНазначения.ЕстьРеквизитДокумента("Контрагент", Объект.Метаданные()) Тогда
        Адрес = УправлениеЭлектроннойПочтой.ОпределитьАдресПолучателя(Объект.Контрагент);
		
    КонецЕсли;
    //--
    
    Если НЕ Константы.ИспользованиеВстроенногоПочтовогоКлиента.Получить() Тогда
        СтруктураПараметров = Новый Структура();
        СтруктураПараметров.Вставить("Тема", НаименованиеПечатнойФормы);
        
        // Flexy
        СтруктураПараметров.Вставить("Адрес", Адрес);
        //--
        
        УправлениеЭлектроннойПочтой.ОткрытьПисьмоПочтовогоКлиентаОперационнойСистемы(СтруктураПараметров);
    Иначе
        СтруктураНовогоПисьма = Новый Структура();
        СтруктураНовогоПисьма.Вставить("Тема",НаименованиеПечатнойФормы);
        
        // Flexy
        спПолучатели = Новый СписокЗначений;
        спПолучатели.Добавить(Адрес, "Адрес"); 
        СтруктураНовогоПисьма.Вставить("Кому", спПолучатели);
        //--   
        
        СтруктураПисьма = УправлениеЭлектроннойПочтой.НаписатьПисьмо(глЗначениеПеременной("глТекущийПользователь"), СтруктураНовогоПисьма,,,,,,);
        Если СтруктураПисьма = Неопределено Тогда
            Возврат
        КонецЕсли;
        ВложенияПисьмаТЗ = СтруктураПисьма.Форма.ВложенияПисьмаТЗ.Добавить();
        Файл = Новый Файл(ИмяФайлаСообщения);
        ВложенияПисьмаТЗ.ИмяФайла = Файл.Имя;
        ВложенияПисьмаТЗ.Наименование = ОбъектПредставление;
        Попытка
            ВложенияПисьмаТЗ.Данные = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайлаСообщения), Новый СжатиеДанных);
        Исключение
            ОбщегоНазначения.СообщитьОбОшибке(ОписаниеОшибки());
        КонецПопытки;
        УдалитьФайлы(ИмяФайлаСообщения);
    КонецЕсли; 
КонецПроцедуры    //    ДействияФормыОтправитьПоEmail()

В общем-то, я то же самое и предлагал.

Я на самом деле понял идею, просто реализовать самостоятельно - не хватило ни знаний, ни оптыта(((

Подскажите, пожалуйста, а как добавить в отправление копию письма.

С Адресом и Темой - все понятно.

Появилась необходимость отправлять письмо самому себе, где оно будет перемещаться в отправленное правилами обработки почты.

Т.к. POP3 не оставляет отправленных сообщений на почтовом сервере.

Дотаточно будет Копия = "";

Поискал в инете, и удивился, нет нигде инфо...

А как вписать вписать код, для Outlook в мой файл, для передачи файла - не разобрался.


        Outlook=Новый COMОбъект("Outlook.Application");
        ТипФайла="XLS";
        Письмо=Outlook.CreateItem(0);
        Письмо.Subject=ИмяФайлаВложения;
        Письмо.Body=ИмяФайлаВложения;
        ФайлаВложения=КаталогВременныхФайлов()+СтрЗаменить(ИмяФайлаВложения, ".", " ")+"."+ТипФайла;
        Документ.Записать(ФайлаВложения,ТипФайла);
        Письмо.Attachments.Add(ФайлаВложения);
        Попытка
            Письмо.Display();
        Исключение
        КонецПопытки; 

Ковырялся, но дальше чем создать письмо не продвинулся...

Решил, просто посылать копию, только не вручную, Дамочки будут упускать этот момент....

нашел как вручную поставить:

Копии = "адрес@мыло.ru";
 
 
спКипии = Новый СписокЗначений;
спКипии.Добавить(Копии, "Копия");
СтруктураНовогоПисьма.Вставить("Копии", спКипии);
 
Сейчас ищу как одрес организации вставить.
 
 

Также как и адрес контрагента.

Нашел.

Только чему-то не выводится адрес при печати РеализацияТоваровУслуг...

Причем не выводит не адрес контрагента, но адрес организации.

Какой теперь текст процедуры получился?

Все тот же:


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

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

Я пока не совсем понимаю тонкости методанных, и как их использовать.

Смотрите в отладчике, что передаётся в переменную Объект перед открытием формы.

ПС. Грубо говоря, метаданные - это структура конфигурации, к которой можно получить доступ из встроенного языка.

А у Вас есть грамотный урок по работе с отладкой?

Ну, все возможности и как грамотно проводить отладку, чтобы увидеть все, или хотябы нужные процессы, протекающие во время работы.

Все что я смог самостоятельно понять, это как вывести строку трабла, включив: Остановка по ошибке...

Думаю, такой урок даст массу востребованных поисковых фраз...

Приток новичков, таких как я.

Ну а нам (Новичкам) значительная польза в понимании создаваемого.