Автоматическое уведомление клиентов по электронной почте в программе 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    108556    121    5    

96

SALE! 20%

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

Полнофункциональное расширение (ранее известное как Модуль 1С-ЕГАИС) для взаимодействия типовых конфигураций 1С и ЕГАИС, предоставляющее максимум возможностей по работе с УТМ. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

8970 7176 руб.

15.12.2015    170828    956    364    

400

SALE! 20%

Загрузка и выгрузка в Excel Оптовая торговля Печатные формы Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 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С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

6000 5100 руб.

09.11.2016    234226    1062    898    

1003

SALE! 10%

Перенос данных 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

55778 50200 руб.

24.04.2015    194971    150    243    

280

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

Универсальная конфигурация Хамелеон Меркурий для взаимодействия с системой Меркурий (тестовый+рабочий+демо контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше. Основное отличие от других решений - работа через веб-интерфейс и API 2.0(API 2.1). Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом Меркурий, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе Меркурий и наоборот.

44000 руб.

08.11.2017    122961    292    140    

398

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

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

30000 руб.

02.11.2015    112307    102    87    

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