Автоматическое уведомление клиентов по электронной почте в программе 1С: УВС

12.04.19

Функциональные - Документооборот и делопроизводство (СЭД)

В данной статье предлагается внешняя обработка для конфигурации 1С: Управление ветеринарными сертификатами, выполняющая автоматическую рассылку писем по электронной почте клиентам компании, с целью уведомления о сформированных ветеринарно-сопроводительных документах.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
UVSEMailClientsNotification
.epf 8,37Kb ver:1.0.0.1
1
1 Скачать (1 SM) Купить за 1 850 руб.

В данной статье я хочу предложить полезную обработку для отраслевой конфигурации 1С: Управление Ветеринарными Сертификатами (УВС). Назначение предлагаемой обработки - автоматическая рассылка писем по электронной почте клиентам компании, с целью уведомления о сформированных ветеринарно-сопроводительных документов (ВСД).

Для кого будет полезна данная статья? Во-первых, для всех, кому приходится работать с программой 1С: УВС. Во-вторых, всем кому интересен вопрос формирования и отправки электронных писем средствами библиотеки БСП, с прикреплением к ним печатных форм. Также в статье рассмотрен вопрос реализации регламентного задания через внешнюю обработку.

Автоматизация уведомления клиентов - довольно распространенная задача, которую часто приходится решать, в том числе и 1С программистам, в контексте различных типовых и не очень конфигураций. Ниже представлен один из вариантов решения.

Представим себе ситуацию, когда некая компания, занимающаяся оптовой торговлей, поставляет своим клиентам продукты питания. Часть из них, как известно, подлежит ветеринарно-санитарному контролю (экспертизе). В соответствии с этим клиенты хотят получать ВСД, причем как можно раньше. Получать ВСД вместе с привезенной продукцией не всегда и не всех устраивает. В некоторых ситуациях чем раньше получены ВСД, тем клиенту лучше. Операторы при отгрузке продукции оформляют в программе УВС документы Транспортная операция, на основе которых рассматривается заявка о возможности и правомерности осуществления перевозки продукции. В случае одобрения заявки в программе автоматически формируются ВСД, доступные пользователю на закладке ВСД формы документа Транспортная операция. Для документа ВСД в конфигурации УВС реализовано несколько печатных форм. Наиболее подходящая нам - "Штрих-коды ВСД с дополнительной информацией" - она формирует т.н. форму 4 ветеринарной справки. Её и будем печатать и прикреплять в письму. Правда она содержит не штрих-код а QR-код - но мы на это не будем обращать внимание.

Сформулируем задачу в терминах понятных и близких 1С разработчикам: требуется реализовать регламентное задание на основе внешней обработки для автоматического уведомления клиента о сформированных ВСД, в виде электронного письма, с прикрепленными листами ВСД. Используем мы для всего этого конечно же БСП, которая хоть и частично, но все-таки встроена в конфигурацию УВС. 

Решение:

0) Настраиваем системную учетную запись, которую мы и мы будем использовать для отправки писем.

1) В справочнике ВидыКонтактнойИнформации добавляем новый элемент "EMail" в группу "Контактная информация справочника "Хозяйствующие субъекты"". В этом поле мы будем хранить адрес электронной почты контрагента. Заполняем для тех контрагентов, кому нужно отправлять уведомления.

2) Реализуем внешнюю обработку, в модуле объекта которой как обычно реализуем функцию СведенияОВнешнейОбработке:

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    ПараметрыРегистрации.Вид				= ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка(); 
    ПараметрыРегистрации.Версия 			= "1.0.0.1";
	ПараметрыРегистрации.Наименование		= "ОтправкаУведомленияКонтрагентамПоЭлПочте";
	ПараметрыРегистрации.БезопасныйРежим 	= ЛОЖЬ;
	ПараметрыРегистрации.Информация			= "Обработка отправляет контрагентам уведомление по эл. почте по факту успешно обработанной заявки (док. ТраснпортнаяОперация)";
	
	НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = НСтр("ru = 'Отправка уведомления контрагентам по эл. почте'");
    НоваяКоманда.Идентификатор = "ОтправкаУведомленияКонтрагентамПоЭлПочте";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(); 
	
	Возврат ПараметрыРегистрации;

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

