Имя: Пароль:
1C
1С v8
Динамически обновляемые данные на управляемой форме?
0 bigdenis22
 
31.03.25
15:36
Есть необходимость выводить на форме документа динамически обновляемые данные (1-2 раза в секунду), такие как вес с весов или температура с бесконтактного термометра.
Проблема в том, что когда я задаю значение для реквизита или заголовок для декорации:
ЭтаФорма.текВес = Число(Вес);
Элементы.НадписьВес.Заголовок = Число(Вес);
- происходит перерисовка всей формы, и если пользователь пытается редактировать какой-то элемент, - то значение сбрасывается в изначальное.
Как обновить отдельный элемент формы, не перерисовывая всю форму? - Я не нашел. (И возможно ли это вообще?)

Я читал, что с такой же проблемой столкнулись люди, которые пытались вывести часы/таймер на форму, но решений так и не увидел.
ЗЫ платформа 8.3.18, режим совместимости 8.2.16
1 Fragster
 
гуру
31.03.25
15:42
использовать не заголовок а реквизит с типом элемента управления "надпись"
2 bigdenis22
 
31.03.25
16:08
(1) Реквизит формы с типом число, элемент диалога Поле с видом "поле надписи" - таже самая петруха - форма перерисовывается, редактирование сбрасывается.

Или я не правильно вас понял? У меня в элементах диалога нет типа "Надпись".
3 Fragster
 
гуру
31.03.25
16:15
(2) в коде из (0) устанавливается Заголовок. Надо убрать это.

при изменении реквизита на клиенте форма не "перерисовывается". И вообще - это не "перерисовывание", а контекстное хождение на сервер - вот при возврате оно так и происходит.

в некоторых случаях от хождения на сервер не избавится, тогда спасет свойство поля ввода ОбновлениеТекстаРедактирования (но это костыль, правильнее избавиться от вызова сервера, а это изменение видимости, изменение заголовков, сортировки всякие и пр.)
4 bigdenis22
 
31.03.25
16:31
(3) извиняюсь, забыл добавить в (2):
строку Элементы.НадписьВес.Заголовок = Число(Вес); закоментировал,
для числового реквизита "текВес" элемент диалога "поле", с видом "Поле надписи", как уже сказал выше, ситуация не поменялась.
Или может значение надо как-то иначе задавать, чем
ЭтаФорма.текВес = Число(Вес); ?
Я предполагал, что при обращении к "ЭтаФорма" и происходит "хождение на сервер" за колекцией элементов формы... - не, не прав?
Как избавиться от хождения на сервер?
Посмотрю про "ОбновлениеТекстаРедактирования", если есть примеры - буду признателен.
5 Мультук
 
гуру
31.03.25
16:35
(0)

Небольшой вопрос.
А откуда на форме берется собственно вес ? При этом аж 2 раза в секунду.
Он появляется чудодейственным образом ?

или

ПодключитьОбработчикОжидания ?
6 bigdenis22
 
31.03.25
16:40
(5) да, через
...
ПодключитьОбработчикОжидания("ОбновитьВес", Таймаут, Истина);
...
&НаКлиенте
Асинх Процедура ОбновитьВес()
7 Галахад
 
гуру
31.03.25
16:41
А за данными о весе на сервер? ))
8 Fedor-1971
 
31.03.25
16:47
(4) Не ставь свойство ДС Интервал обновления, а подключи обработчик ожидания (как в (5)).
Когда пользователь будет вводить данные, твои поля не будут обновляться и фокус с поля ввода не сдвинется. Когда навводится, то через 2 секунды обновятся данные
И, таки, лучше сделать отдельное поле (или надпись) и не трогать заголовок + бесконтекстное получение данных веса
9 bigdenis22
 
31.03.25
16:46
(7) нет, весы подключаются и опрашиваются на клиенте.
10 Fedor-1971
 
31.03.25
16:58
(9) Попробуй создать реквизит формы и заполнять значение оного, будет точеное обновление реквизита
11 bigdenis22
 
31.03.25
17:02
(10) как я писал уже выше:
текВес это числовой реквизит формы, связан с элементом формы "Поле" с видом "Поле надписи".
опрос весов инициируется:
ПодключитьОбработчикОжидания("ОбновитьВес", Таймаут, Истина); // Таймаут 0.5
в процедуре:
Асинх Процедура ОбновитьВес()
...
ЭтаФорма.текВес = Число(Вес);
...
происходит опрос весов и присвоение реквизиту текВес значения веса.
12 АгентБезопасной Нацио
 
31.03.25
17:05
(11) а весы не могут генерить событие, типа "вес обновлен"?
13 Fedor-1971
 
31.03.25
17:08
(11) Чисто в качестве эксперимента: поставь полеВвода
14 bigdenis22
 
31.03.25
17:22
(12) нет, весы по запросу, и слушания событий нигде не делалось.
(13) уже пробовал, и Декорация-надпись тоже.
(3) попробовал, как было предложено "ОбновлениеТекстаРедактирования" - вроде работает. У меня в этом документе 4 реквизита редактируемых (в шапке), поставлю свойство ОбновлениеТекстаРедактирования - При изменении значения, - понаблюдаю как оно...

Понятно, что костыль, но похоже других решений для "точечного" обновления одного элемента диалога, без дЁргания всей формы - нет.
15 АгентБезопасной Нацио
 
31.03.25
17:40
(14) а что за весы, что за драйвер?
16 Fragster
 
гуру
31.03.25
17:52
такого быть не должно, так что надо сделать замер и посмотреть, в каких строках есть "обр. сервером" и думать почему так.
17 Fedor-1971
 
