Имя: Пароль:
1C
1С v8
УФ: Обновление формы и фоновые задания
0 ДенисЧ
 
03.04.20
15:33
Есть УФ. На ней есть независимое дерево. Которое при необходимости заполняется в процедуре типа &НаСервере ЗаполнитьДерево() в модуле формы.

Последнее время обновление дерева начало занимать заметное время, что иногда напрягает.
Решил вынести заполнение дерева в фоновое задание.
Взял бспшные длительные операции. Написал процедурку... Хочу передать туда то самое дерево...
Процедура выполняется на сервере и в массиве параметров туда в результате прилетает неопределено.

Как можно обойти это?
1 RomaH
 
naïve
03.04.20
16:06
(0) покажи как второй параметр заполняешь
2 RomaH
 
naïve
03.04.20
16:07
ПараметрыПроцедуры     - Структура - произвольные параметры вызова процедуры ИмяПроцедуры.
    ОбщегоНазначенияКлиентСервер.ПроверитьПараметр("ДлительныеОперации.ВыполнитьВФоне", "ПараметрыВыполнения",
        ПараметрыВыполнения, Тип("Структура"));
3 ДенисЧ
 
03.04.20
16:13
(1)
ПараметрыПроцедуры = Новый Массив;
ПараметрыПроцедуры.Добавить(Заказ);
ПараметрыПроцедуры.Добавить(ЭтаФорма);
    
ДлительнаяОперация = ДлительныеОперации.ВыполнитьВФоне("РегистрыСведений.ЗаказыИСтатусы.ОбновитьРасшифровкуПоЗаказуФон",
        ПараметрыПроцедуры, ПараметрыВыполнения);
4 RomaH
 
naïve
03.04.20
16:19
ПараметрыПроцедуры     - Структура - произвольные параметры вызова процедуры ИмяПроцедуры.
5 ДенисЧ
 
03.04.20
16:21
(4) Да ты что... А я-то думал... Что это за фигня такая, зачем я туда пихаю свой заказ и форму...
А это оказывается, чтобы передать их в процедуру...
6 RomaH
 
naïve
04.04.20
08:37
да и неговори, зачем ты там что-то пихаешь в массив, когда надо в структуру
7 ДенисЧ
 
04.04.20
08:46
(6) То есть если я запихну в структуру - прилетит форма? Ой, врёшь...
А так - массив тоже структура. И он успешно прилетает в процедуру. Но без формы.
8 Мигрень
 
04.04.20
08:48
в бсп всегда пихается в структуру, пора бы привыкнуть
9 ДенисЧ
 
04.04.20
08:49
(8) Один овосЧь. Всё равно форма не прилетит ))
10 Cyberhawk
 
04.04.20
10:24
Форму с клиента на сервер передать никак не получится
11 SleepyHead
 
гуру
04.04.20
10:56
(8) ты еще учитывай, что фактически в фоновом задании запускается второй экземпляр твоей обработки.Поэтому все исходные данные бери из параметров, которые передаешь в фоновое задание..
12 SleepyHead
 
гуру
04.04.20
10:56
Уточняю - это не (8), это автору в (9)
13 ДенисЧ
 
