Не работают регламентные задания?

03.04.18

База данных - Инструменты администратора БД

Работают не всегда стабильно. Что делать, как обеспечить стабильную работу пользователей? Качественную и устойчивую работу ИС? Делать контроль выполнения регламентных (фоновых) заданий. Ниже подробные комментарии с фрагментами кода.

1) Перед началом обработки, в которой используются результаты регламентного задания, нужно сделать проверку, что оно уже выполнено. Если проблемное задание не выполнено, прежде нужно запустить его принудительно.

Например обработа выгрузи данных о товарах на кассу (обмен с фронт-офис) может начинаться так:

Процедура ПриОткрытии()
	НачалоПериода = НачалоДня(ТекущаяДата());
	КонецПериода = ТекущаяДата();
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Сообщение.Наименование,
	|	Сообщение.Выполнена,
	|	Сообщение.Дата
	|ИЗ
	|	Задача.Сообщение КАК Сообщение
	|ГДЕ
	|	Сообщение.Дата МЕЖДУ &Дата1 И &Дата2
	|	И Сообщение.ПометкаУдаления = ЛОЖЬ
	|	И Сообщение.Выполнена = ИСТИНА
	|	И Сообщение.ТекстСообщения ПОДОБНО ""%ВвестиПереоценку%""";
	Запрос.УстановитьПараметр("Дата1",НачалоПериода);
	Запрос.УстановитьПараметр("Дата2",КонецПериода);
	//Запрос.УстановитьПараметр("Наименование","ПереоценкаПоОкончанииСкидок");
	РТ = Запрос.Выполнить().Выгрузить();
	Если РТ.Количество() = 0 Тогда
		Попытка
			исРегламентныеЗадания.ВвестиПереоценку();
		Исключение
			Сообщить("Сбой переоцени");
		КонецПопытки;
	КонецЕсли;
...

 

 2) Проблемное задание при выполнении должно сделать отметку о результатах выполнения. Я использую объект конфигурации "задача". Сначала создается задача, которая является маркером, что задание пыталось стартовать. В ТекстСообщения записывается название задачи (то есть имя процедуры регламентного задания) потому, что по этому названию будет искаться задание во время определения состояния базы. В заголовок задачи я пишу данные из регламентного задания, а в тексте - имя процедуры, чтобы легче автоматически судить о характере сбоя. Если есть заголовок, значит все идет по плану и обработка выполнялась в регламенте, если заголовка нет - при попытке восстановления и нужно разбиравться. В процессе обработи тест сообщения дополняется служебными данными и после обработки задача записывается с отметкой о выполнении. Вот так может выглядеть регламентное задание "Переоцена после окончания скидок":

 

Процедура ВвестиПереоценку() Экспорт
	
	тмпПользователь = ПараметрыСеанса.Пользователь;
	ПараметрыСеанса.Пользователь=Справочники.Пользователи.НайтиПоКоду("Робот");
	ПараметрыСеанса.исУправляемаяБлокировка=Ложь;
	
	НовоеСообщениеИдентификаторФоновогоЗадания = СоздатьЗадачуСообщениеИдентификаторФоновогоЗадания();
	ТекстСообщенияИдентификаторФоновогоЗадания = "ВвестиПереоценку";
...
тут собственно создается переоцена и в конце нее :
...
	НовоеСообщениеИдентификаторФоновогоЗадания.ТекстСообщения = НовоеСообщениеИдентификаторФоновогоЗадания.ТекстСообщения +
	ТекстСообщенияИдентификаторФоновогоЗадания + "
	|--
	|Служебная информация " + Новый УникальныйИдентификатор;
	НовоеСообщениеИдентификаторФоновогоЗадания.ВыполнитьЗадачу();
	ПараметрыСеанса.Пользователь = тмпПользователь;
КонецПроцедуры

 

3) В начале рабочего дня, до того, как пользователи приступят к работе, должен быть сделан вывод о необходимости реанимировать информационную систему. Для этого можно использовать запускаемую внешне, например через бат-файл, обработу "Контроль выполнения регламентных заданий".

Процедура ОтправкаСообщенияКонтрольРегламентныхЗаданий() Экспорт

...	
//04	"ПереоценкаПоОкончанииСкидок";
...
//12	"ВыгрузкаФорматов";
...
	НачалоПериода = НачалоДня(ТекущаяДата())-1*24*60*60;
	КонецПериода = КонецДня(ТекущаяДата())-1*24*60*60;
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	Сообщение.Наименование,
	|	Сообщение.Выполнена,
	|	Сообщение.Дата
	|ИЗ
	|	Задача.Сообщение КАК Сообщение
	|ГДЕ
	|	Сообщение.Дата МЕЖДУ &Дата1 И &Дата2
	|	И Сообщение.ПометкаУдаления = ЛОЖЬ";
	Запрос.УстановитьПараметр("Дата1",НачалоПериода);
	Запрос.УстановитьПараметр("Дата2",КонецПериода);
	РТ = Запрос.Выполнить().Выгрузить();
	
	Регламентные = РегламентныеЗадания.ПолучитьРегламентныеЗадания();
	
	ТекстПочтовогоСообщения = "Сбой выполнения регламентных заданий";
	
	ОтправитьПисьмо = Ложь;
	
	Для Каждого Регламентное из Регламентные Цикл
		Отбор = Новый Структура();
		ОтборЗаполнен = Ложь;
		Для Каждого СтрРТ Из РТ Цикл
			Если Найти(СтрРТ.Наименование,Регламентное.Наименование) Тогда
				Для Каждого СтрОтбор Из Отбор Цикл
					Если СтрОтбор.Значение = Регламентное.Наименование Тогда
						ОтборЗаполнен = Истина;
						Продолжить;
					КонецЕсли;
				КонецЦикла;
				Если ОтборЗаполнен = Ложь Тогда
					Отбор.Вставить("Наименование",Регламентное.Наименование);
					ОтборЗаполнен = Истина;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
		Если ОтборЗаполнен = Ложь Тогда
			Если Регламентное.Наименование = "Автозаказ" Тогда
			ИначеЕсли Регламентное.Использование = Истина Тогда
				ТекстПочтовогоСообщения = ТекстПочтовогоСообщения + "
				|с "+НачалоПериода+" по "+КонецПериода+" не запускалось "+Регламентное.Наименование;
				ОтправитьПисьмо = Истина;
			КонецЕсли;
			Продолжить;
		КонецЕсли;
		РС = РТ.НайтиСтроки(Отбор);
		Если РС.Количество() > 0 Тогда
			СтрокаНайдена = Ложь;
			ЗаданиеВыполнено = Ложь;
			Для Каждого СтрРС Из РС Цикл
				СтрокаНайдена = Истина;
				Если СтрРС.Выполнена = Истина Тогда
					ЗаданиеВыполнено = Истина;
					Прервать;
				КонецЕсли;
			КонецЦикла;
			Если ЗаданиеВыполнено = Истина Тогда
				Продолжить;
			Иначе
				ПоследнееЗадание = Регламентное.ПоследнееЗадание;
				Если ПоследнееЗадание <> Неопределено Тогда
					ТекстПочтовогоСообщения = ТекстПочтовогоСообщения + "
					|Не выполнено фоновое "+Регламентное.Наименование + " " + СокрЛП(ПоследнееЗадание.Начало);
					ОтправитьПисьмо = Истина;
				Иначе	
					Если СокрЛП(Регламентное.Наименование) > "" Тогда
						ТекстПочтовогоСообщения = ТекстПочтовогоСообщения + "
						|Не выполнено "+Регламентное.Наименование + " " + СокрЛП(СтрРС.Дата);
						ОтправитьПисьмо = Истина;
					ИначеЕсли  СокрЛП(Регламентное.Код) > "" Тогда
						ТекстПочтовогоСообщения = ТекстПочтовогоСообщения + "
						|Не выполнено "+Регламентное.Код + " " + СокрЛП(СтрРС.Дата) + " - у задания не заполнено наименование";
						ОтправитьПисьмо = Истина;
					Иначе
						ТекстПочтовогоСообщения = ТекстПочтовогоСообщения + "
						|Не выполнено "+ СокрЛП(Регламентное) + " " + СокрЛП(СтрРС.Дата) + " - у задания не заполнено наименование и код";
						ОтправитьПисьмо = Истина;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
			Если СтрокаНайдена = Истина Тогда
				Продолжить;
			КонецЕсли;
		КонецЕсли;

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

	"ВЫБРАТЬ
	|	ЗаказПоставщику.Ссылка
	|ИЗ
	|	Документ.ЗаказПоставщику КАК ЗаказПоставщику
	|ГДЕ
	|	ЗаказПоставщику.Контрагент = &Контрагент
	|	И ЗаказПоставщику.Автор В ИЕРАРХИИ(&Автор)
	|	И ЗаказПоставщику.СкладКоллекций В(&СкладКоллекций)
	|	И ЗаказПоставщику.Дата МЕЖДУ &Дата1 И &Дата2";
	Запрос.УстановитьПараметр("Дата1",НачалоДня(ТекущаяДата()));
	Запрос.УстановитьПараметр("Дата2",КонецДня(ТекущаяДата()));
	Запрос.УстановитьПараметр("Контрагент",Справочники.Контрагенты.ОсновнойПоставщик);
	СписокАвторов = Новый СписокЗначений;
 СписокАвторов.Добавить(Справочники.Пользователи.НайтиПоКоду("Робот"));
 Запрос.УстановитьПараметр("Автор",СписокАвторов);
	СкладКоллекций = Новый СписокЗначений;
	СкладКоллекций.Добавить(Справочники.СкладыКоллекций.НайтиПоКоду("..."));
	СкладКоллекций.Добавить(Справочники.СкладыКоллекций.НайтиПоКоду("..."));
	Запрос.УстановитьПараметр("СкладКоллекций",СкладКоллекций);
	РТ = Запрос.Выполнить().Выгрузить();
	Если Константы.ЗавтраПропуститьАвтозаказ.Получить() > 9 Тогда
		Если РТ.Количество()< 5 Тогда
			Если РТ.Количество() = 0 Тогда
				ТекстПочтовогоСообщения = ТекстПочтовогоСообщения + "
				|Ошибка!Не сформировались заказы на Сигму
				|Ошибка!Не сформировались заказы на Сигму
				|Ошибка!Не сформировались заказы на Сигму
				|Ошибка!Не сформировались заказы на Сигму
				|Ошибка!Не сформировались заказы на Сигму";
			Иначе
				ТекстПочтовогоСообщения = ТекстПочтовогоСообщения + "
				|Ошибка!Сформировались не все заказы на Сигму, всего сформировалось "+СокрЛП(РТ.Количество())+" заказов из 5 необходимых:";
				Для Каждого СтрРТ Из РТ Цикл
					ТекстПочтовогоСообщения = ТекстПочтовогоСообщения + "
					|"+СокрЛП(СтрРТ.Ссылка);
				КонецЦикла;
			КонецЕсли;
			ОтправитьПисьмо = Истина;
		КонецЕсли;
	КонецЕсли;
	
	ДниНедели = СокрЛП(ДеньНедели(ТекущаяДата()));
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	исГрафикАвтозаказа.ПериодичностьНедель,
	|	исГрафикАвтозаказа.ДниНедели,
	|	исГрафикАвтозаказа.Поставщик,
	|	исГрафикАвтозаказа.Логист,
	|	исГрафикАвтозаказа.Активный,
	|	исГрафикАвтозаказа.СрокПоставки,
	|	исГрафикАвтозаказа.ДатаПоследнегоЗаказа,
	|	исГрафикАвтозаказа.НоменклатурнаяГруппа,
	|	исГрафикАвтозаказа.Комментарий
	|ИЗ
	|	РегистрСведений.исГрафикАвтозаказа КАК исГрафикАвтозаказа
	|ГДЕ
	|	исГрафикАвтозаказа.ДниНедели = &ДниНедели
	|	И исГрафикАвтозаказа.Активный = ИСТИНА
	|	И исГрафикАвтозаказа.ДатаПоследнегоЗаказа < &ДатаПоследнегоЗаказа";
	Запрос.УстановитьПараметр("ДниНедели",ДниНедели);
	Запрос.УстановитьПараметр("ДатаПоследнегоЗаказа",НачалоДня(ТекущаяДата()));
	РТ = Запрос.Выполнить().Выгрузить();
	
	ОтправитьПисьмоОбАвтозаказе = Ложь;
	Если РТ.Количество() > 0 Тогда
		НеобходимоДоформироватьВнешнийАвтозаказ = Ложь;
		Для Каждого Стр Из РТ Цикл
			ЗаказДолженБыть = Стр.ДатаПоследнегоЗаказа + (Стр.ПериодичностьНедель - 1)*7*24*60*60;
			Если ЗаказДолженБыть>Стр.ДатаПоследнегоЗаказа Тогда
				//Сообщить("Не формируем "+Стр.ПериодичностьНедель+" "+Стр.ДниНедели+" "+Стр.Поставщик+" "+Стр.Логист+" "+Стр.ДатаПоследнегоЗаказа);
				Продолжить;
			КонецЕсли;
			НеобходимоДоформироватьВнешнийАвтозаказ = Истина;
			ОтправитьПисьмоОбАвтозаказе = Истина;
			ТекстПочтовогоСообщения = ТекстПочтовогоСообщения + "
			|Попытка доформировать "+Стр.Поставщик+" ("+Стр.Логист+") после "+Стр.ДатаПоследнегоЗаказа+" (делается 1 раз в "+Стр.ПериодичностьНедель+" недель в "+Стр.ДниНедели+" день недели),";
		КонецЦикла;
	КонецЕсли;
	Если ОтправитьПисьмоОбАвтозаказе = Истина Тогда
		ТекстПочтовогоСообщения = ТекстПочтовогоСообщения + "
		|по графику автозаказа.";
		ОтправитьПисьмо = Истина;
	КонецЕсли;
	
	Если ОтправитьПисьмо = Ложь Тогда
		Возврат;
	КонецЕсли;

...

Вызывать эту процедуру стоит внешне, примерно таким образом:

Вызывать эту процедуру стоит таим образом:

...
	ИмяЛогФайла = "\\srv\v7bases\ИмяБазы\ИмяКаталога\ЛогФайл.txt";
	Коннектор = СоздатьОбъект("V83.COMConnector");
	v8 = Коннектор.Connect("Srvr=""имясервера"";Ref=""ccccccccc"";Usr=""aaaaaaaaa"";Pwd=""xxxxxxxxx"";");
	ОтправкаОтчета=v8.Обработки.КонтрольРегламентныхЗаданий.Создать();
	Если Фс.СуществуетФайл(ЛогФайл)=1 Тогда
		Текст=СоздатьОбъект("Текст");
		Текст.Открыть(ЛогФайл);
		Текст.ДобавитьСтроку("Отправка отчета выполнена.");
		Текст.Записать(ЛогФайл);
	КонецЕсли;
	ОтправкаОтчета.ОтправитьОтчет(ИмяЛогФайла,V8.NewObject("СписокЗначений"));
	v8 = "";
	Коннектор = "";
...


4) Перед началом выполнения каждого регламентного задания, в котором используются результаты предыдущего, делать вывод о возмодности его запуска, о возможности доформировать предыдущее задание. Если существенная проблема обнаружена - сигналить пользователям, чтобы они обратились к программистам. Тут в исключение вывести сообщение не получится, но получится например выполнить задание принудительно или отправить письмо.

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

далее собственно идет сама кассовая выгрузка.

5) Настроить отправку отчета о результатах "Контроля выполнения регламентных заданий" по почте программистам.

...
	ТемаПочтовогоСообщения = "Сбой выполнения регламентных заданий";
	
////ЗапуститьПриложение("systeminfo >> systeminfo.txt", "o:\!",Истина);
//ИмяФайла = "o:\!\systeminfo.txt";
//ВыбФайл = Новый Файл(ИмяФайла);
//Если ВыбФайл.Существует() Тогда
//	Стр = "Результат выполнения:"+Символы.ПС+
//	+"Файл: "+ВыбФайл.ПолноеИмя+Символы.ПС+
//	+"Имя: "+ ВыбФайл.Имя+Символы.ПС+
//	+"Время изменения: "+ВыбФайл.ПолучитьВремяИзменения()+Символы.ПС+
//	+"Только чтение: "+ВыбФайл.ПолучитьТолькоЧтение()+Символы.ПС+
//	+"Невидимость: "+ВыбФайл.ПолучитьНевидимость();  
...
//	ТекстПочтовогоСообщения = ТекстПочтовогоСообщения + "
//	|"+Стр;
//Иначе
//	ТекстПочтовогоСообщения = ТекстПочтовогоСообщения + "
//	|Состояние сервера неизвестно.";
//КонецЕсли;

Попытка 
	Профиль = Новый ИнтернетПочтовыйПрофиль;
	Профиль.АдресСервераSMTP = "ззз.ззз.ззз.ззз";
	Профиль.АдресСервераPOP3 = "эээ.эээ.эээ.эээ";
	Профиль.ПортSMTP = 25;
	Профиль.ПортPOP3 = 110;
	Профиль.Пользователь = "fff%kkk.ru";
	Профиль.Пароль = "rrrrrrr";
	
	Почта = Новый ИнтернетПочта;
	Попытка
		Почта.Подключиться(Профиль);
	Исключение
		Возврат;
	КонецПопытки;
	
	Сообщение = Новый ИнтернетПочтовоеСообщение;
	Сообщение.Отправитель = "ssss@ddddd.ru";
	Сообщение.ИмяОтправителя = "Торговый комплекс";
	ПочтовыеАдреса = Сообщение.Получатели;
	ПочтовыйАдрес = ПочтовыеАдреса.Добавить();
	ПочтовыйАдрес.Адрес = "admin@hhhhhh.ru";
	Сообщение.Тема =ТемаПочтовогоСообщения; 
	ИнтернетТекстПочтовогоСообщения = Сообщение.Тексты.Добавить();
	ИнтернетТекстПочтовогоСообщения.Текст = ТекстПочтовогоСообщения;
	ИнтернетТекстПочтовогоСообщения.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
	Попытка
		Почта.Послать(Сообщение);
	Исключение
		Возврат;
	КонецПопытки;
	Почта.Отключиться(); 

Еще пытаюсь вывести в письмо системную информацию с сервера - в комментарии из последнего фрагмента, пока не доделал. Если сталкивались с примерами, подскажите пожалуйста как.
 

Подробне по п.5 в качестве примера могу предложить вот такой код:

 
 Пример кода

Ставьте плюсы, пишите в комментарии к статье если возникнут вопросы.

регламентные фоновые задания

См. также

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    14184    108    46    

107

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

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

15000 руб.

10.11.2023    11874    45    27    

67

Инструменты администратора БД Роли и права Системный администратор Программист Пользователь 8.3.14 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Документооборот 1С:Зарплата и кадры государственного учреждения 3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Роли… Вы тратите много времени и сил на подбор ролей среди около 2400 в ERP или 1500 в Рознице 2, пытаясь понять какими правами они обладают? Вы все время смотрите права в конфигураторе или отчетах чтоб создать нормальные профили доступа? Вы хотите наглядно видеть какие права дает профиль и редактировать все в простом виде? А может хотите просто указать подсистему и дать права на просмотр и добавление на объекты и не лезть в дебри прав и чтоб обработка сама подобрала нужные роли? Все это теперь стало возможно! Обновление от 18.09.2024, версия 1.2

18000 руб.

06.12.2023    10608    47    8    

78

SALE! %

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

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

4800 3840 руб.

14.01.2013    191130    1152    0    

920

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтер Пользователь Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    33803    108    152    

75

Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Брандмауэр для сервера 1С включает в себя управление возможностью начала и возобновления сеансов пользователей по различным условиям, ограничение общего числа возможных сеансов для работы с информационной базой, резервирование возможности работы с информационной базой определенных польззователей, запрет запуска нескольких сеансов для пользователя, журнализация событий начала (возобновления) и завершения (гибернации) сеансов, ведение списка активных сеансов для информационных баз кластера серверов

3600 руб.

06.02.2017    32610    145    18    

51

Архивирование (backup) Инструменты администратора БД Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Данная разработка позволит решить вопрос с резервным копированием Ваших баз в автоматическом режиме, расположенных на сервере 1С. Система умеет ставить блокировки на вход, блокировать фоновые задания, принудительно отключать сеансы пользователей. И все это система делает в автоматически при создании бэкапа (или через команду). Выгрузка происходит в родной формат 1С - .dt. Так же система умеет архивировать данные выгрузки с установкой пароля. Умеет менять расширение файла zip или dt на любое указанное вами, что позволит сохранить выгрузки от шифровальщика. Может удалять старые копии выгрузок, оставляя указанное количество резервных копий, начиная с самой поздней. Только для WINDOWS!

6000 руб.

06.11.2012    73728    629    45    

88

Инструменты администратора БД Пользователь Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Многие сталкиваются с проблемой когда изображения, находящиеся в базе разные по объему и размерам. Менеджеры могут добавить файлы в очень высоком разрешении, объемом свыше 20 Мегабайт. База данных становится слишком большой, выгрузка на сайт идёт медленно и требуется много место на хостинге. Как сжать картинки и уменьшить размер базы 1С? Это можно сделать с помощью данной обработки. Существует возможность выбрать различные варианты для того чтобы уменьшить картинки: в разы, в процентах от первоначального объема, а также сделать картинки одинаковой ширины. В результате размер базы 1С значительно сократится (в зависимости от количества и размера картинок), а изображения станут небольшого объема, равными по ширине, почти без потери качества. Работает на управляемых формах для УТ 11, КА, ERP.

3000 руб.

21.07.2022    10159    10    4    

18
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Yashazz 4804 28.09.14 11:52 Сейчас в теме
В своё время мучился-мучился с регламентными заданиями, так проку и не добился. То они не запускались по неведомым причинам ни в какую, то сбоили системные библиотеки 1С, то с сервером приложений связь терялась, то наоборот, все дружно задания как ломанутся (наплевав на свои реальные расписания) и повесят базу...
Короче, я сделал экспортные пускачи и дёргаю их через обычный sheduler винды. Работает как из пушки. Просто, прозрачно, управляемо. Логи в файлы валю, прикрутил оснастку их регулярного анализа и наступило щастье.
корум; MaxDavid; i_lo; help1Ckr; DrAku1a; Yury1001; +6 Ответить
2. TrinitronOTV 16 28.09.14 16:57 Сейчас в теме
(1) Yashazz, а как вы в sheduler запускаете свои задания?
3. ksnik 594 28.09.14 18:42 Сейчас в теме
(1) Yashazz, все упомянутое конечно бывает. Можно с помощью bat-файла выполнить вход под клиентом в базу 1С и запуск проблемного задания по тому же самому принципу, как это делается в 1С: Предприятии 7.7:
date /t >> auto_log.txt
time /t >> auto_log.txt
echo Выгрузка в центральную базу  >> auto_log.txt
start "" /wait "C:\Program Files\1Cv77\BIN\1cv7s.exe" config /D\\Сервер\База /Nпользователь /Pпароль /@База\Autoobmen\OUT_BB.prm
time /t >> auto_log.txt
sleep 20
...

или без батника в команде "выполнить" регламентного задания одна строчка:
"C:\Program Files\1Cv77\BIN\1cv7s.exe" enterprise /d\\сервер\база\ /nИмяПользователя /pПароль

а в процедуре "ПриНачалеРаботыСистемы()"
	Если (ИмяПользователя()="аааа") Тогда  
		Если СокрЛП( Константа.ПрефиксИБ)="аа" Тогда
			ОткрытьФормуМодально("Обработка.аааааа");
		Иначе
			ОткрытьФормуМодально("Обработка.ббббб");
		КонецЕсли;
	ИначеЕсли (ИмяПользователя()="ввв") или (ИмяПользователя()="ГГГГ") или (ИмяПользователя()="ДДД") Тогда  
		ОткрытьФормуМодально("Обработка.ЕЕЕЕ");
	ИначеЕсли (ИмяПользователя()="ЖЖЖЖ") Тогда  
		ОткрытьФормуМодально("Обработка.ззззз");
	ИначеЕсли (ИмяПользователя()="ииии") или (ИмяПользователя()="ккккк") Тогда
		ОткрытьФормуМодально("Обработка.ллллллл");
	КонецЕсли;
Показать

Такой батник и для 8-ки можно написать, только нужно будет следить за сеансом в котором работает проблемное задание чтоб он не подох и серверные операции инициировать на клиенте.
4. i_lo 214 05.10.14 23:18 Сейчас в теме
(0), http://infostart.ru/public/237960/. Пол года. Полет нормальный...
5. ksnik 594 06.10.14 08:02 Сейчас в теме
(4) i_lo, замечательная публикация "Если РЗ должно было начать выполняться до момента проверки, но не выполнялось, то перезаписываем его". Возьму на вооружение, нужно перезапускать и чинить регламентные задания. Я тоже предложил внешний пускач через КОМ, предложенная Вами публикация имеет сходный функционал. Однако регламентные задания должны выполняться сервером и не зависеть от клиента, особенно если они долго выполняются, например у заданий "перепроведение последовательностей взаиморасчетов" или "перепроведение по партиям после обмена" опасно снижать надежность вешая их на клиент.
п.с. Все таки такого анализа как у меня в "Лекарстве от зависших регламентных заданий" нет, может он уже и не нужен?
6. i_lo 214 07.10.14 02:48 Сейчас в теме
(5) все, что описано в статье работает на сервере. Никаких клиентов. Запускается серверным планировщиком раз в сутки перед началом рабочего дня. У меня такие регламенты, что так удобнее. Главное, чтобы пользователь, от которого запускается регламентное задание был прописан, как пользователь базы с возможностью доменной аутентификации.
7. ksnik 594 07.10.14 08:14 Сейчас в теме
(6) i_lo, Ваша статья мне понравилась, спасибо за уточнение "все работает на сервере" и "запускается серверным планировщиком". Я часто делал перезапись вручную (снять использование - записать - установить использование - записать), но иногда не помогает. Вообще не помогает. Поэтому я считаю, что контроль выполнения регламентных заданий мне необходим.
8. alexey_kurdyukov 168 09.10.14 13:03 Сейчас в теме
Любую системную информацию можно добыть с помощью Windows Management Instrumentation, WMI доступно в 1С.

msdn
WMI Samples
9. SerG_121 446 11.10.14 08:45 Сейчас в теме
10. ksnik 594 11.10.14 12:20 Сейчас в теме
(9) SerG_121, работа интересная, но увы админы не разрешат - даже акел пад на сервере не разрешают ставить, когда-то ставил выгонялку из 1С (скачал здесь) и когда ключ 1С заглючил подумали на эту выгонялку. Нужно потроха этого чуда, чтоб самому делать. Можете поделиться немного подробнее?
11. AlexO 136 27.02.15 15:25 Сейчас в теме
(0) а что вы делаете, если у вас сервер не запускает РЗ в принципе?
12. ksnik 594 04.03.15 08:51 Сейчас в теме
(11) AlexO, если речь об одном отдельном РЗ, проблема в расписании, поле ввода "повторять" должно быть больше нуля, то есть например каждый день; с 8:00:00 один раз в день, противное значит однократный запуск.
Чтобы сервер вообще не выполнял - такого у нас не бывало, может Вам переустановить его?
13. AlexO 136 04.03.15 10:16 Сейчас в теме
(12)
если речь об одном отдельном РЗ, проблема в расписании
Так тема называется "Не работают регламентные задания", вот и спросил - если не работают все, что делать-то? )
может Вам переустановить его?
В 1С только это и помогает ))
На самом деле, все перепробовали - перегрузка базы, переподключение сервиса 1С, пинки и уговоры сервера )) ... осталось только переустановка 1С-сервера...
14. пользователь 18.11.16 13:30
Сообщение было скрыто модератором.
...
15. ksnik 594 03.04.18 11:12 Сейчас в теме
обновил статью (добавил новый материал), поместил текст примера анализа состояния и отправки сообщения
Оставьте свое сообщение