31.03.25
18:03
(16) Не факт, что выловится замером, т.к. на сервер форма может ломануться, например, для пересчёта размеров полей - т.е. работа платформы в замер не попадёт
18 Гений 1С
 
гуру
31.03.25
22:18
(0) попробуй на платформе повыше, там вроде обновили.
а ваще сделай поле браузера и туда выводи через JS
19 bigdenis22
 
01.04.25
09:34
(15) (16) UniproScalesComSrv, да, он умеет генерить внешнее событие, но я же говорю - внешние события нигде не слушаются.
Отладчик перехватывает только то, что и задуманно - обновление веса на клиенте, без обращений к серверу. Не исключаю, что платформа неявно общается с сервером, но отладчик этого не видит.
(18) Не уверен, но есть сомнения, что платформа "Выше" при установленном режиме совместимости, поможет... Или я не прав?
"поле браузера и туда выводи через JS" - не силен в этой теме, и на данном этапе страстного желания разбираться - нет,  да по сути это также костыли, как и те что использовал я.
Хотя спасибо за совет.
20 bigdenis22
 
01.04.25
09:44
Меня в данной ситуации, больше всего возмущает то, что в НЕуправляемых формах 7-ки и 8-ки - это работает, а в "УПРАВЛЯЕМЫХ формах" невозможно обновить один элемент диалога, не передЁргивая всю форму.
21 Ёпрст
 
01.04.25
09:47
(0) поле html на форму и в нём, что угодно.
22 Мультук
 
гуру
01.04.25
10:33
(20)

Потому что обычная форма (я про толстый клиент)
она сразу вся здесь. Ибо программа сразу и клиент и сервер.

А управляемая, она как фотон (смайлик) и тут (на клиенте) и там (на сервере)
23 bigdenis22
 
01.04.25
10:58
(18) (21) блин, дайте пример вывода на форму через поле html, данных, которые уже есть в 1с клиенте (вес уже полученный в реквизит) ?
24 Fedor-1971
 
01.04.25
14:18
(23) Вот пример создания HTML
&НаСервере
Функция НоваяHTMLСтраницаОшибки()
    
    ШаблонСтраницы =
        "<html>
        |<head>
        |  <meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"">
        |  <style type=""text/css"">
        |    html {
        |      overflow:auto;
        |    }
        |    body {
        |      margin: 10px;
        |      font-family: Arial, sans-serif;
        |      font-size: 10pt;
        |      overflow: auto;
        |      position: absolute;
        |      top: 0;
        |      left: 0;
        |      bottom: 0;
        |      right: 0;
        |    }
        |    div.main {
        |      overflow: auto;
        |      height: 100%;
        |    }
        |    div.error {
        |      font-size: 12pt;
        |    }
        |    div.presentation {
        |      font-size: 11pt;
        |    }
        |    h3 {
        |      color: #009646
        |    }
        |    li {
        |      padding-bottom: 16px;
        |    }
        |    a {
        |      text-decoration: none;
        |      color: #0066CC;
        |    }
        |    a:hover {
        |      text-decoration: underline;
        |    }
        |  </style>
        |</head>
        |<body>
        |  <div class=""main"">
        |    <div class=""error"">%1</div>
        |    <p>%2</p>
        |  </div>
        |</body>
        |</html>";
    
    РекомендацииHTML =
        НСтр("ru = '<h3>Рекомендации:</h3>
            |<ul>
            |  %1
            |  %2
            |  <li>
            |    <b>Воспользуйтесь поиском по началу слова.</b><br>
            |    Используйте звездочку (*) в качестве окончания.<br>
            |    Например, поиск стро* найдет все документы, которые содержат слова, начинающиеся на стро -
            |    Журнал ""Строительство и ремонт"", ""ООО СтройКомплект"" и.т.д.
            |  </li>
            |  <li>
            |    <b>Воспользуйтесь нечетким поиском.</b><br>
            |    Используйте решетку (#).<br>
            |    Например, Ромашка#2 найдет все документы, содержащие такие слова, которые отличаются от слова
            |    Ромашка на одну или две буквы.
            |  </li>
            |</ul>
            |<div class ""presentation""><a href=""%3"">Полное описание формата поисковых выражений</a></div>'");
    
    УказаныОбластиПоиска = ОбластиПоиска.Количество() > 0;
    
    РекомендацияОбластиПоискаHTML = "";
    РекомендацияТекстЗапросаHTML = "";
    
    Если КодОшибки = "НичегоНеНайдено" Тогда
        
        Если ИскатьВРазделах И УказаныОбластиПоиска Тогда
        
            РекомендацияОбластиПоискаHTML =
                НСтр("ru = '<li><b>Уточните область поиска.</b><br>
                    |Попробуйте выбрать больше областей поиска или все разделы.</li>'");
        КонецЕсли;
        
        РекомендацияТекстЗапросаHTML =
            НСтр("ru = '<li><b>Упростите запрос, исключив из него какое-либо слово.</b></li>'");
        
    ИначеЕсли КодОшибки = "СлишкомМногоРезультатов" Тогда
        
        Если Не ИскатьВРазделах Или Не УказаныОбластиПоиска Тогда
            
            РекомендацияОбластиПоискаHTML =
            НСтр("ru = '<li><b>Уточните область поиска.</b><br>
                |Попробуйте выбрать область поиска, задав точный раздел или список.</li>'");
        КонецЕсли;
        
    КонецЕсли;
    
    РекомендацииHTML = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(РекомендацииHTML,
        РекомендацияОбластиПоискаHTML, РекомендацияТекстЗапросаHTML,
        "v8help://1cv8/QueryLanguageFullTextSearchInData");
    
    Возврат СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонСтраницы, ОписаниеОшибки, РекомендацииHTML);
    
КонецФункции