Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Не модальный вопрос в цикле о прерывании загрузки прайса

Не модальный вопрос в цикле о прерывании загрузки прайса
Я
   kobzon2
 
12.03.20 - 10:56
Коллеги, натолкните на решение.
Есть обработка загрузки большого прайса. В цикле на клиенте добавлен код с возможностью в каждые нн шагов прервать загрузку.
Сделано все старинным методом Ответ=Вопрос("Прервать загрузку?",....
Понятно что напрашивается не модальный метод ПоказатьВопрос(Оповещение,...
Но тогда я же по-любому выхожу из цикла. Плюс окно с сообщением видимо не успевает закрыться и тоже зацикливается, хотя таймаут 2 секунды.
Что еще можно придумать, кроме оповещения, с добавлением процедуры ЗавершениеОповещения?
 
 
   ДенисЧ
 
1 - 12.03.20 - 10:57
А ОбработкаПрерыванияПОльзователя() не катит?
   kobzon2
 
2 - 12.03.20 - 11:04
(1) Катит в принципе. Правда вопрос о прерывании задается именно в определенные моменты, когда закончилась грузиться последняя строчка одной номенклатуры и готовится первая строчка другой.
А тут я получается обрываю там где получится. Последняя номенклатура наверное наполовину только загрузится.
   Sasha_H
 
3 - 12.03.20 - 11:06
ПоказатьВопрос - не прекратит действие цикла, поскольку тело цикла продолжит свою работу - учим мат.часть!
   Sasha_H
 
4 - 12.03.20 - 11:07
это делается совершенно иначе! Через оповещение событий  - к примеру обработка ожиданий длительных операций
   Cthulhu
 
5 - 12.03.20 - 11:08
ПЕРЕД циклом: "ПоказатьВопрос(...)" и переменная модуля(!) "мОтвет = Ложь;"
В цикле проверять "Если мОтвет Тогда Прервать КонецЕсли;"
В обработчике ответа "Да" на выведенный вопрос - "мОтвет = Истина;"
   Cthulhu
 
6 - 12.03.20 - 11:10
(+) если нужно - в цикле внутри "Если мОтвет Тогда ..." - доп.обработка ситуации без прерывания пока не выполнится это самое доп.условие.
   pechkin
 
7 - 12.03.20 - 11:14
однако задача "вызвать асинхронную процедуру в цикле" - это практически задача олимпиадного уровня сложности
   pechkin
 
8 - 12.03.20 - 11:15
по идее нужно из оповещения вызывать основную процедуру и передавать туда индекс с которого нужно начинать
   Sasha_H
 
9 - 12.03.20 - 11:20
(5) - это ересь!!! Во-первых интерфейс зависнет и вопрос выйдет только в конце поскольку это асинхронная модель! Во-вторых даже если бы вопрос вышел то тело цикла будет продолжать загрузку.
   Sasha_H
 
10 - 12.03.20 - 11:21
Да прекратите вы заниматся ерундой!!! Для этого есть обработки оповещений. Посмотри как работают загрузки. Это надо создавать фоновое задание и делать обработку оповещения!
   kobzon2
 
11 - 12.03.20 - 11:23
(10) Какие загрузки посмотреть? Какие то типовые?
   Sasha_H
 
12 - 12.03.20 - 11:24
(11) Открой БСП. Смысл в том. что тебе необходимо создавать ФоновоеЗадание у которого есть ответ и на форме объявляется обработка оповещения. Есть еще через взаимодействие делают (но я так не практиковал)
   Sasha_H
 
13 - 12.03.20 - 11:25
на инфостарте полно обработок по типу. Прогресс бар при загрузке!
   pechkin
 
14 - 12.03.20 - 11:27
(13) прогресс бар - это не вопрос
   Sasha_H
 
15 - 12.03.20 - 11:29
учти тот факт, что эта модель совершенно другая! То есть у тебя будет идти загрузка и состояние процентов. Сделать модель по типу рандомный вопрос я во-первых не вижу смысла на хрена!!!! Поскольку прогрес бар это лучше вопроса и ты в любой момент можешь прервать загрузку!
   pechkin
 
16 - 12.03.20 - 11:29
вот лови обработку с возможностью прерывания
   pechkin
 
17 - 12.03.20 - 11:29
   Sasha_H
 
18 - 12.03.20 - 11:29
в чем смысл вопроса? чтобы он как-то рандомно открылся, а если я хочу прервать загрузку уже!? как это сделать ждать вопроса!?
   Sasha_H
 
19 - 12.03.20 - 11:32
Не накладывайте алгоритм обычных форм (не управляемых) на новую парадигму. Тут совершенно иначе все. Ненужно выдумывать костыль, когда логика приложения задумана по-другому!
   pechkin
 
20 - 12.03.20 - 11:34
можно еще через фоновые делать, но тут сложнее будет
   Sasha_H
 
21 - 12.03.20 - 11:34
(20) нужно делать черезз фоновые. В чем сложность !?
   Sasha_H
 
22 - 12.03.20 - 11:34
(20) ответ в (12)
   kobzon2
 
23 - 12.03.20 - 11:35
(15) Да понятно, что процесс будет в любом случае продолжаться, а оповещение только после этой процедуры отработает.
Будем значит обработкой прерывания делать.
Фоновое задание, оно же должно вызываться как можно чаще?
   Александр Б
 
24 - 12.03.20 - 11:35
(2) Так ты вместо вопроса поставь обработку прерывания. И он тебе как раз и будет прерывать именно в этих местах. Никакой проблемы.
   Sasha_H
 
25 - 12.03.20 - 11:35
(23) во-первых в такси интерфейсе не существует обработки прерывания
   Александр Б
 
26 - 12.03.20 - 11:36
(25) Существует на клиенте.
   Sasha_H
 
27 - 12.03.20 - 11:37
Примечание:
Прерывание работы встроенного языка возможно не во всех клиентских обработчиках управляемой формы.
   Sasha_H
 
28 - 12.03.20 - 11:37
Доступность:
Тонкий клиент, веб-клиент, толстый клиент.
   Sasha_H
 
29 - 12.03.20 - 11:38
загрузка делается где на сервере, что он там прерывать то собрался
   Sasha_H
 
30 - 12.03.20 - 11:38
вообще что за интерфейс ОФ, УФ, Такси. тонкий или толстый клиент
 
 Рекламное место пустует
   unenu
 
31 - 12.03.20 - 11:39
(18) допустим есть загрузка неких данных в количестве 10 000 000 строк
каждые 100 000 грузятся час
хотелось бы поле загрузки очередных 100 000 спрашивать
"Если еще не вечер, то продолжим?"

как решить такой алгоритм на УФ?
Думаю реально если сначала нарисовать цикл и вызов оповещений на листике, учитывая что обработчики оповещения содержат доппараметры.
   Александр Б
 
32 - 12.03.20 - 11:39
(29) Вопрос же рабоатет. Значит обработка выполняется на клиенте.
   kobzon2
 
33 - 12.03.20 - 11:44
(32) Обработка делается на клиенте, читается excel файл. Далее уже передается структура на сервер.
Мне еще не нравится что каждая строка структуры гоняется на сервер. Это же замедляет работу. Или по фиг?
   pechkin
 
34 - 12.03.20 - 11:45
держи на фоновых (требуется БСП)
http://catalog.mista.ru/public/943888/
   Sasha_H
 
35 - 12.03.20 - 11:45
(34) На хрена там БСП!??? Читаем СП и все дела!
   Sasha_H
 
36 - 12.03.20 - 11:47
(33) позвольте уточнить,  а как происходит отчитка ексель?
   pechkin
 
37 - 12.03.20 - 11:47
(35) без бсп не запустишь код в фоновом из внешней обработки
   Александр Б
 
38 - 12.03.20 - 11:48
(33) У тебя в чём вопрос сабжа стоит? Как уйти от вопроса. Обработка прерывания решает этот вопрос. Если нужно прервать - контрл брейк. Если не нужно - процедура будет крутиться до завершения.
Вопрос же не стоит в оптимизации самого алгоритма, а лишь в том, чтобы убрать эти интерактивные паузы.
   Sasha_H
 
39 - 12.03.20 - 11:49
Так ведь в сотню раз проще все сделать. Правда код только на сервере и файл придется в хранилище на сервер передать
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\My Documents\Таблица1.xls");
   Sasha_H
 
40 - 12.03.20 - 11:49
(38) не будет он там ничего прерывать
   Александр Б
 
41 - 12.03.20 - 11:50
(40) Учи матчасть.
   Sasha_H
 
42 - 12.03.20 - 11:51
&НаСервереБезКонтекста
Процедура ЗагружаюДанныЕксельВБазу()

 ОбработкаПрерыванияПользователь()// вызвет ошибку компиляциИ!!!
   Sasha_H
 
43 - 12.03.20 - 11:51
(41) сам поучи прежде чем людям ахенею предлагать
   Александр Б
 
44 - 12.03.20 - 11:52
(42) Какой сервер? Чтение из экселя на клиенте выполняется. Не пиши ахинею.
   kobzon2
 
45 - 12.03.20 - 11:52
(36) Забыл, что уже переделал загрузку. Теперь копирую эксель таблицу и вставляю в табличное поле на форму обработки. Дальше циклом перебираю строки.
   Александр Б
 
46 - 12.03.20 - 11:52
(43) Тебе в сабже написано, что обработка выполняется на клиенте. Пользователю вызывается вопрос, который тоже доступен только на клиенте. А значит замена вопроса на обработку прерывания будет гарантированно работать.
   Sasha_H
 
47 - 12.03.20 - 11:53
(44) высер свой не предлагай людям, как ты на клиенте собрался сделать Номенклатура.Записать()?!
   Александр Б
 
48 - 12.03.20 - 11:54
(47) Ты свой высер при себе оставь. Где ты видишь в сабже Номенклатура.Записать()?
   kobzon2
 
49 - 12.03.20 - 11:54
(38) Если как вы пишите, будет прерывание в том месте, куда вставить вызов процедуры прерывания, тогда мне этот вариант вполне подходит. Просто останется объяснить пользователем, что кнопочки теперь не будет, а нужно нажать сочетание клавиш.
   Garykom
 
50 - 12.03.20 - 11:55
(0) Делай по умному на фоновых задания.
   kobzon2
 
51 - 12.03.20 - 11:55
(47) На сервер с клиента передается прочитанная строка в виде структуры, а там уже все записывается в базу.
   Sasha_H
 
52 - 12.03.20 - 11:57
мда обработка мега оптимальная посмотрю
   Sasha_H
 
53 - 12.03.20 - 11:58
Вам надо все переделать если эта обработка запускается в тонком клиенте
   Александр Б
 
54 - 12.03.20 - 11:58
(51) Я бы порекомендовал сперва добавить таблицу на форму. Сперва на клиенте в неё все считать без обращений на сервер. А уже после чтения одним вызовом сервера обработать таблицу и записать все нужные данные.
   pechkin
 
55 - 12.03.20 - 11:59
(52) разницы нет - весь файл ты стразу передаешь или частями по строкам
   pechkin
 
56 - 12.03.20 - 11:59
если вызов безконтекстный то вполне норм
   Garykom
 
57 - 12.03.20 - 12:01
(0)

1. файл с клиента отправляется на сервер
2. получается на сервер
3. на сервере грузится в нечто типа ТабДок или ТЗ
4. обрабатывается на сервере построчно или запросами

На каком этапе ты хочешь получить свое "прерывание" ?
   Александр Б
 
58 - 12.03.20 - 12:02
(57) С чего ты взял, что у ТС файл с клиента отправляется на сервер?
   Garykom
 
59 - 12.03.20 - 12:05
(58) Если он построчно дергает сервер то не понял в чем проблема?
   Sasha_H
 
60 - 12.03.20 - 12:09
(57)  +
Я пытаюсь объяснить но не слушают!
   Sasha_H
 
61 - 12.03.20 - 12:10
ЖЖЕСТь отчитать файл на форму и сожрать память сервера на форму  - мега круто для ПТушников самое оно!
   Sasha_H
 
62 - 12.03.20 - 12:11
(0) Автор у Вас это тонкий клиент!?
   kobzon2
 
63 - 12.03.20 - 12:42
(62) Тонкий
   Sasha_H
 
64 - 12.03.20 - 12:49
(63) Тогда сделайте по уму. как я и (57) говорили!
   kobzon2
 
65 - 12.03.20 - 12:51
(64) Попробую. Прирост скорости загрузки прайса обеспечен?
   dezss
 
66 - 12.03.20 - 12:58
(65) Но учти, что тогда прерывания не будет.
Хотя я сам не понимаю, в каком случае оно нужно.
 
 Рекламное место пустует
   Sasha_H
 
67 - 12.03.20 - 12:58
(65) Смотри сделай так:
1. передаеь файл на серевер потом 
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\My Documents\Таблица1.xls");

вот тебе твой ексель весь в Табличном документе. 

Если тебе принципиально важен вопрос тогда придется помахаться.

Для этого необходимо табличный документ поместить в таблицу значений. Дальше во время загрузки в процедурах загрузки через параметры ты передаешь например задать вопрос через Н строк.
Когда счетчки доходит перебирая ТЗ до этой строки  - сохраняешь это все дело во временное хранилище. ТЗ и параметры на какой строке ты остановился. Обрываешь код тем самым отслежываешь выход из процедуры и задаешь вопрос. Но тут следует немножко круче сделать. А именно не ПоказатьВопрос, а открытьФорму, где у тебя будет параметр Продолжить загрузку на n-строк и вывести вопрос или Прервать вообще или продолжить загрузку до конца не задавая больше вопросов. Все это упаковываешь в параметры.
   Sasha_H
 
68 - 12.03.20 - 13:03
При этом у тебя процедуры/функции разделяться на отдельные.
ПрочитатьЭксель() возвращает адрес временного хранилища.

ОбработатьТаблицуДанных()  
в которой ты отчитываешь адрес во временном хранилище где у тебя там структура ЗадатьВопросЧерезНСтрок, ТекущийСчетчик, ТаблицаЗначений
   Sasha_H
 
69 - 12.03.20 - 13:04
это просто я навожу на мысли в процессе реализации все это закрутится и усовершенствуется
   Sasha_H
 
70 - 12.03.20 - 13:06
Можно попробовать сэконоимить память и ТаблицуЗначений не получать, а именно работать с табличным документом и его помещать во временное хранилище. И уже с помошью счетчиков перемещаться по областям
   kobzon2
 
71 - 12.03.20 - 13:07
(69) Ага, спасибо за наводки. Код давно пора оптимизировать, а то колхоз какой то..
   Sasha_H
 
72 - 12.03.20 - 13:07
Только помещаешь во временное хранилище РАЗОВО, а счетчиик можно через параметры функции ганять
   pechkin
 
73 - 12.03.20 - 13:11
(68) реализация подобного в (17)
   Sasha_H
 
74 - 12.03.20 - 13:13
(73) только уходит большая потеря на индикацию это дергать сервер-клиент плохая идея
   pechkin
 
75 - 12.03.20 - 13:14
(74) тесты говорят об обратоном.
безконтекстный вызов достаточно легко дается
   Garykom
 
76 - 12.03.20 - 13:39
(74) Зато можно во много потоков данные грузить если строчки независимы в прайсе.
И если сервер 1С это дело поддерживает с много потоков на много rphost.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.