Также мы реализуем процедуру ВыполнитьКоманду, которая и будет вызываться по расписанию нашего регламентного задания:

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт
  Если ИдентификаторКоманды = "ОтправкаУведомленияКонтрагентамПоЭлПочте" Тогда
	  ВыполнитьОтправкуУведомлений();
  КонецЕсли;
КонецПроцедуры

Процедура ВыполнитьОтправкуУведомлений будет реализована в этом же модуле, к её реализации мы вернемся несколько позже.

3) Размышляем на тему того, как мы будем запоминать для каких ВСД уведомления уже отправлены, а для каких надо отправлять. Потому что 2 раза одну и туже одобренную заявку отправлять не нужно. Если бы в УВС была реализована подсистема Свойства из БСП, то и вопросов бы не было - лично я добавил бы в документ ВСД дополнительный булевый реквизит УведомлениеОтправлено. Но так как в версии УВС 2.0.8.1 БСП внедрена не полностью и именно подсистемы Свойства в программе нет - придется выдумывать что-то другое. "Вскрывать" и дорабатывать типовую конфигурацию я не люблю, но в данном случае, возможно, это наиболее простой способ. Я предлагаю добавить в конфигурацию регистр сведений, который позволит нам "помнить" для каких ВСД мы уже отправили уведомление (не периодический, без регистратора).
 

4) Собственно сам алгоритм анализа ситуации с заявками и отправки уведомлений. Схема предельно простая: запросом получаем все необходимые данные, обрабатывая их формируем и отправляем письма.

