Версия для печати темы (https://pro1c.org.ua/index.php?s=9f771e43c0093988ebf3055301d640e7&showtopic=67605)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Виконати фонове завдання на сервері з обробки

Автор: Slon747 12.08.24, 9:51

Процедура СформироватьНалоговыеНакладные() знаходиться в модулі менеджера обробки та працює.
Я хочу перенести її в модулі об'екта, але тоді отримую помилку "Метод обїекта не обнаружен".
Як це зробити?

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

Автор: AnryMc 12.08.24, 10:10

Slon747 @ Сегодня, 10:51 * ,

1) А зачем?
2) Волшебное слово: "Экспорт"
3) А надо ли: "&НаСервере"?
4) Её можно вызвать только для СУЩЕСТВУЮЩЕГО объекта (открыт или получен)

    
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
    ОбработкаОбъект.МояПроцедураВМодулеОбъекта();

Автор: Slon747 12.08.24, 10:33

AnryMc,
1. Затем, что модуль менеджера не сохраняется во внешней обработке, а только в конфигурации.
2. Если бы не было Экспорт, то и из модуля менеджера не выполнялась бы
4. Речь про выполнение в фоне через "ДлительныеОперации.ВыполнитьВФоне"

Автор: Vofka 12.08.24, 11:18

Не уверен лучшее ли это решение, но что если создать где-то в общем модуле процедуру, в которой будет что-то типа:

Обработка = Обработки.ФормированиеНалоговыхНакладных_Новая.ПолучитьОбъект();
Обработка.СформироватьНалоговыеНакладные();


И, соответственно, вместо
ВыполняемыйМетод    = "Обработки.ФормированиеНалоговыхНакладных_Новая.СформироватьНалоговыеНакладные";


сделать вызов процедуры общего модуля.

Автор: Slon747 12.08.24, 11:45

Vofka @ Сегодня, 12:18 * ,

В бухгалтерии BAS сделано так:

    ВыполнитьБезФоновогоЗадания = Не ПараметрыВыполнения.БезРасширений
        И (ОбщегоНазначенияКлиентСервер.РежимОтладки() Или ПараметрыВыполнения.ЗапуститьНеВФоне
            Или (ЕстьФоновыеЗаданияВФайловойИБ() И Не ПараметрыВыполнения.ЗапуститьВФоне)
            Или Не ВозможноВыполнитьВФоне(ИмяПроцедуры));

Функция ВозможноВыполнитьВФоне(ИмяПроцедуры)
    
    ЧастиИмени = СтрРазделить(ИмяПроцедуры, ".");
    Если ЧастиИмени.Количество() = 0 Тогда
        Возврат Ложь;
    КонецЕсли;
    
    ЭтоВнешняяОбработка = (ВРег(ЧастиИмени[0]) = "ВНЕШНЯЯОБРАБОТКА");
    ЭтоВнешнийОтчет = (ВРег(ЧастиИмени[0]) = "ВНЕШНИЙОТЧЕТ");
    Возврат Не (ЭтоВнешняяОбработка Или ЭтоВнешнийОтчет);

КонецФункции


Тем самым без изменения типовой логики общих модулей (или создания своих собственных с нужными процедурами) это работать не будет, т.к. ожидает или отчет или обработку.
off: Боже, как я не навижу УФ

Автор: AnryMc 12.08.24, 14:49

Slon747 @ Сегодня, 12:45 * ,

Кусок рабочего кода:

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

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

&НаСервере
Функция ПечатьВФоне(СсылкаНаОбъект)
    ОбъектВПФ=РеквизитФормыВЗначение("Объект");
    ////////////СсылкаНаВПФ=Справочники.ДополнительныеОтчетыИОбработки.НайтиПоРеквизиту("ИмяОбъекта","ВПФФоном");
    СсылкаНаВПФ=Параметры.ДополнительнаяОбработкаСсылка;
    Макет=ОбъектВПФ.ПолучитьМакет("МакетПечати");
    
    //Это что вызываем
    ПараметрыЗадания = Новый Структура;
    ПараметрыЗадания.Вставить("ИмяОбработки", "ВнешняяОбработка.ВПФФономИсторияОбъекта");
    ПараметрыЗадания.Вставить("ИмяМетода", "Печать");
    ПараметрыЗадания.Вставить("ПараметрыВыполнения", Новый Структура("СсылкаНаОбъект,Макет", СсылкаНаОбъект,Макет));
    ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", Истина);
    ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка",СсылкаНаВПФ);
    
    //Это как вызываем
    ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
    ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Запуск длительного формирования ВПФ";;
    ПараметрыВыполнения.ЗапуститьВФоне = Истина;
    ПараметрыВыполнения.ОжидатьЗавершение=0.1;    //Нет смысла ждать!!!
    
    //запускаем выполнение фонового задания
    Возврат ДлительныеОперации.ВыполнитьВФоне("ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки", ПараметрыЗадания, ПараметрыВыполнения);
