1s Формирование отчетов комитенту (рассылка по email)

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

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


Процедура ОсновныеДействияФормыОтправитьПоЭлектроннойПочте(Кнопка)
	ПомеченныеСтроки = ТаблицаКонтрагентов.НайтиСтроки(Новый Структура("Отправить", Истина));
	ИспользуемКомОбъект = Истина;
	
	ОшибкиПриОтправке = Ложь;
	
	Попытка
		Outlook = Новый ComОбъект("Outlook.Application");
	Исключение
		Сообщить("Не возможно подключится к MS Outlook без вмешательства пользователя");
		ИспользуемКомОбъект = Ложь;
	КонецПопытки;
	
	Если ПомеченныеСтроки.Количество() > 0 Тогда
		ЭлементыФормы.ИндикаторСозданияДокументов.Видимость = Истина;
		ЭлементыФормы.ИндикаторСозданияДокументов.МинимальноеЗначение = 0;
		ЭлементыФормы.ИндикаторСозданияДокументов.МаксимальноеЗначение = ПомеченныеСтроки.Количество();
	КонецЕсли;
	
	Для Каждого Стр Из ПомеченныеСтроки Цикл
		Если ЗначениеЗаполнено(Стр.Документ) И ЗначениеЗаполнено(Стр.АдресЭлектроннойПочты) Тогда
			ДокОб = Стр.Документ.ПолучитьОбъект();
			Если ДокОб > Неопределено Тогда
				
				ТемаПисьма = ?(ЗначениеЗаполнено(ЗаголовокПочтовогоСообщения), 
									ЗаголовокПочтовогоСообщения, 
									"отчет агента за " + МесяцСтрока + " (просьба подтвердить)");
				ТелоПисьма = ?(ЗначениеЗаполнено(ТекстПочтовогоСообщения), 
									ТекстПочтовогоСообщения, 
									"Добрый день." + Символы.ПС + "Отправляю Вам отчет агента. Просьба проверить, подписать, поставить печать и скан отчета отправить обратно.");
									
				Если ОтправлятьОтчетКомитентуОПродажах Тогда
					ТабДок = ДокОб.ПолучитьТабличныйДокументАктаОГостиничныхУслугахКлиент(ДокОб.Ссылка, Ложь, Истина);
					ИмяТемпФайла = ПолучитьИмяВременногоФайла("xls");
					
					Попытка
						ТабДок.Записать(ИмяТемпФайла ,ТипФайлаТабличногоДокумента.XLS);
					Исключение
						СообщитьОбОшибке(ОписаниеОшибки(),, "Не удалось прикрепить в почтовое сообщение прикрепить отчет комитенту " + Стр.Документ.Контрагент + "Документ " + Стр.Документ + ". Не сформировался файл Excel.");
						ОшибкиПриОтправке = Истина;
						Прервать;
					КонецПопытки;
				КонецЕсли;
				
				Если ОтправлятьАкт И ЗначениеЗаполнено(Стр.Статус) И Стр.Статус > Перечисления.СтатусыДокументов.ОтправленНаСогласование Тогда
					ТабДокПечатьАкта = ДокОб.ПечатьАкта(Истина);
					ИмяТемпФайлаПечатьАкта = ПолучитьИмяВременногоФайла("xls");
					
					Попытка
						ТабДокПечатьАкта.Записать(ИмяТемпФайлаПечатьАкта ,ТипФайлаТабличногоДокумента.XLS);
					Исключение
						СообщитьОбОшибке(ОписаниеОшибки(),, "Не удалось прикрепить в почтовое сообщение прикрепить акт " + Стр.Документ.Контрагент + "Документ " + Стр.Документ + ". Не сформировался файл Excel.");
						ОшибкиПриОтправке = Истина;
						Прервать;
					КонецПопытки;
				КонецЕсли;
				
				Если ОтправлятьСчетНаОплатуПокупателю Тогда
					ПрикреплятьСчетНаОплатуПокупателю = Ложь;
					Если ЗначениеЗаполнено(Стр.СчетНаОплатуПокупателю) Тогда
						ДокОбСчетНаОплатуПокупателю = Стр.СчетНаОплатуПокупателю.ПолучитьОбъект();
						Если ДокОбСчетНаОплатуПокупателю > Неопределено Тогда 
							ТабДокСчетНаОплатуПокупателю = ДокОбСчетНаОплатуПокупателю.ПечатьСчетаЗаказаКорректировки("СчетЗаказ", Истина);
							ИмяТемпФайлаСчетНаОплатуПокупателю = ПолучитьИмяВременногоФайла("xls");
							
							Попытка
								ТабДокСчетНаОплатуПокупателю.Записать(ИмяТемпФайлаСчетНаОплатуПокупателю ,ТипФайлаТабличногоДокумента.XLS);
								ПрикреплятьСчетНаОплатуПокупателю = Истина;
							Исключение
								СообщитьОбОшибке(ОписаниеОшибки(),, "Не удалось в почтовое сообщение прикрепить счет " + Стр.Документ.Контрагент + "Документ " + Стр.Документ + ". Не сформировался файл Excel.");
								ПрикреплятьСчетНаОплатуПокупателю = Ложь;
							КонецПопытки;
							
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
				
				Если ОтправлятьСчетФактураВыданный Тогда
					ПрикреплятьСчетФактураВыданный = Ложь;
					
					//сч.фактуру отправлять только когда согласован
					Если ЗначениеЗаполнено(Стр.СчетФактураВыданный) И ЗначениеЗаполнено(Стр.Статус) И Стр.Статус = Перечисления.СтатусыДокументов.Согласован Тогда
						ДокОбСчетФактураВыданный = Стр.СчетФактураВыданный.ПолучитьОбъект();
						Если ДокОбСчетФактураВыданный > Неопределено Тогда 
							
							ДанныеДляПечати = ПолучитьДанныеДляПечатиСчФ(ДокОбСчетФактураВыданный, ДокОб);
							ТабДокСчетФактураВыданный = ДокОбСчетФактураВыданный.ПечатьСчетаФактуры(ДанныеДляПечати, "СчетФактура", Истина);
							ИмяТемпФайлаСчетФактураВыданный = ПолучитьИмяВременногоФайла("xls");
							
							Попытка
								ТабДокСчетФактураВыданный.Записать(ИмяТемпФайлаСчетФактураВыданный ,ТипФайлаТабличногоДокумента.XLS);
								ПрикреплятьСчетФактураВыданный = Истина;
							Исключение
								СообщитьОбОшибке(ОписаниеОшибки(),, "Не удалось в почтовое сообщение прикрепить счет фактуру " + Стр.Документ.Контрагент + "Документ " + Стр.Документ + ". Не сформировался файл Excel.");
								ПрикреплятьСчетФактураВыданный = Ложь;
							КонецПопытки;
							
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
				
				Если ИспользуемКомОбъект Тогда
					Письмо = Outlook.CreateItem(0);
					Письмо.Subject = ТемаПисьма;
					Письмо.Body = ТелоПисьма;
					Если ОтправлятьОтчетКомитентуОПродажах Тогда
						Письмо.Attachments.Add(ИмяТемпФайла);
					КонецЕсли;
					Если ОтправлятьАкт И ЗначениеЗаполнено(Стр.Статус) И Стр.Статус > Перечисления.СтатусыДокументов.ОтправленНаСогласование Тогда
						Письмо.Attachments.Add(ИмяТемпФайлаПечатьАкта);
					КонецЕсли;
					Если ОтправлятьСчетНаОплатуПокупателю Тогда
						Если ПрикреплятьСчетНаОплатуПокупателю Тогда
							Письмо.Attachments.Add(ИмяТемпФайлаСчетНаОплатуПокупателю);
						КонецЕсли;
					КонецЕсли;
					Если ОтправлятьСчетФактураВыданный Тогда
						Если ПрикреплятьСчетФактураВыданный Тогда
							Письмо.Attachments.Add(ИмяТемпФайлаСчетФактураВыданный);
						КонецЕсли;
					КонецЕсли;
					
					
					Письмо.To = Стр.АдресЭлектроннойПочты;
					
					Попытка
						Письмо.Send();
					Исключение
						СообщитьОбОшибке(ОписаниеОшибки(),, "Не удалось отправить почтовое сообщение " + Стр.Документ.Контрагент + "Документ " + Стр.Документ);
						ОшибкиПриОтправке = Истина;
						Прервать;
					КонецПопытки;
					
					Если Стр.Статус > Перечисления.СтатусыДокументов.Выполнен Тогда
						Статусы = РегистрыСведений.СтатусыДокументов.СоздатьНаборЗаписей();
						Статусы.Отбор.Документ.Установить(Стр.Документ);
						Статусы.Прочитать();
						Если Статусы.Количество() > 0 Тогда
							Для Каждого СтрСтатусы Из Статусы Цикл
								СтрСтатусы.ТекущийСтатус = ?(Стр.Статус > Перечисления.СтатусыДокументов.Согласован, Перечисления.СтатусыДокументов.ОтправленНаСогласование, Перечисления.СтатусыДокументов.Выполнен);
							КонецЦикла;
						Иначе
							НовСтрСтатусы = Статусы.Добавить();
							НовСтрСтатусы.Документ = Стр.Документ;
							НовСтрСтатусы.ТекущийСтатус = ?(Стр.Статус > Перечисления.СтатусыДокументов.Согласован, Перечисления.СтатусыДокументов.ОтправленНаСогласование, Перечисления.СтатусыДокументов.Выполнен);
						КонецЕсли;
						Статусы.Записать();
						Стр.Статус = ?(Стр.Статус > Перечисления.СтатусыДокументов.Согласован, Перечисления.СтатусыДокументов.ОтправленНаСогласование, Перечисления.СтатусыДокументов.Выполнен);
						Стр.СтатусДоРедактирования = Стр.Статус;
					КонецЕсли;
					
				Иначе
					Сообщение = Новый ПочтовоеСообщение;
					Сообщение.Тема = ТемаПисьма;
					Сообщение.Текст = ТелоПисьма;
					Если ОтправлятьОтчетКомитентуОПродажах Тогда
						Сообщение.Вложения.Добавить(ИмяТемпФайла);
					КонецЕсли;
					Если ОтправлятьАкт И ЗначениеЗаполнено(Стр.Статус) И Стр.Статус > Перечисления.СтатусыДокументов.ОтправленНаСогласование Тогда
						Сообщение.Вложения.Добавить(ИмяТемпФайлаПечатьАкта);
					КонецЕсли;
					Если ОтправлятьСчетНаОплатуПокупателю Тогда
						Если ПрикреплятьСчетНаОплатуПокупателю Тогда
							Сообщение.Вложения.Добавить(ИмяТемпФайлаСчетНаОплатуПокупателю);
						КонецЕсли;
					КонецЕсли;
					Если ОтправлятьСчетФактураВыданный Тогда
						Если ПрикреплятьСчетФактураВыданный Тогда
							Сообщение.Вложения.Добавить(ИмяТемпФайлаСчетФактураВыданный);
						КонецЕсли;
					КонецЕсли;
					
					
					Сообщение.Получатели.Добавить(Стр.АдресЭлектроннойПочты);
					Почта = Новый Почта;
					Попытка
						Почта.Подключиться();
						Почта.Послать(Сообщение);
						Почта.Отключиться();
						
					Исключение
						СообщитьОбОшибке(ОписаниеОшибки(),, "Не удалось установить подключение к основной почтовой программе операционной системы.");
						ОшибкиПриОтправке = Истина;
						Прервать;
					КонецПопытки;
					
					Если Стр.Статус > Перечисления.СтатусыДокументов.Выполнен Тогда
						Статусы = РегистрыСведений.СтатусыДокументов.СоздатьНаборЗаписей();
						Статусы.Отбор.Документ.Установить(Стр.Документ);
						Статусы.Прочитать();
						Если Статусы.Количество() > 0 Тогда
							Для Каждого СтрСтатусы Из Статусы Цикл
								СтрСтатусы.ТекущийСтатус = ?(Стр.Статус > Перечисления.СтатусыДокументов.Согласован, Перечисления.СтатусыДокументов.ОтправленНаСогласование, Перечисления.СтатусыДокументов.Выполнен);
							КонецЦикла;
						Иначе
							НовСтрСтатусы = Статусы.Добавить();
							НовСтрСтатусы.Документ = Стр.Документ;
							НовСтрСтатусы.ТекущийСтатус = ?(Стр.Статус > Перечисления.СтатусыДокументов.Согласован, Перечисления.СтатусыДокументов.ОтправленНаСогласование, Перечисления.СтатусыДокументов.Выполнен);
						КонецЕсли;
						Статусы.Записать();
						
						Стр.Статус = ?(Стр.Статус > Перечисления.СтатусыДокументов.Согласован, Перечисления.СтатусыДокументов.ОтправленНаСогласование, Перечисления.СтатусыДокументов.Выполнен);
						Стр.СтатусДоРедактирования = Стр.Статус;
					КонецЕсли;
					
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
		ЭлементыФормы.ИндикаторСозданияДокументов.Значение = ЭлементыФормы.ИндикаторСозданияДокументов.Значение + 1;
	КонецЦикла;
	ЭлементыФормы.ИндикаторСозданияДокументов.Видимость = Ложь;
	Сообщить("Отправлено"+?(ОшибкиПриОтправке, "с ошибками...", "!"));
КонецПроцедуры