Процедура ВыполнитьПоискНужныхДокументов() Экспорт
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
	               |	КонтрагентыКонтактнаяИнформация.Ссылка КАК Контрагент,
	               |	КонтрагентыКонтактнаяИнформация.АдресЭП КАК АдресЭП
	               |ПОМЕСТИТЬ ВТ_Контрагенты
	               |ИЗ
	               |	Справочник.Контрагенты.КонтактнаяИнформация КАК КонтрагентыКонтактнаяИнформация
	               |ГДЕ
	               |	НЕ КонтрагентыКонтактнаяИнформация.Ссылка.ПометкаУдаления
	               |	И КонтрагентыКонтактнаяИнформация.АдресЭП <> """"
	               |	И КонтрагентыКонтактнаяИнформация.Тип = &ТипКИЭлПочта
	               |	И КонтрагентыКонтактнаяИнформация.Вид = &ВидКИЭлПочта
	               |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ
	               |	ТранспортныеОперации.Ссылка КАК Документ,
	               |	ТранспортныеОперации.КонтрагентПолучатель КАК Контрагент,
	               |	ТранспортныеОперации.ПредприятиеПолучатель КАК Предприятие,
	               |	ТаблицаСтатусДокумента.Статус КАК Статус
	               |ПОМЕСТИТЬ ВТ_Документы
	               |ИЗ
	               |	Документ.ТранспортныеОперации КАК ТранспортныеОперации
	               |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЖурналРегистрацииСостоянийЗаявокНаОформлениеОпераций.СрезПоследних(, ДокументСсылка ССЫЛКА Документ.ТранспортныеОперации) КАК ТаблицаСтатусДокумента
	               |		ПО (ТаблицаСтатусДокумента.ДокументСсылка = ТранспортныеОперации.Ссылка)
	               |ГДЕ
	               |	ТранспортныеОперации.Дата >= &Дата
	               |	И ТранспортныеОперации.КонтрагентПолучатель В
	               |			(ВЫБРАТЬ
	               |				ВТ_Контрагенты.Контрагент
	               |			ИЗ
	               |				ВТ_Контрагенты КАК ВТ_Контрагенты)
	               |	И ТаблицаСтатусДокумента.Статус = &Статус
	               |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ
	               |	ВТ_Документы.Документ КАК Документ,
	               |	ВТ_Документы.Контрагент КАК Контрагент,
	               |	ВТ_Документы.Предприятие КАК Предприятие,
	               |	ВТ_Документы.Статус КАК Статус,
	               |	ВТ_Контрагенты.АдресЭП КАК АдресЭП
	               |ПОМЕСТИТЬ ВТ_ДокументыСАдресомЭлПочты
	               |ИЗ
	               |	ВТ_Документы КАК ВТ_Документы
	               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Контрагенты КАК ВТ_Контрагенты
	               |		ПО ВТ_Документы.Контрагент = ВТ_Контрагенты.Контрагент
	               |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ
	               |	ВТ_ДокументыСАдресомЭлПочты.Документ КАК Документ,
	               |	ВТ_ДокументыСАдресомЭлПочты.Контрагент КАК Контрагент,
	               |	ВТ_ДокументыСАдресомЭлПочты.Предприятие КАК Предприятие,
	               |	ВТ_ДокументыСАдресомЭлПочты.Статус КАК Статус,
	               |	ВТ_ДокументыСАдресомЭлПочты.АдресЭП КАК АдресЭП
	               |ПОМЕСТИТЬ ВТ_НеотправленныеДанные
	               |ИЗ
	               |	ВТ_ДокументыСАдресомЭлПочты КАК ВТ_ДокументыСАдресомЭлПочты
	               |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СтатусУведомленияКонтрагентаОЗаявке КАК СтатусУведомленияКонтрагентаОЗаявке
	               |		ПО ВТ_ДокументыСАдресомЭлПочты.Документ = СтатусУведомленияКонтрагентаОЗаявке.Документ
	               |			И ВТ_ДокументыСАдресомЭлПочты.Контрагент = СтатусУведомленияКонтрагентаОЗаявке.Контрагент
	               |ГДЕ
	               |	СтатусУведомленияКонтрагентаОЗаявке.Дата ЕСТЬ NULL
	               |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ
	               |	ВТ_НеотправленныеДанные.Документ КАК Документ,
	               |	ВТ_НеотправленныеДанные.Документ.Номер КАК НомерДокумента,
	               |	ВТ_НеотправленныеДанные.Документ.Дата КАК ДатаДокумента,
	               |	ВТ_НеотправленныеДанные.Документ.НомерТТН КАК НомерТТН,
	               |	ВТ_НеотправленныеДанные.Документ.ДатаТТН КАК ДатаТТН,
	               |	ВТ_НеотправленныеДанные.Документ.СерияТТН КАК СерияТТН,
	               |	ВТ_НеотправленныеДанные.Контрагент КАК Контрагент,
	               |	ВТ_НеотправленныеДанные.Контрагент.Наименование КАК НаименованиеКонтрагента,
	               |	ВТ_НеотправленныеДанные.Документ.КонтрагентОтправитель.Наименование КАК НаименованиеКонтрагентаОтправителя,
	               |	ВТ_НеотправленныеДанные.Предприятие КАК Предприятие,
	               |	ВТ_НеотправленныеДанные.Статус КАК Статус,
	               |	ВТ_НеотправленныеДанные.АдресЭП КАК АдресЭП
	               |ИЗ
	               |	ВТ_НеотправленныеДанные КАК ВТ_НеотправленныеДанные
	               |ИТОГИ ПО
	               |	Контрагент,
	               |	АдресЭП
	               |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ
	               |	ТранспортныеОперацииТаблицаВСД.ВСД КАК ВСД,
	               |	ТранспортныеОперацииТаблицаВСД.ВСД.Номер КАК НомерВСД,
	               |	ТранспортныеОперацииТаблицаВСД.ВСД.Дата КАК ДатаВСД,
	               |	ТранспортныеОперацииТаблицаВСД.Ссылка КАК Документ
	               |ИЗ
	               |	Документ.ТранспортныеОперации.ТаблицаВСД КАК ТранспортныеОперацииТаблицаВСД
	               |ГДЕ
	               |	ТранспортныеОперацииТаблицаВСД.Ссылка В
	               |			(ВЫБРАТЬ
	               |				ВТ_НеотправленныеДанные.Документ КАК Документ
	               |			ИЗ
	               |				ВТ_НеотправленныеДанные КАК ВТ_НеотправленныеДанные)
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	Документ,
	               |	ВСД";

	Запрос.УстановитьПараметр("Дата", 			НачалоДня(ТекущаяДата()));
	Запрос.УстановитьПараметр("Статус", 		Справочники.СтатусыЗаявок.УспешноОбработана);	
	Запрос.УстановитьПараметр("ВидКИЭлПочта", 	Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("EMail"));
	Запрос.УстановитьПараметр("ТипКИЭлПочта", 	Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);

	РезПакет = Запрос.ВыполнитьПакет();
	
	времУчЗаписьЭлПочты = Справочники.УчетныеЗаписиЭлектроннойПочты.СистемнаяУчетнаяЗаписьЭлектроннойПочты;
	времТекДата			= ТекущаяДата();
	
	ВыборкаКонтрагентов = РезПакет[4].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
	ТЗ_ВСД = РезПакет[5].Выгрузить();
	
	Пока ВыборкаКонтрагентов.Следующий() Цикл

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

						ЗаписьЖурналаРегистрации(
							"ОтправкаУведомленияОбУспешнойОбработкиЗаявки.Подготовка",
							УровеньЖурналаРегистрации.Информация,
							,
							,
							времОписание);

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

					Исключение
						Если ТранзакцияАктивна() Тогда
							ОтменитьТранзакцию();
						КонецЕсли;
						ВызватьИсключение;
					КонецПопытки;
					
					Если ТранзакцияАктивна() Тогда
						ЗафиксироватьТранзакцию();
					КонецЕсли;
						
				КонецЕсли;
				//Если времМассивВСД.Количество() > 0 Тогда
				
			КонецЦикла;

		КонецЦикла;
		
	КонецЦикла;

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

Код и алгоритм запроса в комментариях не нуждается. Для удобства отладки механизма я использую запись в журнал регистрации. А вот процедура ОтправитьЭлектронноеПисьмоУведомления более интересная, хотя бы потому что именно в ней происходит формирование электронных писем.

Функция ОтправитьЭлектронноеПисьмоУведомления(УчЗаписьЭлПочты, ДанныеОЗаявке, ИдентификаторПочтовогоСообщения, МассивВСД)

	УведомлениеОтправлено = ЛОЖЬ;
	
	// Массив временных файлов, который нужно будет обязательно
	// удалить в конце работы данного алгоритма
	МассивУдаляемыхФайлов = Новый Массив;

	Попытка

		массивВложений = Новый Массив;
		//   * Вложения - Массив - файлы, которые необходимо приложить к письму (описания в виде структур):
		//     ** Представление - Строка - имя файла вложения;
		//     ** АдресВоВременномХранилище - Строка - адрес двоичных данных вложения во временном хранилище.
		//     ** Кодировка - Строка - кодировка вложения (используется, если отличается от кодировки письма).
		//     ** Идентификатор - Строка - (необязательный) используется для отметки картинок, отображаемых в теле письма.

		темаПисьма = "Успешно обработана заявка № " + СТРОКА(ДанныеОЗаявке.НомерДокумента) + " от " + СТРОКА(ДанныеОЗаявке.ДатаДокумента);

		телоПисьма = темаПисьма + "." + СИМВОЛЫ.ПС;

		// Поместим прикрепленные к транспортной операции документы ВСД в массив
		массивДокументовВСД = Новый Массив;
		
		// Имеет смысл отправлять письмо, только если для данной транспортной
		// операции найдены ВСД
		Если МассивВСД.Количество() > 0 Тогда
			телоПисьма = телоПисьма + СИМВОЛЫ.ПС + СИМВОЛЫ.ПС + "Список ВСД:";
			
			Для Каждого стрВСД ИЗ МассивВСД Цикл
				массивДокументовВСД.Добавить(стрВСД.ВСД);
				телоПисьма = телоПисьма + СИМВОЛЫ.ПС + "    " + СТРОКА(стрВСД.НомерВСД) + " от " + СТРОКА(стрВСД.ДатаВСД);
			КонецЦикла;
			
			// Сформируем табличный документ для всех ВСД привязаных к текущей транспортной операции
			ТабДокВСД = Документы.ВСД.СформироватьПечатнуюФормуСжатогоВСДСИнформацией(массивДокументовВСД, Неопределено);
			// Получаем путь временного файла на диске
			ВремФайлНаДиске = ПолучитьИмяВременногоФайла("pdf");
			// Сохраним табличный документ во временный файл
			ТабДокВСД.Записать(ВремФайлНаДиске, ТипФайлаТабличногоДокумента.PDF);	
			// Добавляем временный файл в массив удаляемых файлов
			МассивУдаляемыхФайлов.Добавить(ВремФайлНаДиске);
			
			// Помещаем сохраненный временный файл во временное хранилище
			ДвоичныеДанные = Новый ДвоичныеДанные(ВремФайлНаДиске);
			Идентификатор  = Новый УникальныйИдентификатор;	
			АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, Идентификатор);

			// Формируем вложение для нашего письма
			времВложение = Новый Структура("Представление,АдресВоВременномХранилище,Кодировка,Идентификатор");
			времВложение.Представление				= "ВСД " + Строка(ДанныеОЗаявке.НомерДокумента) + ".pdf";
			времВложение.АдресВоВременномХранилище	= АдресВоВременномХранилище;
			//времВложение.Кодировка
			//времВложение.Идентификатор

			массивВложений.Добавить(времВложение);
			
		КонецЕсли;

		телоПисьма = телоПисьма + СИМВОЛЫ.ПС + СИМВОЛЫ.ПС
			+ "С уважением," + СИМВОЛЫ.ПС 
			+ "  Некто";

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

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

		времПараметрыПисьма = Новый Структура();	
		времПараметрыПисьма.Вставить("Кому", 						ДанныеОЗаявке.АдресЭП);
		времПараметрыПисьма.Вставить("ПолучателиСообщения",			времПолучателиСообщения);
		//времПараметрыПисьма.Вставить("Копии",						времКопии);
		времПараметрыПисьма.Вставить("Тема",						темаПисьма);
		времПараметрыПисьма.Вставить("Тело",						телоПисьма);
		времПараметрыПисьма.Вставить("Важность",					ВажностьИнтернетПочтовогоСообщения.Обычная);
		времПараметрыПисьма.Вставить("АдресОтвета",					времАдресаОтвета);
		времПараметрыПисьма.Вставить("УведомитьОДоставке",			ЛОЖЬ); // ИСТИНА);
		времПараметрыПисьма.Вставить("УведомитьОПрочтении",			ЛОЖЬ); // ИСТИНА);
		времПараметрыПисьма.Вставить("ТипТекста",					Перечисления.ТипыТекстовЭлектронныхПисем.ПростойТекст);

		// Вложения
		Если массивВложений.Количество() > 0 Тогда
			времПараметрыПисьма.Вставить("Вложения", массивВложений);
		КонецЕсли;
		
		ИдентификаторПочтовогоСообщения = РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(УчЗаписьЭлПочты, времПараметрыПисьма);

		ЗаписьЖурналаРегистрации(
			"ОтправкаУведомленияОбУспешнойОбработкиЗаявки.ОтправкаЭлПисьма",
			УровеньЖурналаРегистрации.Информация,
			,
			,
			"Электронное письмо успешно отправлено");

		УведомлениеОтправлено = ИСТИНА;

	Исключение

		ЗаписьЖурналаРегистрации(
			"ОтправкаУведомленияОбУспешнойОбработкиЗаявки.ОтправкаЭлПисьма",
			УровеньЖурналаРегистрации.Ошибка,
			,
			,
			"Ошибка при отправке электронного письма: " + СТРОКА(ОписаниеОшибки()));

	КонецПопытки;
	
	// Удаляем временные файлы
	Для Каждого фл ИЗ МассивУдаляемыхФайлов Цикл 
		УдалитьФайлы(фл);
	КонецЦикла;
	
	Возврат УведомлениеОтправлено;

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


// Запись в регистр сведений СтатусУведомленияКонтрагентаОЗаявке факта отправки
// уведомления об обработанной заявке
Процедура ЗаписатьФактОтправкиУведомленияВРегСведений(Дата, Контрагент, Документ, Описание, АдресЭлПочты)
	
	НаборЗаписей = РегистрыСведений.СтатусУведомленияКонтрагентаОЗаявке.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Документ.Установить(Документ);
	НаборЗаписей.Отбор.Контрагент.Установить(Контрагент);
	НаборЗаписей.Прочитать();
	НаборЗаписей.Записать();
	
	новЗап = НаборЗаписей.Добавить();
	новЗап.Документ			= Документ;
	новЗап.Контрагент		= Контрагент;	
	новЗап.Дата				= Дата;
	новЗап.Описание			= Описание;
	новЗап.АдресЭлПочты		= АдресЭлПочты;
			
	НаборЗаписей.Записать();
	
	ЗаписьЖурналаРегистрации(
		"ОтправкаУведомленияОбУспешнойОбработкиЗаявки.ЗаписьВРегистрСтатусовУведомлений",
		УровеньЖурналаРегистрации.Ошибка,
		,
		,
		"Добавлена запись в регистр СтатусУведомленияКонтрагентаОЗаявке");
	
КонецПроцедуры

Как видно код данной процедуры "заправлен" достаточным количество комментариев. При использовании процедуры ОтправитьПочтовоеСообщение модуля РаботаСПочтовымиСообщениями советую тщательно изучить описание её параметров.

Процедура ЗаписатьФактОтправкиУведомленияВРегСведений создает запись в регистре сведений СтатусУведомленияКонтрагентаОЗаявке. Приводить её код я не стану, потому что это это распространенная типовая задача.

Далее требуется добавить нашу ВО в программу, указав для неё возможность запуска по расписанию и определив само расписание. После этого, как говорится, все должно работать. Буду рад, если кому то мое творчество принесет пользу. 

Все это было протестировано и успешно работает на версии УВС 2.0.8.1 в клиент-серверном варианте работы программы. Благодарю за внимание! Буду благодарен за ваши комментарии, отзывы и советы.

УВС уведомление клиентов пользователей регламентные задания электронная почта

См. также

Бухгалтер Пользователь Руководитель проекта Платформа 1С v8.3 Управленческий учет Платные (руб)

Организуйте правильный оборот документов на вашем предприятии в 1С. Ведение учета и хранения документов. Управление потоками документации между подразделениями. Работа с договорами в компании. Автоматизация процессов подготовки, согласования и подписания документов. Сократите время и объем ошибок с 1С:ДО!

48500 руб.

19.02.2016    109808    134    5    

104

Оптовая торговля Производство готовой продукции (работ, услуг) Обмен с ГосИС Программист Бухгалтер Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Оптовая торговля, дистрибуция, логистика Пищевая промышленность Россия Бухгалтерский учет Платные (руб)

Автоматический обмен данными с системой ФГИС Меркурий из 1С через ВетИС API: загрузка данных по хозяйствующим субъектам, предприятиям; типов, групп, видов, наименований продукции, сопоставление данных и запись их в базу данных; создание на основании расходных документов транспортных партий, отправка на сервер, печать полученных ветеринарных свидетельств, запрос остатков складского журнала, проведение инвентаризаций, оформление производственных партий.

11500 руб.

08.12.2017    106091    291    110    

147

Оптовая торговля Розничная торговля Обмен с ГосИС Бухгалтер Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)

Автоматизация учета ЕГАИС в 1С для оптовой торговли, производства и импорта. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

828 руб.

15.12.2015    172696    864    370    

407

Бизнес-аналитик Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет Налоговый учет Управленческий учет Платные (руб)

Прикладное решение «1С:Комплексная автоматизация 2» позволяет построить современную систему учета с высокой степенью детализации затрат, определить показатели управления и ответственности пользователей в рамках единого информационного пространства.

83000 руб.

19.02.2016    83211    112    0    

110

SALE! 15%

Загрузка и выгрузка в Excel Оптовая торговля Печатные формы Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 1C:Бухгалтерия 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С. Забудьте о ручном вводе: загружайте документы из Excel в 1С за секунды! Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С.

6000 руб.

09.11.2016    242349    1115    908    

1045

Оптовая торговля Розничная торговля Пользователь Платформа 1С v8.3 Оперативный учет Управляемые формы 1С:Управление торговлей 10 1С:Розница 2 Россия Управленческий учет Платные (руб)

Подсистема призвана упростить и автоматизировать процесс расчета и начисления бонусов покупателей. Бонусная система работает с конфигурациями только 1С:УТ 10.3. Механизм реализован в начале 2013г. и работает до сих пор более 100 клиентов по РФ.

250000 руб.

02.11.2015    113867    6    89    

187
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Spectr512 07.11.22 16:31 Сейчас в теме
Здраствуйте подскажите такой момент, Функция ОтправитьЭлектронноеПисьмоУведомления это команда кнопки и выполняется на клиенте или же это функция на выполняется на сервере?
2. Астиг 19 09.11.22 09:08 Сейчас в теме
Добрый день! Дело давно было и я уже если честно не помню. А под рукой нет даже копии базы, чтобы можно было посмотреть код обработки. Точно помню, что реализовано в виде внешней обработки, которая средствами БСП работает как регламентное задание. Думаю что скорее всего это код который выполняется на сервере.
3. Spectr512 09.11.22 13:51 Сейчас в теме
(2) Спасибо большое, многое беру из ваших записей кода, практически многое понятно как и что работает, да и для начинающих это прям мана божественная как примерно реализовывать. У меня другой вопрос вы делает запрос с многими ВТ и потом делаете Запрос.Пакет. У меня другая ситуация у меня обычно запрос и мне нужно получить таблицу а не 1ую строку как мне это сделать в цикле?
Оставьте свое сообщение