Создание регламентного задания из внешней обработки для обычных форм (УПП/КА/...) в 2 функциях

mikaelangelm 81 1 1 4

а) на форме Справочник.ВнешниеОбработки.Форма.ФормаЭлемента добавляет/изменяет/удаляет РегламентноеЗадание и его Расписание (см. описание РегламентноеЗаданиеGUIDНажатие) б) в серверном модуле вызывает ВыполнитьОбработкуПоРегламентномуЗаданию (см. описание)

// Добавляет/изменяет/удаляет РегламентноеЗадание программно + его расписание
// Требуется в Справочники.ВнешниеОбработки:
// - добавить реквизит РегламентноеЗаданиеGUID типа УникальныйИдентификатор 
// Требуется на форме Справочник.ВнешниеОбработки.Форма.ФормаЭлемента:
// - добавить Надпись РегламентноеЗаданиеGUID с галкой Гиперссылка и обработчик нажатия РегламентноеЗаданиеGUIDНажатие
// - ПриОткрытии() добавить вызов РегламентноеЗаданиеGUIDНажатие("ПриОткрытии")
// Обработка, как и в БСП 3, должна содержать метод ВыполнитьКоманду, но при этом не должна содержать метод СведенияОВнешнейОбработке, т.к. поддерживается лишь 1 тип - ВызовСерверногоМетода
Процедура РегламентноеЗаданиеGUIDНажатие(Элемент) 
	
	// Инициализирует заголовок чтобы не отображать ГУИД в некотрых случаях
	ЭлементыФормы.РегламентноеЗаданиеGUID.Заголовок = "Расписание не указано";
	
	// Создает РЗ на основании предопределенного/подбирает ранее созданное по ГУИД
	РЗ = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РегламентноеЗаданиеGUID);
	Если РЗ = Неопределено Тогда
		РЗ = РегламентныеЗадания.СоздатьРегламентноеЗадание(Метаданные.РегламентныеЗадания.ЗапускДополнительныхОбработок);
	КонецЕсли;

	Если Элемент = "ПриОткрытии" Тогда
		Если РЗ.Использование Тогда
			ЭлементыФормы.РегламентноеЗаданиеGUID.Заголовок = РЗ.Расписание;
		КонецЕсли;
		Перейти ~БегущаяСтрока;
	КонецЕсли;     
	
	// см. ИрОбщий.МетодРеализованЛкс. Надежно проверяет существование у объекта метода с заданным именем
	ИмяФайла = ПолучитьИмяВременногоФайла();
	Попытка
		ДвоичныеДанные = ЭтотОбъект.ХранилищеВнешнейОбработки.Получить();
		ДвоичныеДанные.Записать(ИмяФайла);   
		Объект = ?(ЭтотОбъект.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Отчет, ВнешниеОтчеты.Создать(ИмяФайла), ВнешниеОбработки.Создать(ИмяФайла));
	Исключение 
		ВызватьИсключение КомментарийКФайлуИсточнику;
	КонецПопытки;  
	УдалитьФайлы(ИмяФайла);
	Попытка
		Выполнить("Объект.ВыполнитьКоманду(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)");
	Исключение
		Инфо = ИнформацияОбОшибке();
		Пока Инфо.Причина <> Неопределено Цикл
			Инфо = Инфо.Причина;
		КонецЦикла;
		МетодРеализован = Найти(Инфо.Описание, "Слишком много фактических параметров") > 0 
					  ИЛИ Найти(Инфо.Описание, "Too many actual parameters") > 0
					  ИЛИ Найти(Инфо.Описание, "Занадто багато фактичних параметрів") > 0; // Украинский  
		Если Не МетодРеализован Тогда
			ВызватьИсключение Инфо.Описание+" в "+ИмяФайлаВнешнейОбработки;
		КонецЕсли;
	КонецПопытки;
	
	// Заполняет регламентное задание
	ДиалогРасписания 	= Новый ДиалогРасписанияРегламентногоЗадания(РЗ.Расписание);  
	РасписаниеУстановлено = ДиалогРасписания.ОткрытьМодально();         
	Если РасписаниеУстановлено И (Не Ссылка.Пустая() ИЛИ Вопрос("Для установки регламентного задания обработка должна быть записана", РежимДиалогаВопрос.ОКОтмена, "15", КодВозвратаДиалога.ОК, "Записать?", КодВозвратаДиалога.Отмена) = КодВозвратаДиалога.ОК) Тогда   
		РЗ.Параметры.Очистить();
		РЗ.Параметры.Добавить(Ссылка); 
		РЗ.Расписание 	= ДиалогРасписания.Расписание;
		РЗ.Наименование = "Внешняя обработка: " + Наименование + " / Команда: " + "ВыполнитьКоманду";
		РЗ.Использование= Истина;  
		РЗ.ИмяПользователя = ИмяПользователя();
		РЗ.Записать();     
		РегламентноеЗаданиеGUID = РЗ.УникальныйИдентификатор;             
		Записать();
		ЭлементыФормы.РегламентноеЗаданиеGUID.Заголовок = РЗ.Расписание;  
		ЭлементыФормы.РегламентноеЗаданиеGUID.БегущаяСтрока = РежимБегущейСтроки.Нормально;
	Иначе
		Если РегламентныеЗадания.НайтиПоУникальномуИдентификатору(РЗ.УникальныйИДентификатор) <> Неопределено Тогда 
			РЗ.Удалить() 
		КонецЕсли;
		ЭлементыФормы.РегламентноеЗаданиеGUID.Заголовок = "Расписание не указано";
	КонецЕсли;  
	
	~БегущаяСтрока:
	ЭлементыФормы.РегламентноеЗаданиеGUID.БегущаяСтрока = РежимБегущейСтроки[?(СтрДлина(ЭлементыФормы.РегламентноеЗаданиеGUID.Заголовок)/ЭлементыФормы.РегламентноеЗаданиеGUID.Ширина>0.2, "Быстро", "НеИспользовать")]; 
	
