1с ошибка выполнения фонового задания длительные операции
Для выполнения длительных операций в версиях конфигурации на базе БСП 3.0/3.1 служит следующая функция в общем модуле ДлительныеОперации:
Описание этой функции в версии БСП 3.0 отличается от ее описания в версии БСП 3.1
Сложности возникают, когда обработка является внешне. В описании функции в версии БСП 3.0 написано так:
Запустить выполнение процедуры в фоновом задании, если это возможно.
При выполнении любого из следующих условий запуск выполняется не в фоне, а сразу в основном потоке:
Согласно этому описанию, функция ВыполнитьВФоне в версии БСП 3.0 не выполняется в фоновом режиме если выполняется процедура модуля внешней обработки. Это не совсем так или я не совсем понял что, тут имеется ввиду. Тем не менее я решил показать простой пример выполнения длительной операции во внешней обработке для БСП 3.0/3.1.
Следует отметить, что в описании функции ВыполнитьВФоне в версии БСП 3.1 рекомендуется вместо этой функции использовать функции ВыполнитьФункцию и ВыполнитьПроцедуру.
Вызываемые функции могть быть с произвольным числом параметров, но не более 7. Значения передаваемых параметров функции, а также возвращаемое значение должны быть сериализуемыми.
Особенность выполнения длительной операции во внешней обработке заключается в том, что она должна быть в списке справочника дополнительных внешних обработок. В общем виде процесс запуска и обработки результата длительной операции во внешней обработке выглядит следующим образом:
2 При открытии обработки проверить открыто ли обработка из справочника внешних обработок и возможность запуска в фоне:
3) В модуле объекта внешней обработки я добавил процедуру расчета ВыполнитьРасчетВФоне , которая будет исполняться в фоне и функцию ВыполнитьРасчет. которая будет выполняться не фоне если не возможно выполнить расчет в фоне ( Следует отметить, что длительные процедуры должны располагаться только в менеджере объекта или в серверном общем модуле или в модуле внешней обработки):
3) Запуск операции на сервере и подключение обработчика ожидания если это возможно:
4 )Начать расчет в фоне или не в фоне
Следует отметить, что функция ПараметрыВыполненияВФоне, которая возвращает структуру параметров выполнения отсутствует в БСП3.1.. Вместо этой функции используется ПараметрыВыполненияФункции и ПараметрыВыполненияПроцедуры
5) Обработка результата длительной операции:
Например , если параметр ТаблицаДанных имеет тип ДанныеФормыЭлементКоллекции, то нужно преобразовать на тип ТаблицаЗначений с помощью метода выгрузить таким образом
В описании механизма длительных операции написано, что все значения параметров фонового задания должны поддерживать сериализацию (речь идет о сериализации, а не о ХМL – сериализации). Сериализация — это преобразование объекта или дерева объектов в какой-либо формат с тем, чтобы потом эти объекты можно было восстановить из этого формата. А XML – сериализация – это процесс преобразования данных 1С:Предприятия 8 в последовательность данных формата XML и наоборот, прежде всего для обмена данными между различными информационными базами 1С:Предприятия.
В этой статье мы разберем, как обрабатывать длительные операции в 1С асинхронно, то есть таким образом, чтобы дать пользователю возможность продолжить работу, не дожидаясь завершения операции. А также перенести всю нагрузку по выполнению таких операций на сервер.
Для таких операций разработчики систем 1С рекомендуют использовать Фоновые задания. В последних версиях типовых конфигураций они оформляются окошком с котом.
Мы рассмотрим вариант, в котором дополнительно выводится прогресс выполнения операций в процентах.
В нашем примере длительная операция запускается нажатием кнопки на форме, поэтому на форме были созданы:
- сама кнопка,
- команда, привязанная к этой кнопке,
- клиентская процедура, запускаемая командой.
Клиентская процедура запускает фоновое задание на сервере и подключает обработчик ожидания завершения этого задания. Содержимое серверной функции, запускающей фоновое задание, приведем далее. При подключении обработчика ожидания устанавливаются несколько параметров:
НаименованиеЗадания = НСтр ( "ru = 'Получение платежных операций'" ) ; ВыполняемыйМетод = "Обработки.аш_ФормированиеБухгалтерскихДокументов.ПолучитьПлатежныеОперации" ; ПараметрыПроцедуры . Вставить ( "_Объект" , новый Структура ( "Период, ОтборПравил, СформированныеДокументы, ИдентификаторФормы" , Объект . Период , Объект . ОтборПравил . Выгрузить ( ) , Объект . СформированныеДокументы . Выгрузить ( ) , УникальныйИдентификатор ) ) ; ПараметрыВыполнения = ДлительныеОперации . ПараметрыВыполненияВФоне ( УникальныйИдентификатор ) ; ПараметрыВыполнения . НаименованиеФоновогоЗадания = НаименованиеЗадания ; ПараметрыВыполнения . Вставить ( "ИдентификаторФормы" , УникальныйИдентификатор ) ; Возврат ДлительныеОперации . ВыполнитьФункцию ( УникальныйИдентификатор , ВыполняемыйМетод , ПараметрыПроцедуры ) ;Данная серверная функция запускает выполнение фонового задания. В этой функции нужно определить:
После этого необходимо создать экспортную функцию, которая будет выполняться в фоновом режиме. Эта функция описана в переменной ВыполняемыйМетод и в нашем случае расположена в модуле менеджера обработки. Функция содержит один обязательный параметр. В нашем случае он называется Параметры, и в него передается структура из переменной ПараметрыПроцедуры.
Функция ПолучитьПлатежныеОперации ( Параметры ) Экспорт //Здесь должен находиться код, определяющий выполнение длительной процедуры //Пример передачи прогресса выполнения фонового задания ДлительныеОперации . СообщитьПрогресс ( Окр ( Процент , 0 ) ) ;Если мы хотим отразить в окне длительной операции прогресс выполнения, то периодически (например, при каждой итерации некоего цикла) нужно рассчитывать процент выполнения и передавать его в клиентское окно с помощью процедуры ДлительныеОперации.СообщитьПрогресс(Процент).
Функция возвращает некий результат, который будет помещен во временное хранилище. Оттуда мы его получим и обработаем в процедуре, вызываемой при завершении фонового задания. Эта процедура клиентская, экспортная, создается на форме, с которой запускалась длительная операция.
Процедура ПолучитьПлатежныеОперацииЗавершение ( Результат , ДополнительныеПараметры ) Экспорт ПоказатьПредупреждение ( , Результат . КраткоеПредставлениеОшибки ) ; ДлительныеОперацииЗавершениеНаСервере ( Результат . АдресРезультата ) ;Эта процедура имеет два обязательных параметра: Результат и ДополнительныеПараметры. В переменной Результат содержится статус выполнения задания и адрес временного хранилища с самим результатом, возвращенным в нашем случае функцией ПолучитьПлатежныеОперации() из модуля менеджера обработки.
В данной процедуре мы прежде всего проверяем, не равна ли переменная Результат значению Неопределено (это значение возвращается, если пользователь отменил длительную операцию). Если нет, то проверяем, не было ли ошибок при выполнении фонового задания. Если ошибок не было, то запускаем процедуру, в которую передаем адрес временного хранилища с результатом длительной операции.
Использование общих модулей "Длительные операции" позволяет перенести всю тяжесть исполнения ресурсоемких процедур на сторону сервера, не мешая при этом работе клиентского приложения, инициировавшего этот процесс, т.е. не мешая дальнейшей работе пользователя в приложении. Описанная возможность реализуется в модулях БСП за счет исполнения "тяжелых" процедур на сервере в фоновом режиме (запуску фоновых заданий под каждую процедуру).
Ниже приведены процедуры, позволяющие реализовать в любой форме возможность выполнения необходимой вам длительной операции в фоновом режиме. Для этого в форме обязательно должны содержаться два реквизита "АдресХранилища" (типа строка) и "ИдентификаторЗадания" (типа уникального идентификатора), в модуле формы должна быть объявлена клиентская переменная "ПараметрыОбработчикаОжидания". Помимо этого экспортная процедура длительной операции должна содержать в себе два параметра "СтруктураПараметров" (типа структуры) и "АдресХранилища" (типа строка), результат исполнения должен быть помещен во временное хранилище, а адрес в нем должен быть присвоен параметру "АдресХранилища".
Далее кратко рассмотрим назначение процедур, размещенных в модуле формы, из которой будет инициироваться запуск длительной операции.
Процедура является обработчиком команды, отображаемой на форме, инициирующей запуск длительной операции. В ней производится передача исполнения на сервер и получение результата выполнения. В случае, если результат для отображения пользователю еще не готов, то наша операция "квалифицируется" как длительная, и производится подключение обработчика ожидания для периодической проверки выполнения фонового задания, исполняющего нашу длительную операцию.
Собственно сама серверная процедура, которая запускает необходимую нам длительную операцию, вызов которой будет произведен из "ИмяМодуля.ИмяЭкспортнойПроцедуры". Также в этой процедуре заполняется структура параметров, необходимых для исполнения длительной операции, и запоминается идентификатор фонового задания, под которым выполняется длительная операция.
Процедура обработчика ожидания мониторит выполнение запущенного нами фонового задания, в случае успеха - результат выполнения длительной операции извлекается из временного хранилища по адресу "АдресХранилища", в противном случае обработчик ожидания подключается заново для следующей очередной проверки.
Использование процедур общих модулей "Длительные операции", входящих в состав БСП, позволяет довольно удобным и быстрым способом осуществить в конфигурации выполнение необходимых длительных ресурсоемких операций, инициируемых пользователями системы, на стороне сервера в фоновом режиме, что делает работу пользователей в приложении более комфортной и производительной ( не блокируется весь пользовательский интерфейс на время выполнения длительной операции и возможность параллельного запуска нескольких длительных операций).
Статья предназначена для программистов и администраторов, работающих с большими объемами данных. При этом в самой обработке есть понимание объема обрабатываемых данных и, как следствие, возможно отображение прогресса и хода обработки.
Предполагается, что имеются общие представления об использовании длительных операций в БСП. В противном случае рекомендую ознакомиться с этой статьей.
Использовалась БСП версии 2.3. На более ранних версиях это не работает, там нет такого программного интерфейса.
Прогресс выполнения
Если при выполнении длительных операций в фоне вам (или пользователям) не хочется просто смотреть на вращающийся кружок, а хочется знать, сколько обработалось данных и что в текущий момент обрабатывается, то в БСП есть механизм визуализации прогресса.
Процедура, являющаяся обработчиком команды, отображаемой на форме.
В ней производится передача исполнения на сервер в процедуру, инициирующую запуск длительной операции. После чего начинается ожидание завершения длительной операции.
Теперь в своей форме не надо описывать обработчики ожидания и запоминать идентификаторы заданий. Достаточно передать описание оповещения, которое вызовется при окончании фонового задания.
Если задание не завершится в течение 2 секунд, то вызовется форма ожидания, на которой будет отображаться прогресс выполнения операции и описание текущего действия.
Серверная процедура, инициирующая запуск длительной операции
В данной процедуре формируются параметры запуска, и инициируется запуск длительной операции методом ВыполнитьВФоне.
В самой процедуре длительной операции "ИмяМодуля.ИмяЭкспортнойПроцедуры" необходимо сообщать о прогрессе выполнения и описание текущего действия.
Процедура обработки результата
Данная процедура инициируется после завершения длительной операции. При завершении операции с ошибками есть возможность обработать их.
В случае успешного выполнения длительной операции, результат будет находиться во временном хранилище, находящемуся по адресу "Результат.АдресРезультата".
Вот такая форма будет вызвана типовым кодом БСП:
Работаем над юзабилити
В текущем окне ожидания завершения длительной операции, на мой взгляд, есть следующие недостатки:
- Нет наглядности индикации прогресса. Выводится только текст, хотя есть возможность отображать индикатор.
- Нет оценки оставшегося времени выполнения операции.
- При нажатии на "Отмена" не отменяется фоновое задание, а просто закрывается форма.
- Перенести форму "ДлительнаяОперацияНовая" из обработки, приложенной к статье, в общие формы конфигурации.
- Заменить имя вызываемой формы ожидания в процедуре "ДлительныеОперацииКлиент.ОжидатьЗавершение" с "ОбщаяФорма.ДлительнаяОперация" на "ОбщаяФорма. ДлительнаяОперацияНовая ".
Отладка длительных операций
И небольшой бонус (может кому будет полезным) - для отладки длительных операций в текущем сеансе достаточно запустить 1С:Предприятие с параметром запуска "РежимОтладки". Об этом кратко упоминается в документации . В этом случае не будет запущено фоновое задание, а переданную функцию система запустит в текущем сеансе. Это отлаживать намного удобнее.
Читайте также: