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

Как приостановить печать документов в цикле на время ожидания ответа пользователя на вопрос?

Как приостановить печать документов в цикле на время ожидания ответа пользователя на вопрос?
Я
   TDI
 
29.12.21 - 11:55
Есть печать документов в цикле.
Если делать через ПоказатьВопрос(Новый ОписаниеОповещения("НапечататьСледующийДокументВыбораДиалога", ЭтотОбъект.....
Цикл будет продолжать работать без ожидания ответа.

Как сделать, чтобы цикл не продолжал выполнятся, до того момента как пользователь ответит на вопрос ?
   fisher
 
1 - 29.12.21 - 11:57
Версия платформы какая?
   fisher
 
2 - 29.12.21 - 11:57
Асинхи тебе уже завезли?
   Kassern
 
3 - 29.12.21 - 11:58
(0) вынести продолжение цикла в процедуру которая оповещается после вопроса
   Kassern
 
4 - 29.12.21 - 11:58
либо использовать модальную версию этого метода
   TDI
 
5 - 29.12.21 - 12:01
(4) а как модально открыть.
Всовременных конфах же нельзя
   fisher
 
6 - 29.12.21 - 12:03
(3) Скоро сказка сказывается, да нескоро дело делается
   Kassern
 
7 - 29.12.21 - 12:03
(5) Режим использования модальности в свойствах конфигурации. И правильно, что не рекомендуют, так как это не модно и молодежно теперь, есть варианты с оповещениями, которые могут работать и в вебе, а для модальных штучек веб уже не канает
   mistеr
 
8 - 29.12.21 - 12:04
(0) Задать все вопросы до печати.
   Kassern
 
9 - 29.12.21 - 12:05
вы просто должны понимать, как это работает без модальности. Вы вызвали метод, передали ему оповещение с именем процедуры. Код выполнится до конца, а после запустится выбранная процедура и в зависимости от результата вы обрабатываете данные. Не нужно все пихать в процедуру с вопросом
   МимохожийОднако
 
10 - 29.12.21 - 12:06
(0) Что ты хочешь спросить? Может быть, вывести информацию на кнопку печати до того как?
   TDI
 
11 - 29.12.21 - 12:06
(8) так в том и дело,
нужно ждать команды пользователя, перед печатью следующего пакета документов..
   mistеr
 
12 - 29.12.21 - 12:07
(11) Зачем? Чтобы пользователь бумагу вставил? Поясни схему работы.
   Kassern
 
13 - 29.12.21 - 12:08
(11) Ну так задавайте вопрос в цикле, а печать перенесите в процедуру оповещения, при положительном результате
   fisher
 
14 - 29.12.21 - 12:09
Если асинхов тебе еще не подвезли, тогда красивых вариантов не вижу.
   Kassern
 
15 - 29.12.21 - 12:09
(13) Точнее не в цикле, а после печати первого документа, проверяете, есть ли еще и вызываете снова процедуру с вопросом
   TDI
 
16 - 29.12.21 - 12:10
да понятно, тогда в процедуру оповещения переносить надо будет
   МимохожийОднако
 
17 - 29.12.21 - 12:11
(16) Переноси
   azernot
 
18 - 29.12.21 - 12:12
Процедура ЦиклПечати(Счетчик)
Для А = Счетчик по КонецСчетчика Цикл
...
Печать(А)
Если НасталоВремяЗадатьВопрос ТОгда
 ПараметрыВопроса.ТекущийСчетчик = А;
 ПоказатьВОпрос(...ПараметрыВопроса..)
 Прервать;
КОнецЕсли;


Процедура ОповещеинеПослеВопроса()
Если ОТветПредполагаетПродолжениеПечати Тогда
ЦиклПечати(ПараметрыВопроса.ТекущийСчетчик)
   МимохожийОднако
 
19 - 29.12.21 - 12:21
(18) Так какой вопрос ты хочешь задать пользователю?
"Вась, ты пойдешь сегодня в бар?"
   Kassern
 
20 - 29.12.21 - 12:23
(16) Вот вам на коленке сделанный пример:
&НаКлиенте
Процедура Команда1(Команда)     
    ЗадатьВопрос();
КонецПроцедуры     

&НаКлиенте
Процедура ЗадатьВопрос();
    
    МассивПовторений=Новый Массив;
    Для к=1 По 10 Цикл
        МассивПовторений.Добавить(к);    
    КонецЦикла;    
    Если МассивПовторений.Количество()>0 Тогда 
        Режим = РежимДиалогаВопрос.ДаНет;
        СтруктураПараметров=Новый Структура;
        СтруктураПараметров.Вставить("МассивЧисел",МассивПовторений);
        Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект, СтруктураПараметров);
        ПоказатьВопрос(Оповещение, НСтр("ru = 'Продолжить выполнение операции?';"
        + " en = 'Do you want to continue?'"), Режим, 0);
    КонецЕсли;
КонецПроцедуры     

&НаКлиенте
Процедура ПослеЗакрытияВопроса(Результат, ПараметрыВопроса) Экспорт
    Если Результат = КодВозвратаДиалога.Нет Тогда
        ТекПозиция=0;
        Возврат;
    КонецЕсли;    
    МассивЧисел=ПараметрыВопроса.МассивЧисел;
    Сообщить(МассивЧисел[ТекПозиция]);
    ТекПозиция=ТекПозиция+1;
    Если ТекПозиция<МассивЧисел.Количество() Тогда 
        ЗадатьВопрос();    
    КонецЕсли;
    
КонецПроцедуры
   Kassern
 
21 - 29.12.21 - 12:23
(20) ну ТекПозиция = 0 определить
   fisher
 
22 - 29.12.21 - 12:26
Если цикл выполняется в тяжелом контексте, то без потерь выкрутиться не получится.
Ну а в противном случае и проблемы нет.
   Kassern
 
23 - 29.12.21 - 12:31
(22) тут явно другой случай, у ТС просто мало опыта работы с оповещениями
   Kassern
 
24 - 29.12.21 - 17:59


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