Имя: Пароль:
1C
 
Можно ли заставить управляемое приложение досрочно отобразить сообщения пользователю?
, ,
0 TormozIT
 
гуру
24.07.20
22:18
Создай управляемую форму с командой
    Для Счетчик = 1 По 20 Цикл
        ОбработкаПрерыванияПользователя();
        Сообщить(Счетчик);
        Для Счетчик2 = 1 По 50000 Цикл
            Пустышка = 0;
        КонецЦикла;
    КонецЦикла;
Открой ее в режиме клиентского приложения и выполни эту команду. Сообщения пользователю после задержки будут выведены все сразу, т.е. они выводятся после завершения выполнения обработчика, а не при каждом вызове Сообщить(). Иными словами они буферизуются.
В обычном приложении они выводятся сразу при вызове метода Сообщить(). Можно ли как то в управляемом приложении тоже сделать, чтобы они выводились сразу при вызове Сообщить()?
1 NcSteel
 
24.07.20
22:28
Асинхронные вызовы, посмотри как работают прогресбары в типовых
2 TormozIT
 
гуру
24.07.20
22:30
Интересует синхронный вариант. С асинхронным все понятно.
3 lEvGl
 
гуру
24.07.20
22:33
гггггг
4 TormozIT
 
гуру
24.07.20
22:40
(3) А вот и тяжелая артилерия. Чувствую сейчас выкатит свое решение.
5 Ёпрст
 
24.07.20
23:05
(0)
Ну так, разве что..хз, не силён в УФ
//Сообщить(Счетчик);
ОтобразитьИзменениеДанных(Счетчик,ВидИзмененияДанных.Изменение);
6 acht
 
24.07.20
23:07
(2) Нельзя.
Используй Состояние или ПоказатьОповещениеПользователя.

Там есть целая концепция деления сообщений по категорям:
https://its.1c.ru/db/pubv8devui/content/227/hdoc
7 acht
 
24.07.20
23:10
(5) > ОтобразитьИзменениеДанных
Аццкая конструкция с побочными эффектами:

Доступность:
...
Вызов метода выполняет обращение к серверу

Примечание:
В случае добавления или изменения данных вызов метода приводит к очистке кэшей на клиенте. В частности, очищается кэш представлений ссылок, кэш данных через точку, кэш данных быстрого выбора, кэш ограничений по типу.
8 TormozIT
 
гуру
24.07.20
23:15
(6) Все там классно, но только не рассмотрен вывод лога в реальном времени, т.е. относительно большого количества текстовой информации. Для вывода лога подходит никакой из перечисленных там вариантов. Состояние и ПоказатьОповещениеПользователя конечно тоже не подходят.
9 acht
 
24.07.20
23:21
(8) "Лог в реальном времени, т.е. относительно большое количества текстовой информации" надо выводить в файл.

Желание программиста похвастатся всеми кишочками своего продукта перед пользователем, оно конечно похвально. Но только приводит к интерфейсу, которым невозможно пользоваться. Ты же сам из всего этого "лога" воспринимаешь только последние строчки 3. А для "расследования" начинаешь что-то делать, например проматывать окошко обратно.
10 acht
 
24.07.20
23:31
(8) Попробуй с полем HTML документа извратится - положить внутрь js для добавления строки и дернуть его из потока выполнения 1С. Оно вроде в отдельном потоке отрисовывается.
11 Ёпрст
 
24.07.20
23:51
да уж..даже заголовок не меняется в цикле.

Это, так еще кто-то делал:
https://habr.com/ru/post/278521/
12 Ёпрст
 
24.07.20
23:55
а блин, это для оф
13 acht
 
25.07.20
00:03
(11) Ошметки общей архитектуры с веб-клиентом. Тихо заметается под ковер, в отличие от асинхронщины и немодальности =)
14 Garykom
 
гуру
25.07.20
00:15
(0) По уму это делается выносом кода на сервер в фоновое, а на клиенте через обработчик ожидания сообщай прогресс периодически
15 TormozIT
 
гуру
25.07.20
00:25
(14) А если у меня внешняя обработка, т.е. нужно обойтись без фонового задания?
16 acht
 
25.07.20
00:32
(15) > А если у меня внешняя обработка

- Представь что тебе надо разгрузить машину, сколько времени это займет?
- Пару часов
- Это камаз
- 8 часов
- Камаз, груженый песком
- 12 часов
- У тебя нет лопаты и инструментов, только твои руки
- 2 дня
- На улице -40
- 4 дня
- Камаз вообще под водой
- Так же нечестно, ты постоянно придумываешь новые условия! К чему ты мне вообще все это рассказываешь? Вы, разработчики, вечно всякую херню рассказываете!

=)
17 TormozIT
 
гуру
25.07.20
00:35
(16) Мимо. Про синхронность явно написано было уже в (2).
18 acht
 
25.07.20
00:40
(17) А. То есть ты в (15) уже знал про что идет речь, но решил таки полезть глубже.

Ну ок, чо.
19 Bigcalm
 
25.07.20
01:08
(8) Ну может тогда подготовить текст лога, и потом его выпиливать в текстовый файл, с помощью ВыполнитьКомандуСистемы, или как оно там называется.
Читать, и дальше уже там по логике работы.
20 TormozIT
 
гуру
25.07.20
01:18
Нашел синхронное решение через вывод в свое поле текстового документа на управляемой форме и передергивание его видимости для перерисовки. Позже выложу готовое решение.
21 acht
 
25.07.20
09:08
(20) > передергивание его видимости
Лучше не выкладывай, это сильно плохое решение.

При изменении видимости элемента происходит неявный контекстный вызов сервера(что, собственно, и приводит к перерисовке формы), про это даже в СП написано. Отсюда немедлено следуют два момента:
- При использовании своего "логгирования" из процедур, а которых контекстные серверные вызовы явно запрещены (см тот же СП, например, ПриАктивизацииЯчейки") ты разваливаешь работу формы.
- При накоплении достаточного числа строк ("лог в реальном времени, т.е. относительно большое количества текстовой информации" и тыпы) приложение будет не выполнять полезную работу, а ждать сериализор и сеть. Сделай замер производительности.

Использование подобных "хитровыдуманные" решений, оно попахивает.
22 TormozIT
 
гуру
25.07.20
09:32
(21) Спасибо. Все это учел. Форма используется отдельная и максимально легкая. Неявный серверный вызов конечно делается. Но он выполняется не чаще раза в 2 секунды. Лог не накапливается в этой форме, а хранится 10 последних строк. Полный лог копится отдельно и выводится в конце без участия в отображении реального времени.
23 acht
 
25.07.20
09:44
(22) > Полный лог копится отдельно
Если "отдельно" находится в контексте этой же формы, то у меня для тебя плохие новости.
24 vde69
 
25.07.20
09:54
Я подобное делал через
Подключитьобработчикожидания
С временем 0.1
25 vde69
 
25.07.20
09:55
(24) но это если итерраций не много
26 TormozIT
 
гуру
25.07.20
16:24
(24) Опять асинхронный совет или слишком лаконичный.
27 TormozIT
 
гуру
27.07.20
00:34
В ИР 5.45 реализовал (0) в 2-х вариантах:
1. Обработка.ирПлатформа.Форма.ВременноеОкноСообщений - обычная форма, активный вариант, без серверных вызовов.
2. Обработка.ирПлатформа.Форма.ВременноеОкноСообщений2 - управляемая форма, пассивный вариант, с серверными вызовами, чуть менее универсальный из-за ошибки платформы http://www.hostedredmine.com/issues/882422
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn