Программный запуск дополнительной обработки

1. vpivo 17.11.18 14:24 Сейчас в теме
Всем привет. Несколько часов уже бьюсь, но движение медленное и малоэффективное...
Есть ДО, прописана в Справочник.ДополнительныеОтчетыИОбработки...
Получаю оттуда и из табличной части все, что можно, но...
Как ее запустить программно???
Копаюсь в коде основной формы ДО с кнопочкой "Выполнить", но чтобы его использовать не могу понять, что откуда берется и в каком виде складывается.
ДО - без формы, она там ни к чему.
По теме из базы знаний
Найденные решения
7. vpivo 17.11.18 21:35 Сейчас в теме
Спасибо всем. Для исполнения команды доп.обработки без формы (фактически вызова с ожиданием процедуры "ВыполнитьКоманду" модуля доп.обработки) накропал вот такое:
&НаКлиенте
Процедура ВыполнитьСинхронизацию(Команда)
	// готовим структуру команды 
    вКоманда = Новый Структура;
    ЗаполнитьСтруктуруВыполняемойКоманды(вКоманда,"Моя доп.обработка");
	Если ЗначениеЗаполнено(вКоманда) Тогда
		ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Команда ""%1"" подготовлена к исполнению.'"),вКоманда.Представление);
		// оповещаем себя о том, что команда подготовлена и передается на исполнение
		//ПоказатьОповещениеПользователя(ЗаголовокСостояния + "...", , , БиблиотекаКартинок.ДлительнаяОперация48);
		Сообщить(ЗаголовокСостояния);
		// вызываем процедуру исполнения команды в фоне на сервере
		ДлительнаяОперация = НачатьВыполнениеСервернойКомандыВФоне(вКоманда, УникальныйИдентификатор);
		// подготавливаем данные и выводим "ожидающее" оповещение
		ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Команда ""%1"" выполняется.'"),вКоманда.Представление);
		ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
		ПараметрыОжидания.ТекстСообщения = ЗаголовокСостояния;
		// не будем оповещать себя после завершения штатным образом
		ПараметрыОжидания.ОповещениеПользователя.Показать = Ложь;
		// а вот окно "ожидания" просим показать
		ПараметрыОжидания.ВыводитьОкноОжидания = Истина;
		// непосредственно "ожидаем"
		ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеЗавершенияВыполнения", ЭтотОбъект, вКоманда);
		ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗавершенияВыполнения(Задание, ВыполняемаяКоманда) Экспорт
	// процедура, которая указана ранее для вызова после завершения исполнения
	Если Задание.Статус = "Ошибка" Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось выполнить команду по причине:
				|%1.'"), Задание.КраткоеПредставлениеОшибки);
	Иначе
		// Оповещаем все открытые формы и динамические списки об изменениях (обязательно)  	
		Результат = ПолучитьИзВременногоХранилища(Задание.АдресРезультата);
		ОповеститьФормы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Результат, "ОповеститьФормы");
		Если ОповеститьФормы <> Неопределено Тогда
			СтандартныеПодсистемыКлиент.ОповеститьФормыОбИзменении(ОповеститьФормы);
		КонецЕсли;
		// Оповещаем себя, поскольку ранее в ПараметрыОжидания записали Ложь
		ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Команда ""%1"" выполнена.'"),ВыполняемаяКоманда.Представление);
		Сообщить(ЗаголовокСостояния);
	КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗаполнитьСтруктуруВыполняемойКоманды(ВыполняемаяКоманда,НаименованиеОбработки)
	// заполняем структуру команды запрошенной обработки
    ДопОбработкаСсылка=Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(НаименованиеОбработки);
    Если ЗначениеЗаполнено(ДопОбработкаСсылка) Тогда
        ВыполняемаяКоманда = Новый Структура;
        ВыполняемаяКоманда.Вставить("Ссылка",ДопОбработкаСсылка);
        ВыполняемаяКоманда.Вставить("Представление",ДопОбработкаСсылка.Команды[0].Представление);
        ВыполняемаяКоманда.Вставить("Идентификатор",ДопОбработкаСсылка.Команды[0].Идентификатор);
        ВыполняемаяКоманда.Вставить("ВариантЗапуска",ДопОбработкаСсылка.Команды[0].ВариантЗапуска);
        ВыполняемаяКоманда.Вставить("ПоказыватьОповещение",ДопОбработкаСсылка.Команды[0].ПоказыватьОповещение);
        ВыполняемаяКоманда.Вставить("Модификатор",ДопОбработкаСсылка.Команды[0].Модификатор);
        ВыполняемаяКоманда.Вставить("ОбъектыНазначения",Неопределено);
        ВыполняемаяКоманда.Вставить("Вид",ДопОбработкаСсылка.Вид);
        ВыполняемаяКоманда.Вставить("ЭтоОтчет",Ложь);
    Иначе
        ВыполняемаяКоманда = Неопределено;
	КонецЕсли;    
