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