04.04.20
11:17
(11) Хорошо. Тогда как мне передать из серверной (!) на форме процедуры настройки компоновщика в фоновое задание? Иду на сервер, получаю настройки, пихаю их в ВХ с ид формы. Получившуюся структуру передаю в процедуру задания - и там неопределено... ((
14 SleepyHead
 
гуру
04.04.20
11:52
(13) Начинаешь же все равно на клиенте? Вот пример, как я делаю. но учти, у меня этот код работает в форме внешнего отчета. Если твоя форма в конфе, надо будет допилить или использовать другой метод, но общий принцип такой - начинаешь на клиенте, собираешь исходные данные для длительной операции (можно на сервере), а сам запуск фонового выполнения на сервере.

&НаКлиенте
Процедура НачатьФоновоеЗадание()

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

// а тут выполняется подготовка задания на сервере
&НаСервере
Функция ВыполнитьФоновоеЗаданиеНаСервере(ПараметрыЗапуска, УникальныйИдентификатор)
    
    НаименованиеЗадания = НСтр("ru = 'Запуск длительной операции'");
    ВыполняемыйМетод = "ДлительныеОперации.ВыполнитьПроцедуруМодуляОбъектаОтчета";
    
    ПараметрыЗадания = Новый Структура;
    ПараметрыЗадания.Вставить("БезопасныйРежим",               Ложь);
    ПараметрыЗадания.Вставить("ИмяОтчета",                     ПараметрыЗапуска.ИспользуемоеИмяФайла); // имя файла этого отчета или "ВнешнийОтчет.ПроверкаБазКлиентов"
    ПараметрыЗадания.Вставить("ИмяМетода",                     "ОбойтиСписокБаз");
    ПараметрыЗадания.Вставить("ПараметрыВыполнения",           ПараметрыЗапуска);
    ПараметрыЗадания.Вставить("ЭтоВнешнийОтчет",               Истина);
    ПараметрыЗадания.Вставить("ДополнительнаяОбработкаСсылка", ПараметрыЗапуска.ДополнительнаяОбработкаСсылка); // СправочникСсылка.ДополнительныеОтчетыИОбработки (может быть пустой ссылкой)
    
    ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
    ПараметрыВыполнения.НаименованиеФоновогоЗадания = НаименованиеЗадания;
    ПараметрыВыполнения.ЗапуститьВФоне = Истина;
    ПараметрыВыполнения.Вставить("ИдентификаторФормы", УникальныйИдентификатор);
    
    СтруктураФоновогоЗадания = ДлительныеОперации.ВыполнитьВФоне(ВыполняемыйМетод, ПараметрыЗадания, ПараметрыВыполнения);
    
    Возврат СтруктураФоновогоЗадания;
КонецФункции
15 ДенисЧ
 
04.04.20
11:54
(14) Ну так у меня то же самое.
Простые (это дубли у нас...) данные передаются. Даже ссылка на документ. А вот настройки компоновки...
16 SleepyHead
 
гуру
04.04.20
11:58
(15) Придется придумать, как их отразить в что-то передаваемое, типа структур и потом загрузить в компоновщик второго экземпляра.
17 ДенисЧ
 
04.04.20
12:01
(16) В том и вопрос, как...
А там ещё не только настройки, но и схема...
Не руками же всё перебирать и восстанавливать... Тогда весь смысл задумки изчезнет...
18 pechkin
 
04.04.20
12:02
Так можно в хз все положить
19 ДенисЧ
 
04.04.20
12:03
(18) читай (13)
20 Сияющий в темноте
 
04.04.20
12:20
(13) передать можно только то,что сериализуется.
а настройки лучше сериализовать самому.
у меня,например,настройки компоновки успешно во внешнее соединение передаются,а тут даже с фоновым затык.
21 ДенисЧ
 
04.04.20
12:21
(20) ну так покажи пример...
22 vde69
 
04.04.20
12:32
вообще деревья в 1с не заточены на большие данные...

по этому есть следующие варианты
1. перейти на динамический список в виде дерева и подгрузка будет происходить автоматом, но это не всегда реализуемо, зависит от хотелок автора...
2. в регламентом задании формировать промежуточные таблицыо только с базовыми отборами формы (которые передавать в виде структуры) а потом на форме уже строить то, что хочется
3. обновлять не все дерево - а только текущую ветку
23 vde69
 
04.04.20
12:34
(22) +
п.2 выглядит так, в регламентом задании делаем табличы а компоновщик пихаем их как источник данных, в типовых есть такие примеры
24 ДенисЧ
 
04.04.20
13:19
(22) ЧТобы в регламенте подготовить таблицы - туда нужно отдать настройки компоновщика и схему... В этом и загвоздка...

Всё, что можно было сделать вне зависимости от юзверя - уже сделал... А тут.. Зверь настраивает отборы... И данные получать нужно по этому отбору. Без фоновых - это работает. Но блокирует интерфейс...
25 vde69
 
04.04.20
13:25
(24) передавай текст запроса и одни отборы и все...

кстати посмотри как сделаны типовые бух отчеты, они примерно так и сделаны, в каждом отчете есть пустая схема именно ее и использует форма, а вторую схему использует регламентное задание и потом результат копируется как источник в первую.

то есть там нет передачи компоновщика...
26 ДенисЧ
 
04.04.20
13:28
(25) А отборы как передать? Они так же в неопределено сваливаются. Или руками перебирать?
Насчёт отдельной схему - нужно подумать... Может, и получится...
27 vde69
 
04.04.20
13:30
(26) там есть функция преобразования отбора в структуру и обратно
28 ДенисЧ
 
04.04.20
13:32
(27) Там - это где? не помню. Подскажешь - благодарен буду
29 vde69
 
04.04.20
13:34
(28) в типовых отчетах, возьми оборотку и трасерни ее до запуска фонового задания, там не так много...
30 ДенисЧ
 
04.04.20
13:46
(29) Да, спасибо. И вам туда же идти.... В Южную Америку.
Ну это приблизительно то же направление, что трассировать типовые...
31 Сияющий в темноте
 
04.04.20
21:04
(30) не знаю,у меня отладка фоновых-это обычное дело.
32 Сияющий в темноте
 
04.04.20
21:08
дерево в таблицу элементарно преобразуется
вводим ид строки и ид родителя и вот таблица становится деревом.
хотя и в xml дерево сериализуется на ура.

бсп длительныеоперации и там все есть даже для запуска фонового из внешней обработки.
33 ДенисЧ
 
04.04.20
21:12
(31)  Отладка фоновых, или отладка фоновых в типовых? Это две большие разницы...
(32) Ты немного притормозил, речь уже не о дереве ))0