КонецПроцедуры

&НаСервереБезКонтекста
Функция НачатьВыполнениеСервернойКомандыВФоне(ВыполняемаяКоманда, УникальныйИдентификатор)
	ИмяПроцедуры = "ДополнительныеОтчетыИОбработки.ВыполнитьКоманду";
	
	ПараметрыПроцедуры = Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды, ОбъектыНазначения");
	ПараметрыПроцедуры.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка;
	ПараметрыПроцедуры.ИдентификаторКоманды          = ВыполняемаяКоманда.Идентификатор;
	ПараметрыПроцедуры.ОбъектыНазначения             = ВыполняемаяКоманда.ОбъектыНазначения;
	
	НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	НастройкиЗапуска.НаименованиеФоновогоЗадания = НСтр("ru = 'Дополнительные отчеты и обработки: Выполнение серверного метода обработки'");
	
	Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяПроцедуры, ПараметрыПроцедуры, НастройкиЗапуска);
КонецФункции
Показать
adhocprog; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. independ 1520 17.11.18 14:36 Сейчас в теме
(1) вот пример с формой,

&НаКлиенте
Процедура ДопДок_ОбработкаНесопоставленныхПосле(Команда)
	ВыполняемаяКоманда=Новый Структура;
	ЗаполнитьСтруктуруВыполняемойКоманды(ВыполняемаяКоманда,"Обработка данных ЕГАИС");
	ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьОткрытиеФормыОбработки(ВыполняемаяКоманда,ЭтаФорма,Неопределено);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗаполнитьСтруктуруВыполняемойКоманды(ВыполняемаяКоманда,НаименованиеОбработки)
	ДопОбработкаСсылка=Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(НаименованиеОбработки);
	Если ЗначениеЗаполнено(ДопОбработкаСсылка) Тогда
		ВыполняемаяКоманда=Новый Структура;
		ВыполняемаяКоманда.Вставить("ВариантЗапуска",ДопОбработкаСсылка.Команды[0].ВариантЗапуска);
		ВыполняемаяКоманда.Вставить("Вид",ДопОбработкаСсылка.Вид);
		ВыполняемаяКоманда.Вставить("Идентификатор",ДопОбработкаСсылка.Команды[0].Идентификатор);
		ВыполняемаяКоманда.Вставить("Модификатор",ДопОбработкаСсылка.Команды[0].Модификатор);
		ВыполняемаяКоманда.Вставить("ОбъектыНазначения",Неопределено);
		ВыполняемаяКоманда.Вставить("ПоказыватьОповещение",ДопОбработкаСсылка.Команды[0].ПоказыватьОповещение);
		ВыполняемаяКоманда.Вставить("Представление",НаименованиеОбработки);
		ВыполняемаяКоманда.Вставить("Ссылка",ДопОбработкаСсылка);
		ВыполняемаяКоманда.Вставить("ЭтоОтчет",Ложь);
	Иначе
		ВыполняемаяКоманда=Неопределено;
	КонецЕсли;	
КонецПроцедуры
Показать
adhocprog; vpivo; +2 Ответить
3. vpivo 17.11.18 17:08 Сейчас в теме
(2) Спасибо за пример. Попробую прикрутить, в смысле подпедалить..
4. Xershi 1484 17.11.18 17:23 Сейчас в теме
(1) а зачем ее программно запускать? Сделайте регламентным заданием БСП сама запустит.
5. vpivo 17.11.18 20:06 Сейчас в теме
(4) У меня есть внешняя обработка, а в ней прежде чем что-то делать - нужно запустить эту доп.обработку - это синхронизация данных. Она должна быть регламентным заданием. У меня файловая БД УТ11. Пока не знаю как это сделать. Еще не разбирался, но прочитал, что трудности есть.
Может подскажете как? Или ссылку, где почитать.
6. Xershi 1484 17.11.18 20:42 Сейчас в теме
(5) https://infostart.ru/public/622195/ 5 обработка делает удаление в фоне и через регламентное задание.
Скачай БСП там заготовки тоже есть.
8. vpivo 17.11.18 21:43 Сейчас в теме
(6) Да это все хорошо... особенно небесплатные примеры... Вопрос в другом...
Сформировал я эту доп.обработку, даже назначил ей расписание (сразу увидел, что появился GUID регламентного задания), но...
Как это регламентное задание сможет запускаться, если у меня 1С 8.3 УТ11 не клиент-сервер, а файловая БД???
9. Xershi 1484 17.11.18 21:51 Сейчас в теме
(8) регламентные задания выполняются когда им назначен пользователь и он сидит в базе.
Есть лайфхаки, которые запускают обработки через расписание, но ПК должен быть включен. Так что проще 1С не закрывать и все!
10. vpivo 17.11.18 22:02 Сейчас в теме
(9) Т.е. нужно постоянно иметь включенный комп с коннектом к "облачной 1С-ке" и еще и войти в эту базу под пользователем, обозначенным в настройках доп.обработки?
11. Xershi 1484 17.11.18 22:44 Сейчас в теме
(10) серверная база, тоже не будет работать в фоне если сервер отрубить. Логично, что файловая база это и есть сервер и он должен работать!
12. vpivo 19.11.18 18:03 Сейчас в теме
(11) Ну Вы загнули связку... После пол-литра такую логику не построишь... Файловая база - набор файлов и не более того. А вот когда стартуешь 1С на компе и открываешь базу - вот тогда и запускается на этом компе нечто очень отдаленно напоминающее сервер. Посмотрите диспетчер задач во время работы с 1С.
7. vpivo 17.11.18 21:35 Сейчас в теме
Спасибо всем. Для исполнения команды доп.обработки без формы (фактически вызова с ожиданием процедуры "ВыполнитьКоманду" модуля доп.обработки) накропал вот такое:
&НаКлиенте
Процедура ВыполнитьСинхронизацию(Команда)
	// готовим структуру команды 
    вКоманда = Новый Структура;
    ЗаполнитьСтруктуруВыполняемойКоманды(вКоманда,"Моя доп.обработка");
	Если ЗначениеЗаполнено(вКоманда) Тогда
		ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Команда ""%1"" подготовлена к исполнению.'"),вКоманда.Представление);
		// оповещаем себя о том, что команда подготовлена и передается на исполнение
		//ПоказатьОповещениеПользователя(ЗаголовокСостояния + "...", , , БиблиотекаКартинок.ДлительнаяОперация48);
		Сообщить(ЗаголовокСостояния);
		// вызываем процедуру исполнения команды в фоне на сервере
		ДлительнаяОперация = НачатьВыполнениеСервернойКомандыВФоне(вКоманда, УникальныйИдентификатор);
		// подготавливаем данные и выводим "ожидающее" оповещение
		ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Команда ""%1"" выполняется.'"),вКоманда.Представление);
		ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
		ПараметрыОжидания.ТекстСообщения = ЗаголовокСостояния;
		// не будем оповещать себя после завершения штатным образом
		ПараметрыОжидания.ОповещениеПользователя.Показать = Ложь;
		// а вот окно "ожидания" просим показать
		ПараметрыОжидания.ВыводитьОкноОжидания = Истина;
		// непосредственно "ожидаем"
		ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеЗавершенияВыполнения", ЭтотОбъект, вКоманда);
		ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗавершенияВыполнения(Задание, ВыполняемаяКоманда) Экспорт
	// процедура, которая указана ранее для вызова после завершения исполнения
	Если Задание.Статус = "Ошибка" Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось выполнить команду по причине:
				|%1.'"), Задание.КраткоеПредставлениеОшибки);
	Иначе
		// Оповещаем все открытые формы и динамические списки об изменениях (обязательно)  	
		Результат = ПолучитьИзВременногоХранилища(Задание.АдресРезультата);
		ОповеститьФормы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Результат, "ОповеститьФормы");
		Если ОповеститьФормы <> Неопределено Тогда
			СтандартныеПодсистемыКлиент.ОповеститьФормыОбИзменении(ОповеститьФормы);
		КонецЕсли;
		// Оповещаем себя, поскольку ранее в ПараметрыОжидания записали Ложь
		ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Команда ""%1"" выполнена.'"),ВыполняемаяКоманда.Представление);
		Сообщить(ЗаголовокСостояния);
	КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗаполнитьСтруктуруВыполняемойКоманды(ВыполняемаяКоманда,НаименованиеОбработки)
	// заполняем структуру команды запрошенной обработки
    ДопОбработкаСсылка=Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(НаименованиеОбработки);
    Если ЗначениеЗаполнено(ДопОбработкаСсылка) Тогда
        ВыполняемаяКоманда = Новый Структура;
        ВыполняемаяКоманда.Вставить("Ссылка",ДопОбработкаСсылка);
        ВыполняемаяКоманда.Вставить("Представление",ДопОбработкаСсылка.Команды[0].Представление);
        ВыполняемаяКоманда.Вставить("Идентификатор",ДопОбработкаСсылка.Команды[0].Идентификатор);
        ВыполняемаяКоманда.Вставить("ВариантЗапуска",ДопОбработкаСсылка.Команды[0].ВариантЗапуска);
        ВыполняемаяКоманда.Вставить("ПоказыватьОповещение",ДопОбработкаСсылка.Команды[0].ПоказыватьОповещение);
        ВыполняемаяКоманда.Вставить("Модификатор",ДопОбработкаСсылка.Команды[0].Модификатор);
        ВыполняемаяКоманда.Вставить("ОбъектыНазначения",Неопределено);
        ВыполняемаяКоманда.Вставить("Вид",ДопОбработкаСсылка.Вид);
        ВыполняемаяКоманда.Вставить("ЭтоОтчет",Ложь);
    Иначе
        ВыполняемаяКоманда = Неопределено;
	КонецЕсли;    
КонецПроцедуры

&НаСервереБезКонтекста
Функция НачатьВыполнениеСервернойКомандыВФоне(ВыполняемаяКоманда, УникальныйИдентификатор)
	ИмяПроцедуры = "ДополнительныеОтчетыИОбработки.ВыполнитьКоманду";
	
	ПараметрыПроцедуры = Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды, ОбъектыНазначения");
	ПараметрыПроцедуры.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка;
	ПараметрыПроцедуры.ИдентификаторКоманды          = ВыполняемаяКоманда.Идентификатор;
	ПараметрыПроцедуры.ОбъектыНазначения             = ВыполняемаяКоманда.ОбъектыНазначения;
	
	НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
	НастройкиЗапуска.НаименованиеФоновогоЗадания = НСтр("ru = 'Дополнительные отчеты и обработки: Выполнение серверного метода обработки'");
	
	Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяПроцедуры, ПараметрыПроцедуры, НастройкиЗапуска);
КонецФункции
Показать
adhocprog; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот