Произвольный код в фоновом режиме
Разработка - Механизмы платформы 1С
Механизм фоновых заданий все чаще используется для распаралеливания задач. Подвисающее на несколько минут окно - уже не комильфо, а для каждой длительной операции пользователь хочет видеть прогресс бар. И все бы ничего пока код пишет программист, вставляет в конфигурацию и потом запускает, но как быть если код пишется в процессе и заранее не известен? Менеджер фоновых заданий для процедуры "Запустить" требует имя процедуры, код есть только в виде строки. Ограничения платформы? Не в этот раз!
Итак, прежде чем прикручивать педали, посмотрим что уже есть в БСП: ВыполнитьПроцедуруМодуляОбъектаОбработки(Параметры, АдресХранилища). Заполняем параметры:
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("ИмяОбработки", АдресФайлаНаСервере);
ПараметрыЗадания.Вставить("ИмяМетода", "ДлительнаяОперация");
ПараметрыЗадания.Вставить("ПараметрыВыполнения", СтруктураПараметров);
ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", Истина);
ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка",Неопределено);
Процедура получит внешнюю обработку из справочника или из файла(наш случай) и запустит указанный метод. Соль в том, что файл наш лежит на клиентском компьютере, местоположение на сервере скорее всего не доступно. Передаем файл на сервер и записываем его там:
&НаКлиенте
ДвоичныеДанные = новый ДвоичныеДанные(АдресФайлаОбработки());
ФайлОбработкиВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
&НаСервере
ДвоичныеДанныеНаСервере = ПолучитьИзВременногоХранилища(ФайлОбработкиВоВременномХранилище);
АдресФайлаНаСервере = КаталогВременныхФайлов()+ИмяФайла;
ДвоичныеДанныеНаСервере.Записать(АдресФайлаНаСервере);
&НаСервере
Функция АдресФайлаОбработки()
Возврат РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла;
КонецФункции
Итак, файл записали на сервере, запускаем фоновое задание, которому говорим запустить функцию из БСП, которая запустит наш метод из этого файла внешней обработки:
ДвоичныеДанныеНаСервере = ПолучитьИзВременногоХранилища(ФайлОбработкиВоВременномХранилище);
АдресФайлаНаСервере = КаталогВременныхФайлов()+ИмяФайла;
ДвоичныеДанныеНаСервере.Записать(АдресФайлаНаСервере);
СтруктураПараметров = Новый Структура("РезультатЗапроса,Код,Параметры",Результат[Результат.ВГраница()],Код,ПараметрыЗапроса);
НаименованиеЗадания = НСтр("ru = 'Длительная операция внешней обработки'");
ВыполняемыйМетод = "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки";
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("ИмяОбработки", АдресФайлаНаСервере);
ПараметрыЗадания.Вставить("ИмяМетода", "ДлительнаяОперация");
ПараметрыЗадания.Вставить("ПараметрыВыполнения", СтруктураПараметров);
ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", Истина);
ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка",Неопределено);
//ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка", Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Длительная операция"));
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
РезультатФоновогоЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(УникальныйИдентификатор,ВыполняемыйМетод, ПараметрыЗадания, ПараметрыВыполнения);
ИдентификаторЗадания = РезультатФоновогоЗадания.ИдентификаторЗадания;
Ну и наконец подключим обработчик ожидания, который будет мониторить работу нашего фонового процесса и выводить прогресс и сообщения:
ПодключитьОбработчикОжидания("ПроверкаФоновогоЗадания",1,Ложь);
&НаКлиенте
Процедура ПроверкаФоновогоЗадания()
Результат=ПроверкаФоновогоЗаданияНаСервере();
Если Результат = Неопределено Тогда
УбитьПроцесс(Неопределено);
Иначе
Если НЕ Результат.Состояние = "Задание выполняется" Тогда
УбитьПроцесс(Неопределено);
КонецЕсли;
КонецЕсли;
//Состояние("Выполняется алгоритм...",ПрогрессОбработки);
КонецПроцедуры
Функция ПроверкаФоновогоЗаданияНаСервере()
Результат = Новый Структура("Прогресс,Состояние");
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
ЗаполнитьЗначенияСвойств(Результат,Задание);
Результат.Состояние= СТрока(Результат.Состояние);
Если Задание = Неопределено Тогда
Возврат Неопределено;
Иначе
Сообщения=Задание.ПолучитьСообщенияПользователю(Ложь);
Для Каждого Сообщение ИЗ Сообщения Цикл
Если Лев(Сообщение.Текст,1) <> "{" Тогда
Сообщить(Сообщение.Текст);
КонецЕсли;
КонецЦикла;
Прогресс = ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторЗадания);
Если Прогресс <> Неопределено Тогда
ПрогрессОбработки = Прогресс.Процент;//?(Прогресс.Процент<>0,Прогресс.Процент,ПрогрессОбработки);
КонецЕсли;
Результат.Вставить("Прогресс",Прогресс);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура УбитьПроцесс(Команда)
УбитьПроцессНаСервере();
ОтключитьОбработчикОжидания("ПроверкаФоновогоЗадания");
Сообщить(""+ТекущаяДата()+" задание выполнено");
КонецПроцедуры
&НаСервере
Процедура УбитьПроцессНаСервере()
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Задание.Отменить();
Элементы.ГруппаФоновоеЗадание.Видимость=Ложь;
КонецПроцедуры
Стоит обратить внимание что в процедуре, исполняемой во внешней обработке можно выводить сообщения, но для вывода прогресса стоит использовать ДлительныеОперации.СообщитьПрогресс(Прогресс). В проверке задания на клиенте можно использовать метод Состояние("Выполняется алгоритм...",ПрогрессОбработки); где прогресс обработки - наше полученное из фонового задания значение прогресса. в этом случае в нижнем правом углу появится окно с процентами, которое будет видно даже если переключиться на другую вкладку, но лично мне это эстетически не нравится, и я рекомендую создать полосу с процентами на форме и менять значение там.
Все описанные методы постоянно используются мной при создании обработок и периодически дорабатываются. Будут предложения как улучшить - пишите в комментариях, если сам допилю - обновлю статью. Всем Удачи!
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Механизмы платформы 1С Разработчик Бесплатно (free)
Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?
16.07.2025 45725 TitanLuchs 109
Работа с интерфейсом WEB-интеграция Механизмы платформы 1С Бесплатно (free)
Веб-интерфейсы повышают качество внешнего вида приложений 1С, предсказуемы с точки зрения верстки, позволяют организовать удобные и высокопроизводительные рабочие места для пользователей. Расскажем об особенностях разработки веб-интерфейсов на React внутри 1С, двустороннем взаимодействии 1С и JavaScript, а также сборке веб-приложения в одностраничный файл.
19.06.2025 18727 zeegin 15
Механизмы платформы 1С Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).
03.02.2025 26067 bayselonarrend 127
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.
30.01.2025 33359 user2122906 10
Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Разработчик 1С:Предприятие 8 Бесплатно (free)
Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.
17.01.2025 55911 user2122906 13
Механизмы платформы 1С WEB-интеграция Разработчик 1С:Предприятие 8 Бесплатно (free)
В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.
14.01.2025 46877 dsdred 110
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
Особенности "Знач" и разбор документации к нему.
10.01.2025 26495 VAAngelov 60
Механизмы платформы 1С Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.
23.06.2024 40502 bayselonarrend 24
&НаКлиенте
//Процедура запускает загрузку и анализ файлов выгрузки
//
Процедура ЗагрузитьИЗаписать(Команда)
Состояние("Начало загрузки",1,"Начало загрузки данных");
ПараметрыКоманды =
ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);
ПараметрыКоманды.СопровождающийТекст = НСтр("ru = 'Подождите идет загрузка данных'");
ПараметрыКоманды.ФормаВладелец = ЭтаФорма;
ПараметрыКоманды.Вставить("Каталог", Объект.Каталог);
//ПараметрыКоманды.Вставить("Объект",Объект);
ПараметрыКоманды.Вставить("ТипЗагрузкиДокументов",Объект.ТипЗагрузкиДокументов);
ПараметрыКоманды.Вставить("НачПериода",Объект.НачПериода);
ПараметрыКоманды.вставить("КонПериода",Объект.КонПериода);
Обработчик = Новый ОписаниеОповещения("ПослеЗавершенияДлительнойОперации", ЭтотОбъект, ПараметрыКоманды.СопровождающийТекст);
ОбработчикПрогресса = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект);
ВыполнитьКомандуВФоне(Параметры.ИдентификаторКоманды, ПараметрыКоманды, Обработчик,ОбработчикПрогресса);
КонецПроцедуры
/// Процедура повторяет код общего модуля ДлительныеОперации.ВыпонитьвФоне . добавлен параметр оповещение о прогрессе выполнения. плюс изменены параметры структуры настройки ожидания
&НаКлиенте
Процедура ВыполнитьКомандуВФоне(Знач ИдентификаторКоманды, Знач ПараметрыКоманды, Знач Обработчик, Знач ОповещениеОПрогрессеВыполнения ) Экспорт
ИмяПроцедуры = "ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне";
ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
ИмяПроцедуры,
"ИдентификаторКоманды",
ИдентификаторКоманды,
Тип("Строка"));
ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
ИмяПроцедуры,
"ПараметрыКоманды",
ПараметрыКоманды,
Тип("Структура"));
ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
ИмяПроцедуры,
"ПараметрыКоманды.ДополнительнаяОбработкаСсылка",
ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыКоманды, "ДополнительнаяОбработкаСсылка"),
Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки"));
ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
ИмяПроцедуры,
"Обработчик",
Обработчик,
Новый ОписаниеТипов("ОписаниеОповещения, УправляемаяФорма"));
ПараметрыКоманды.Вставить("ИдентификаторКоманды", ИдентификаторКоманды);
ПолучатьРезультат = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыКоманды, "ПолучатьРезультат", Ложь);
Форма = Неопределено;
Если ПараметрыКоманды.Свойство("ФормаВладелец", Форма) Тогда
ПараметрыКоманды.ФормаВладелец = Неопределено;
КонецЕсли;
Если ТипЗнч(Обработчик) = Тип("ОписаниеОповещения") Тогда
ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(ИмяПроцедуры, "Обработчик.Модуль",
Обработчик.Модуль,
Тип("УправляемаяФорма"));
Форма = ?(Форма <> Неопределено, Форма, Обработчик.Модуль);
Иначе
Форма = Обработчик;
Обработчик = Неопределено;
ПолучатьРезультат = Истина; // для обратной совместимости
КонецЕсли;
Задание = ДополнительныеОтчетыИОбработкиВызовСервера.ЗапуститьДлительнуюОперацию(Форма.УникальныйИдентификатор, ПараметрыКоманды);
СопровождающийТекст = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыКоманды, "СопровождающийТекст", "");
Заголовок = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыКоманды, "Заголовок");
Если ЗначениеЗаполнено(Заголовок) Тогда
СопровождающийТекст = СокрЛП(Заголовок + Символы.ПС + СопровождающийТекст);
КонецЕсли;
Если Не ЗначениеЗаполнено(СопровождающийТекст) Тогда
СопровождающийТекст = НСтр("ru = 'Команда выполняется.'");
КонецЕсли;
//ОповещениеОПрогрессеВыполнения = Новый ОписаниеОповещения("ПрогрессВыполнения", ЭтотОбъект);
НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтаФорма);
НастройкиОжидания.ТекстСообщения = СопровождающийТекст;
НастройкиОжидания.ВыводитьОкноОжидания = Ложь; // Ставим ложь что бы убрать котика
НастройкиОжидания.ВыводитьПрогрессВыполнения = Истина;
НастройкиОжидания.ПолучатьРезультат = ПолучатьРезультат; // для обратной совместимости
НастройкиОжидания.ВыводитьСообщения = Истина;
НастройкиОжидания.ОповещениеОПрогрессеВыполнения = ОповещениеОПрогрессеВыполнения; // задаем наше оповещение о прогрессе выполнения
ДлительныеОперацииКлиент.ОжидатьЗавершение(Задание, Обработчик, НастройкиОжидания);
КонецПроцедуры
&НаКлиенте
Процедура ПрогрессВыполнения(Результат, ДополнительныеПараметры) Экспорт
Если Результат.Статус = "Выполняется" Тогда
Прогресс = Результат.Прогресс;
Если Прогресс <> Неопределено Тогда
Состояние (Прогресс.Текст, Прогресс.Процент,,);
КонецЕсли;
КонецЕсли;
КонецПроцедуры ПоказатьНу и соотвественно для сообщения прогресса использую ДлительныеОперации.СообщитьПроцесс
Строки и числа передаются в ПараметрыКоманды, а что посложнее можно запихать в эти параметры, но выскакивает ошибка.
Кроме того, без БСП процедуры и функции в модуле объекта видят реквизиты объекта, а если запускать через длительную операцию, то ничего не видят - все значения пустые.
Непонятно как этим пользоватся, как сложные типы данных передавать для выполнения в длительную операцию на БСП 3?
Я так понимаю тут речь идет о том как внешнюю не подключенную обработку, запущенную через файл выполнить в фоне.
В целом получилось.
Добавил на форму реквизит "ПрогрессОбработки", число. После того как убрал комент в
Состояние("Выполняется алгоритм...",ПрогрессОбработки);
Также добавил на форму реквизит "ИдентификаторЗадания", УникальныйИдентификатор.
Как сделать прогресс бар без состояния не понятно.
Если база файловая и запущена через конфигуратор в отладке, фоновое задание не стартует, но это уже вопрос к БСП.
Если подключить обработку во внешние вываливается ошибка при сохранении, я так понимаю для подключения не задумывалось.
Сделал вот такую команду:
&НаСервере
Процедура Команда1НаСервере(ФайлОбработкиВоВременномХранилище)
ИмяФайла = "Загрузка курсов валют НБРБ 2.0.epf";
ДвоичныеДанныеНаСервере = ПолучитьИзВременногоХранилища(ФайлОбработкиВоВременномХранилище);
АдресФайлаНаСервере = КаталогВременныхФайлов() + ИмяФайла;
ДвоичныеДанныеНаСервере.Записать(АдресФайлаНаСервере);
//СтруктураПараметров = Новый Структура("РезультатЗапроса,Код,Параметры", Результат[Результат.ВГраница()],Код,ПараметрыЗапроса);
ОбъектВЗначении = РеквизитФормыВЗначение("Объект");
ТекущийСписокВалют = ОбъектВЗначении.СписокВалют.Выгрузить();
СтруктураПараметров = Новый Структура();
СтруктураПараметров.Вставить("ДополнительнаяОбработкаСсылка", Объект.ОбъектСсылка);
//ПараметрыКоманды.Вставить("АдресРезультата", ПоместитьВоВременноеХранилище(Неопределено, Новый УникальныйИдентификатор()));
СтруктураПараметров.Вставить("СопровождающийТекст", НСтр("ru = 'Выполняется загрузка курсов валют...'"));
//СтруктураПараметров.Вставить("СписокВалют", ПолучитьАдресТаблицыВалют());
СтруктураПараметров.Вставить("СписокВалют", ТекущийСписокВалют);
СтруктураПараметров.Вставить("НачалоПериода", Объект.НачалоПериода);
СтруктураПараметров.Вставить("ОкончаниеПериода", Объект.ОкончаниеПериода);
НаименованиеЗадания = НСтр("ru = 'Длительная операция внешней обработки'");
ВыполняемыйМетод = "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки";
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("ИмяОбработки", АдресФайлаНаСервере);
ПараметрыЗадания.Вставить("ИмяМетода", "ВыполнитьКоманду");
ПараметрыЗадания.Вставить("ПараметрыВыполнения", СтруктураПараметров);
ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", Истина);
ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка",Неопределено);
//ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка", Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Длительная операция"));
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
РезультатФоновогоЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(УникальныйИдентификатор, ВыполняемыйМетод, ПараметрыЗадания, ПараметрыВыполнения);
ИдентификаторЗадания = РезультатФоновогоЗадания.ИдентификаторЗадания;
КонецПроцедуры
&НаКлиенте
Процедура Команда1(Команда)
ДвоичныеДанные = Новый ДвоичныеДанные(АдресФайлаОбработки());
ФайлОбработкиВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
Команда1НаСервере(ФайлОбработкиВоВременномХранилище);
ПодключитьОбработчикОжидания("ПроверкаФоновогоЗадания", 1, Ложь);
КонецПроцедуры
ПоказатьНужно еще назначить "имя файла" или на форме указывать, решил просто переменной записать.
ПараметрыЗадания.Вставить("ИмяМетода", Тут я так понял автор не сделал ремарку и не уточнил что это ваша процедура которая будет длительно выполняться. У меня в модуле обработки экспортная процедура в стиле БСП "ВыполнитьКоманду".
Также в "СтруктураПараметров" нужно указать ваши параметры, а не то что у автора. И вам нужно будет полностью под себя это сделать.
Плюс переписал
&НаСервере
Функция ПроверкаФоновогоЗаданияНаСервере()
Результат = Новый Структура("Прогресс, Состояние");
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Если Задание = Неопределено Тогда
Возврат Неопределено;
Иначе
ЗаполнитьЗначенияСвойств(Результат, Задание);
Результат.Состояние = Строка(Результат.Состояние);
Сообщения=Задание.ПолучитьСообщенияПользователю(Ложь);
Для Каждого Сообщение ИЗ Сообщения Цикл
Если Лев(Сообщение.Текст,1) <> "{" Тогда
Сообщить(Сообщение.Текст);
КонецЕсли;
КонецЦикла;
Прогресс = ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторЗадания);
Если Прогресс <> Неопределено Тогда
ПрогрессОбработки = Прогресс.Процент;//?(Прогресс.Процент<>0,Прогресс.Процент,ПрогрессОбработки);
КонецЕсли;
Результат.Вставить("Прогресс",Прогресс);
КонецЕсли;
Возврат Результат;
КонецФункции
ПоказатьВ итоге что-то и вышло, но толку ноль.
По уже писал обработку. Результат есть, но прогресса нет.
РеквизитФормыВЗначение("Объект").ИспользуемоеИмяФайла;Ошибка при сохранении связана с безопасным режимом, если у Вас полные права, то такой проблемы не возникает.
Чтобы не выводить прогресс через состояние для ПрогрессОбработки сделайте Элемент с видом Поле индикатора. СтруктураПараметров - понятное дело ваша, там параметры для процедуры, которую будем запускать. Для простоты можно сделать просто процедуру типа
Процедура ДлительнаяОперация(Параметры)
Выполнить(Параметры.Код);
КонецПроцедуры
и на самой форме
СтруктураПараметров = Новый Структура("Код",Код); //Код из реквизита формы
но это совсем упрощенно
ДлительныеОперации.СообщитьПрогресс(Окр(ПроцентВыполнения, 0), Описание);В которую и передавать процент выполнения, а далее обработчик ожидания, его прочитает и вставит в наш реквизит.
В этом случае же есть недостатки:
1. Нужно постоянно во все свои доработки вносить намыорму прогресс и код для фонового задания
2. Когда пользователь запустил длительный процесс, он может в форме продолжать что-то творить , т.к. она осталась не заблокированной.
Мне кажется удобнее когда форма прогресса открывактся отдельно с блокированием прогоесса.
P.s. Обработку посмотреть не могу, нет см.
Я хочу сформировать табличный документ. Каждая строчка которого долго делается.
В одной обработке в модуле объекта я пишу
Процедура ДлительнаяОперация() ЭКСПОРТ
Дата = ТекущаяДата();
Пока Дата <= Дата+60000 Цикл
Сообщить(ТекущаяДата());
КонецЦикла;
КонецПроцедуры Показатьтут мне надо получить какие то параметры и на их основе сформировать табличный документ.
так же я добавил сведения о внешней обработке и добавил ее в базу.
Потом я делаю еще 1 обработку:
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьнаСервере();
ПодключитьОбработчикОжидания("ПроверкаФоновогоЗадания",1,Ложь);
КонецПроцедуры
Процедура СформироватьнаСервере()
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("ИмяОбработки", Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("ПроверкаСтатусБар"));
СтруктураПараметров = Новый Структура();//("РезультатЗапроса,Код,Параметры",Результат[Результат.ВГраница()],Код,ПараметрыЗапроса);
НаименованиеЗадания = НСтр("ru = 'Длительная операция внешней обработки'");
ВыполняемыйМетод = "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОбработки";
ПараметрыЗадания = Новый Структура;
ПараметрыЗадания.Вставить("ИмяОбработки", Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("ПроверкаСтатусБар"));
ПараметрыЗадания.Вставить("ИмяМетода", "ДлительнаяОперация");
ПараметрыЗадания.Вставить("ПараметрыВыполнения", СтруктураПараметров);
ПараметрыЗадания.Вставить("ЭтоВнешняяОбработка", Истина);
ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка",Неопределено);
//ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка", Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Длительная операция"));
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
РезультатФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне(ВыполняемыйМетод,ПараметрыЗадания,ПараметрыВыполнения);
//ЗапуститьВыполнениеВФоне(УникальныйИдентификатор,ВыполняемыйМетод, ПараметрыЗадания, ПараметрыВыполнения);
ИдентификаторЗадания = РезультатФоновогоЗадания.ИдентификаторЗадания;
КонецПроцедуры
&НаКлиенте
Процедура ПроверкаФоновогоЗадания()
Результат=ПроверкаФоновогоЗаданияНаСервере();
Если Результат = Неопределено Тогда
УбитьПроцесс(Неопределено);
Иначе
Если НЕ Результат.Состояние = "Задание выполняется" Тогда
УбитьПроцесс(Неопределено);
КонецЕсли;
КонецЕсли;
//Состояние("Выполняется алгоритм...",ПрогрессОбработки);
КонецПроцедуры
&НаКлиенте
Процедура УбитьПроцесс(Команда)
УбитьПроцессНаСервере();
ОтключитьОбработчикОжидания("ПроверкаФоновогоЗадания");
Сообщить(""+ТекущаяДата()+" задание выполнено");
КонецПроцедуры
Функция ПроверкаФоновогоЗаданияНаСервере()
Рез = Новый Структура("Прогресс,Состояние");
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
ЗаполнитьЗначенияСвойств(Рез,Задание);
Рез.Состояние= СТрока(Рез.Состояние);
Если Задание = Неопределено Тогда
Возврат Неопределено;
Иначе
Сообщения=Задание.ПолучитьСообщенияПользователю(Ложь);
Для Каждого Сообщение ИЗ Сообщения Цикл
Если Лев(Сообщение.Текст,1) <> "{" Тогда
Сообщить(Сообщение.Текст);
КонецЕсли;
КонецЦикла;
Прогресс = ДлительныеОперации.ПрочитатьПрогресс(ИдентификаторЗадания);
Если Прогресс <> Неопределено Тогда
ПрогрессОбработки = Прогресс.Процент;//?(Прогресс.Процент<>0,Прогресс.Процент,ПрогрессОбработки);
КонецЕсли;
Рез.Вставить("Прогресс",Прогресс);
КонецЕсли;
Возврат Рез;
КонецФункции
&НаСервере
Процедура УбитьПроцессНаСервере()
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
Задание.Отменить();
// Элементы.ГруппаФоновоеЗадание.Видимость=Ложь;
КонецПроцедуры ПоказатьНа форме 2 обработки создал реквизит ИдентификаторЗадания типа УникальныйИдентификатор
Ну и ничего не работает.
Какой нибудь пример бы чистый.
И я не понимаю еще вот что, этот код опрашивает 1 раз фоновое задание. О каком статус баре идет речь не пойму. Сложно в общем что то
1) добавить 2 ключевых параметра Идентификатор команды - тип строка и ДополнительнаяОбработкаСсылка с типом Справочник ссылка Дополительные внешние отчеты и обработки
2) в модуле формы создать команду которая будет запускать длительную операцию ( но это не сама длительная операция ) см мой 19 ответ в этой теме процедура ЗагрузитьИЗаписать только надо будет заменит ВыполнитьКомандуВФоне на ДлительныеОперацииКлиент.ВыполнитьКомандуВФоне
3) В модуле объекта пишешь функцию регистрации внешней обработки (сведения о внешней обработке )
И добавляешь процедуру ВыполнитьКоманду ( ИдентификаторКоманды,Параметрывыполнения) - тут могу ошибиться как звучит второй параметр , в которой реализуешь свою длительную операцию
Вот и все
Просто не понимаю зачем такие сложности получить обработку - передать на сервер и т.д. и т.п. Если есть внешняя обработка код которой нужно выполнить в фоне то это делается просто
Плюс вам писали про стандартные методы БСП и Вы сказали что Вам не нравится что нет идентификатора задания и котик вам не нравится и хотелось бы получать прогресс , но как я Вам уже отвечал это все решаемо , как раз Ваша статья на ряду с другими на эту тему натолкнула меня на мысль написать хотя она повторят то чт оо чем я писал тут выше
...
ПараметрыКоманды.Вставить("Каталог", Объект.Каталог);
//ПараметрыКоманды.Вставить("Объект",Объект);
ПараметрыКоманды.Вставить("ТипЗагрузкиДокументов",Объект.ТипЗагрузкиДокументов);
ПараметрыКоманды.Вставить("НачПериода",Объект.НачПериода);
ПараметрыКоманды.вставить("КонПериода",Объект.КонПериода);
...
Можно ли в этих параметрах передавать что то сложнее чем число или сторку? Хотел бы передать ТЗ и КомпановщикНастроек.
В процедуре формы оборачивал нужную переменную в структуру, а потом помещал в хранилище.
При попытке получить переменные в "Процедура ВыполнитьКоманду" из временного хранилища по переданным адресам ничего нет.
Получается варианта два - либо я неправильно передаю, либо это вообще передавать не нужно.
Для чего все это. В модуле объекта внешней обработки я в цикле формирую отчеты (по времени долго), для которых и пытаюсь передать отборы любым способом, и все это пытаюсь передать на сервер для организации длительной обработки. Внешнюю обработку естественно помещаю в "Дополнительные отчеты и обработки".
Как можно обойтись без этого?
АдресВХранилищеОтборы = ПоместитьВоВременноеХранилище(Объект.Отборы, Новый УникальныйИдентификатор);Отборы - реквизит объекта внешней обработки, тип "КомпоновщикНастроекКомпоновкиДанных"
"Ошибка при выполнении запроса POST к ресурсу /e1cib/files/9ead0971-78e9-4061-8983-34f3c58b5395:
Переданное значение не может быть помещено во временное хранилище".
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 842660
Создание 03.09.18 14:49
Обновление 03.09.18 14:49
Просмотры 53686
Загрузки 0
Рейтинг
218
Комментарии 43
Код открыт Да
Рубрики Механизмы платформы 1С
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)