КонецПроцедуры

// см. БСП 3+: ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуПоРегламентномуЗаданию
// Справочники.ВнешниеОбработки.ПолучитьОбъект().ВыполнитьКоманду() по Справочники.ВнешниеОбработки.Расписание.Получить()
Процедура ВыполнитьОбработкуПоРегламентномуЗаданию(ВнешняяОбработка, ИдентификаторКоманды = "ВыполнитьКоманду") Экспорт
	
	// Запись журнала регистрации
	ИмяСобытия = "ВыполнитьОбработкуПоРегламентномуЗаданию";
	ЖурналРегистрации.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытия,,,ВнешняяОбработка, СтрШаблон("Команда %1: Запуск.", ИдентификаторКоманды));
	
	ОбработкаСтруктура = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ВнешняяОбработка, "ВидОбработки,ХранилищеВнешнейОбработки");
	Менеджер = ?(ОбработкаСтруктура.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Отчет, ВнешниеОтчеты, ВнешниеОбработки);
	
	// Выполнение команды
	Попытка   
		ИмяОбработки 				= ПолучитьИмяВременногоФайла();
		ДвоичныеДанные 				= ОбработкаСтруктура.ХранилищеВнешнейОбработки.Получить();
		ДвоичныеДанные.Записать(ИмяОбработки);   
		ОбработкаОбъект 			= Менеджер.Создать(ИмяОбработки, Ложь);
		ОбработкаОбъект.ВыполнитьКоманду(ИдентификаторКоманды);
		УдалитьФайлы(ИмяОбработки);
	Исключение      
		ЖурналРегистрации.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытия,,,ВнешняяОбработка, СтрШаблон("Команда %1: Ошибка выполнения:%2", ИдентификаторКоманды, Символы.ПС + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
	КонецПопытки;
	
	// Запись журнала регистрации
	ЖурналРегистрации.ДобавитьСообщениеДляЖурналаРегистрации(ИмяСобытия,,,ВнешняяОбработка, СтрШаблон("Команда %1: Завершение.", ИдентификаторКоманды));
КонецПроцедуры
0
{31} Переменной Объект присвоено значение, но оно нигде не используется
{62} Переменной РегламентноеЗаданиеGUID присвоено значение, но оно нигде не используется
Орфографическая ошибка в Гиперссылка: Гиперссылка
Орфографическая ошибка в некотрых: некотрых
Орфографическая ошибка в Занадто: Занадто
Орфографическая ошибка в багато: багато
Орфографическая ошибка в фактичних: фактичних
Орфографическая ошибка в УникальныйИДентификатор: Дентификатор

См. также

Создание регламентного задания из внешней обработки

Добавить элемент в обычную форму

Программная обработка расшифровки отчета на СКД на обычных формах

ПриСозданииВнешнейОбработки (БСП)

ПолучитьРегламентноеЗаданиеВнешнийВызов (БСП)

УдалитьРегламентноеЗаданиеВнешнийВызов (БСП)

Индикатор отчета для Обычных форм

ВыполнитьОбработкуПоРегламентномуЗаданию (БСП)

ОбработкаОчередиЗаданий (БСП)

Модератору