Содержание:
Файлы материала
Описание
Все серверные вызовы, которые могут длиться больше 8 секунд 1С рекомендует реализовывать через длительные операции, более подробно из официальных источников можно почитать тут.
В данной статье приведен пример “Внешней обработки со сложным расчетом” и “Обработки с командой запуска” этого расчета в фоновом режиме – через “Длительную операцию” (протестировано на ЗУП 3.1 с БСП 3.1.7.343).
“Внешняя обработка со сложным расчетом” предварительно должна быть подключена в разделе Администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки.
Листинг кода “Обработки с командой запуска”
Формируем команду запуска внешней обработки и выполняем ее в фоне через длительную операцию.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
#Область ОбработчикиКомандФормы &НаКлиенте Процедура ЗапуститьВыполнениеСложногоРасчета(Команда) // 1. Заполнение команды вызова "Внешней обработки" ВыполняемаяКоманда = Новый Структура( "Ссылка, Представление, |Идентификатор, ВариантЗапуска, ПоказыватьОповещение, |Модификатор, ОбъектыНазначения, ЭтоОтчет, Вид"); ЗаполнитьКомандуНаСервере(ВыполняемаяКоманда); Если Не ЗначениеЗаполнено(ВыполняемаяКоманда.Ссылка) Тогда Возврат; КонецЕсли; ЗаголовокСостояния = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Выполняется команда ""%1""'"), ВыполняемаяКоманда.Представление); // 2. Запуск фонового задания на сервере. ДлительнаяОперация = НачатьВыполнениеСервернойКомандыВФоне(ВыполняемаяКоманда, УникальныйИдентификатор); // 3. Подключение обработчика завершения фонового задания ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); ПараметрыОжидания.ТекстСообщения = ЗаголовокСостояния; ПараметрыОжидания.ОповещениеПользователя.Показать = Истина; ПараметрыОжидания.ВыводитьОкноОжидания = Истина; ВыполняемаяКоманда.ЭтоОтчет = Ложь; ОповещениеОЗавершении = Новый ОписаниеОповещения("ПослеЗавершенияВыполненияСервернойКомандыВФоне", ЭтотОбъект, ВыполняемаяКоманда); ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, ОповещениеОЗавершении, ПараметрыОжидания); КонецПроцедуры #КонецОбласти #Область СлужебныеПроцедурыИФункции &НаСервереБезКонтекста Процедура ЗаполнитьКомандуНаСервере(ВыполняемаяКоманда) СсылкаОбработка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Внешняя обработка со сложным расчетом"); ВыполняемаяКоманда.Ссылка = СсылкаОбработка; ВыполняемаяКоманда.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка(); ВыполняемаяКоманда.Представление = НСтр("ru = 'Выполнить сложный расчет'"); ВыполняемаяКоманда.Идентификатор = "АВ_ВыполнеиеСложногоРасчета"; ВыполняемаяКоманда.ВариантЗапуска = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(); ВыполняемаяКоманда.ЭтоОтчет = Ложь; КонецПроцедуры &НаСервере Функция НачатьВыполнениеСервернойКомандыВФоне(ВыполняемаяКоманда, УникальныйИдентификатор) ИмяПроцедуры = "ДополнительныеОтчетыИОбработки.ВыполнитьКоманду"; ПараметрыПроцедуры = Новый Структура("ДополнительнаяОбработкаСсылка, ИдентификаторКоманды, ОбъектыНазначения"); ПараметрыПроцедуры.ДополнительнаяОбработкаСсылка = ВыполняемаяКоманда.Ссылка; ПараметрыПроцедуры.ИдентификаторКоманды = ВыполняемаяКоманда.Идентификатор; ПараметрыПроцедуры.ОбъектыНазначения = ВыполняемаяКоманда.ОбъектыНазначения; НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор); НастройкиЗапуска.НаименованиеФоновогоЗадания = НСтр("ru = 'Дополнительные отчеты и обработки: Выполнение серверного метода обработки'"); Возврат ДлительныеОперации.ВыполнитьВФоне(ИмяПроцедуры, ПараметрыПроцедуры, НастройкиЗапуска); КонецФункции &НаКлиенте Процедура ПослеЗавершенияВыполненияСервернойКомандыВФоне(Задание, ВыполняемаяКоманда) Экспорт Если Задание = Неопределено Тогда Возврат; КонецЕсли; Если Задание.Статус = "Ошибка" Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Не удалось выполнить команду по причине: |%1.'"), Задание.КраткоеПредставлениеОшибки); Иначе Результат = ПолучитьИзВременногоХранилища(Задание.АдресРезультата); ОповеститьФормы = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Результат, "ОповеститьФормы"); Если ОповеститьФормы <> Неопределено Тогда СтандартныеПодсистемыКлиент.ОповеститьФормыОбИзменении(ОповеститьФормы); КонецЕсли; КонецЕсли; КонецПроцедуры #КонецОбласти |
Листинг кода “Внешней обработки со сложным расчетом”
Перед исполнением необходимо подключить в “Дополнительны отчетах и обработках”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#Область ПрограммныйИнтерфейс // СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки // Возвращает сведения о внешней обработке. // // Возвращаемое значение: // см. ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке // Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.3.1.73"); // ВерсияБСП //ПараметрыРегистрации.Наименование = НСтр("ru = 'Выполнение сложного расчета'"); ПараметрыРегистрации.Информация = НСтр("ru = 'Выполнение сложного расчета'"); ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка(); ПараметрыРегистрации.Версия = "1.0.1.1"; ПараметрыРегистрации.БезопасныйРежим = Ложь; Команда = ПараметрыРегистрации.Команды.Добавить(); Команда.Представление = НСтр("ru = 'Выполнить сложный расчет'"); Команда.Идентификатор = "АВ_ВыполнеиеСложногоРасчета"; Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(); Команда.ПоказыватьОповещение = Истина; Команда.Модификатор = ""; //Команда.ЗаменяемыеКоманды = "ПереченьСотрудников"; Возврат ПараметрыРегистрации; КонецФункции // Конец СтандартныеПодсистемы.ДополнительныеОтчетыИОбработки Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполненияКоманды) Экспорт Если ИдентификаторКоманды = "АВ_ВыполнеиеСложногоРасчета" Тогда ВыполнитьСложныйРасчет(); КонецЕсли; КонецПроцедуры Процедура ВыполнитьСложныйРасчет() Экспорт // тут сложный расчет КонецПроцедуры #КонецОбласти |
Дополнение
Если при выполнении команды не появляется окно с “Колесом загрузки”, то возможно вы находитесь в режиме отладки.