КонецФункции // ЗапуститьФормированиеВПФ()


&НаКлиенте
Процедура ПечатьЗавершение(Результат, ДополнительныеПараметры) Экспорт
     Если Результат = Неопределено Тогда
        Возврат;
    ИначеЕсли Результат.Статус = "Ошибка" Тогда
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Результат.ПодробноеПредставлениеОшибки);
    ИначеЕсли Результат.Статус = "Выполнено" Тогда
        ТабДок=ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
        ТабДок.Показать();
    КонецЕсли;    
КонецПроцедуры


Обратите внимание на:
//запускаем выполнение фонового задания
Возврат ДлительныеОперации.ВыполнитьВФоне("ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки", ПараметрыЗадания, ПараметрыВыполнения);

//Это что вызываем
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("ИмяОбработки", "ВнешняяОбработка.ВПФФономИсторияОбъекта");
ПараметрыЗадания.Вставить("ИмяМетода", "Печать");
ПараметрыЗадания.Вставить("ПараметрыВыполнения", Новый Структура("СсылкаНаОбъект,Макет", СсылкаНаОбъект,Макет));
ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", Истина);
ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка",СсылкаНаВПФ);

Пример можно скачать: https://pro1c.org.ua/topic/vneshnya-pechatnaya-forma-istoriya-obekta-fonom-67202/



Автор: Slon747 12.08.24, 15:54

AnryMc, спасибо, почти заработало.
Только не понял, как передать параметры в выполняемую функцию.
В моем изначальном коде так:

    ПараметрыЗапуска = Новый Структура("Период", Период);
//тут передаю параметры для использования в функции СформироватьНалоговыеНакладные() менеджера обработки
СтруктураФоновогоЗадания = ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор);

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

КонецФункции


Цитата(AnryMc @ 12.08.24, 15:49) *
Пример можно скачать: Внешня печатная форма "История объекта фоном"

А где взять пароль на архив?

Автор: AnryMc 12.08.24, 16:13

Цитата(Slon747 @ 12.08.24, 16:54) *
А где взять пароль на архив?


Прочитать правила форума 32542460.gif

https://pro1c.org.ua/index.php?act=announce&f=36&id=2

Пункт: 14

Заодно: Возможность поблагодарить отвечающего

Автор: Slon747 12.08.24, 17:07

Цитата(AnryMc @ 12.08.24, 17:13) *
Правила и условия публикации сообщений на форуме


Прикол в том, что я был на странице правил и поиском по строке "пароль" не нашел это слово.
Это потому что гласные в слове "Пароль" на странице правил - в английской раскладке.

Автор: Vofka 12.08.24, 18:57

Цитата(Slon747 @ 12.08.24, 18:07) *
Прикол в том, что я был на странице правил и поиском по строке "пароль" не нашел это слово.
Это потому что гласные в слове "Пароль" на странице правил - в английской раскладке.

Зачем же так сделано... mamba.gif

Автор: AnryMc 13.08.24, 13:40

Slon747 @ Вчера, 18:07 * ,

Там не только "а", но и "о" - тоже

Автор: Slon747 13.08.24, 15:27

AnryMc @ Сегодня, 14:40 * ,
ну я и сказал "гласные"

Автор: AnryMc 13.08.24, 16:53

Vofka @ Вчера, 19:57 * ,


Строка поиска GOOGLE

Цитата
https://pro1c.org.ua/index.php?act=announce&f=36&id=2 пароль


ответ:
Цитата
ПРАВИЛА (редакция 2 от 08.04.2016)
Украинский форум 1С
https://pro1c.org.ua › ...
фирму 1С. 14. Файлы, которые скачаны у нас из раздела Хранилище вероятнее всего будут зaпаpолены. Пaрoль на архив:
ХХХХХХХХХХХХХХХ
Цитата
. Так же такой паpоль может ...

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua