Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
12 сен 2025, 02:12

Запуск ВО

Автор sali, Вчера в 08:50

0 Пользователей и 1 гость просматривают эту тему.

Denis1010

Вот пример кода на программный запуск внешней обработки (из дополнительных отчетов и обработок)

&НаКлиенте
Процедура итп_ВыгрузитьДанныеПоАкционнымЦенам(Команда)
         
    вКоманда = Новый Структура;
    ЗаполнитьСтруктуруВыполняемойКоманды(вКоманда, "Выгрузка файлов (акционные цены)");
    Если ЗначениеЗаполнено(вКоманда) Тогда
        ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
        НСтр("ru = 'Команда ""%1"" подготовлена к исполнению.'"),вКоманда.Представление);
        // оповещаем себя о том, что команда подготовлена и передается на исполнение
        //ПоказатьОповещениеПользователя(ЗаголовокСостояния + "...", , , БиблиотекаКартинок.ДлительнаяОперация48);
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = ЗаголовокСостояния;
        Сообщение.Сообщить();
       
        // вызываем процедуру исполнения команды в фоне на сервере
        ДлительнаяОперация = НачатьВыполнениеСервернойКомандыВФоне(вКоманда, УникальныйИдентификатор);
        // подготавливаем данные и выводим "ожидающее" оповещение
        ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
        НСтр("ru = 'Команда ""%1"" выполняется.'"),вКоманда.Представление);
        ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
        ПараметрыОжидания.ТекстСообщения = ЗаголовокСостояния;
        // не будем оповещать себя после завершения штатным образом
        ПараметрыОжидания.ОповещениеПользователя.Показать = Ложь;
        // а вот окно "ожидания" просим показать
        ПараметрыОжидания.ВыводитьОкноОжидания = Истина;
        // непосредственно "ожидаем"
        ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеЗавершенияВыполнения", ЭтотОбъект, вКоманда);
        ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания);
    КонецЕсли;
       
КонецПроцедуры

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

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

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

sali

Цитата: antoneus от Вчера в 11:49Так через доп обработки работает же,
я не подвязывал еще во к процедуре команды, пока у меня не работает

sali

Цитата: antoneus от Вчера в 11:49зачем костыли-то эти?
ну через регистр это тоже как из вариантов. сижу туплю щас что за Запись, где процедура находиться должна. почему идентификатор не определяет....короче

sali

Denis1010, емааааа :o  :o
и ведь реально кому-то нужно было. спасибо, товарищи :ooifh:

sali

есть еще варианты как из модуля объекта обратиться к процедуре в модуле формы?? не дублируя процедуру с формы в модуль объекта

Denis1010

Цитата: sali от Вчера в 13:45есть еще варианты как из модуля объекта обратиться к процедуре в модуле формы?? не дублируя процедуру с формы в модуль объекта
Перетащить процедуру в модуль объекта, удалить из модуля формы и на форме вызывать процедуру из объекта

antoneus

Нет таких вариантов.

sali

antoneus, да бляха
я уже и так обращаюсь не к процедуре выполнения команды , а к самой процедуре получение которая в общем модуле находиться. но у нее есть 3 обязательных параметра, которые с формы берутся. получилось регламент создать в обработке регламенты и фоновые задания ,
&Вместо("ВыполнитьОбработкуПоРегламентномуЗаданию")
Процедура ЭДОН_ВыполнитьОбработкуПоРегламентномуЗаданию(ВнешняяОбработка, ИдентификаторКоманды)
ОбщегоНазначения.ПриНачалеВыполненияРегламентногоЗадания(Метаданные.РегламентныеЗадания.ЗапускДополнительныхОбработок);

// Запись журнала регистрации
ЗаписатьИнформацию(ВнешняяОбработка,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Команда %1: Запуск.'"), ИдентификаторКоманды));

// Выполнение команды
Попытка     

Если ТипЗнч(ИдентификаторКоманды) = Тип("ПеречислениеСсылка.ЭДОН_РегламентныеЗаданиеРасширение")  Тогда

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

Иначе

ПродолжитьВызов(ВнешняяОбработка, ИдентификаторКоманды);

КонецЕсли;

ВыполнитьКоманду(Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды", ВнешняяОбработка, ИдентификаторКоманды), Неопределено);
Исключение
ЗаписатьОшибку(
ВнешняяОбработка,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Команда %1: Ошибка выполнения:
|%2'"),
ИдентификаторКоманды, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())));
КонецПопытки;

// Запись журнала регистрации
ЗаписатьИнформацию(ВнешняяОбработка,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Команда %1: Завершение.'"), ИдентификаторКоманды));

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

пытаюсь отладить кусок кода, на первую строку реагирует дальше уходит куда-то. как быть?

sali

пишет постоянноСнимок экрана 2025-09-11 173429.png

sali

или но здесь еще понятно почему, я получение формы вперед поставил
Снимок экрана 2025-09-11 174221.png

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск