Имя: Пароль:
1C
1С v8
Поле HTML документа - автоматическая прокрутка вниз до конца. (управляемые формы)
,
0 Andreyyy
 
21.06.19
10:29
Не получается прокрутить вниз поле HTML документа.

Раньше работало с добавлением кода в конец страницы:

</body>
<script>
function scrollBottom(){
document.body.scrollTop = document.body.scrollHeight;
}
</script>
<body onload="scrollBottom()">

Потом с какого-то релиза сломалось.
В браузере отрабатывает нормально.

Как быть ? Сломал всю голову, в HTML скилл -1.

Тестовый файл https://dropmefiles.com/xm3Zf
1 Юрий Лазаренко
 
21.06.19
10:35
Попробуй в конце страницы поместить такой скрипт:
<script>
  window.onload = function() {
    alert( 'Документ и все ресурсы загружены' );
  };
</script>
2 Юрий Лазаренко
 
21.06.19
10:35
Вместо alert помести свой строку document.body.scrollTop = document.body.scrollHeight;
3 Andreyyy
 
21.06.19
10:58
Вот так в конце - не работает.

<script>
window.onload = function() {
document.body.scrollTop = document.body.scrollHeight;
};
</script>
</html>
4 Вафель
 
21.06.19
11:06
а алерт работает?
5 Вафель
 
21.06.19
11:08
попробуй еще такой вариает
window.scrollTo(0, document.body.scrollHeight)
6 Andreyyy
 
21.06.19
11:10
(4) Работает.
7 Andreyyy
 
21.06.19
11:11
(5) Не работает.
8 Вафель
 
21.06.19
11:16
а чему равен document.body.scrollHeight
9 Вафель
 
21.06.19
11:19
а зачем у тебя body 2 раза?
10 Andreyyy
 
21.06.19
11:59
(8) Убрал.
(9) равно "0".
11 Вафель
 
21.06.19
12:00
у меня все заработало
все варианты
12 Вафель
 
21.06.19
12:00
вот 1 из
<html>
<head>
<script>
function bodyOnLoad() {
document.body.scrollTop = document.body.scrollHeight;
}
</script>
</head>
<body onload=bodyOnLoad()>
<table width="100%" border="1" cellspacing="0" cellpadding="2">
13 Andreyyy
 
21.06.19
12:08
(11)(12) Не работает ...
14 ptiz
 
21.06.19
12:08
(11) На 14 платформе?
15 Andreyyy
 
21.06.19
12:09
(14) 8.3.14.1694
16 Andreyyy
 
21.06.19
12:12
(12) Файл по этому примеру https://dropmefiles.com/Wmra0
В браузере работает.
17 Andreyyy
 
21.06.19
12:26
+(16) В новую созданную обработку копипастю текст из файла и не скроллит.
Сверху так:

<html>
<head>
<script>
function bodyOnLoad() {
document.body.scrollTop = document.body.scrollHeight;
}
</script>
</head>
<body onload=bodyOnLoad()>
<table width="100%" border="1" cellspacing="0" cellpadding="2">
18 Andreyyy
 
21.06.19
15:00
UP
Это я что-то не так делаю или с платформой что-то не то, или фишка какая оригинальная нужна ?
19 Andreyyy
 
21.06.19
15:14
Хоть костыль бы какой, если с платформой глюк.
20 Юрий Лазаренко
 
21.06.19
15:19
Если смотретьтвой тестовый файл из (0), то там html невалидный. Закрываюшего </table> нет совсем. Скрипт в итоге помещается внутрь таблицы. Причина может и не в этом, но исправить надо.
21 Вафель
 
21.06.19
15:26
вот все работаетdjn
https://dropmefiles.com/nmTIr
22 Andreyyy
 
21.06.19
15:30
(21) На какой платформе работает ? У меня тоже самое.
23 Вафель
 
21.06.19
15:30
8.3.13.1809
24 Вафель
 
21.06.19
15:31
windows 10
25 Andreyyy
 
21.06.19
15:33
(20) Добавил "</table" - не помогло.
(23) На 8.3.13 какой-то у меня работало, потом сломалось.
26 Юрий Лазаренко
 
21.06.19
15:34
Я сделал
27 Юрий Лазаренко
 
21.06.19
15:35
На 8.3.14.1565
Сейчас файл скину, проверь
28 Юрий Лазаренко
 
21.06.19
15:37
https://yadi.sk/d/5Oadk988lgDBDA
Там внешняя обработка. Запусти, нажми кнопку "Огонь", посмотри, прокрутится или нет. Если прокрутится, то расскажу, где собака порылась.
29 Andreyyy
 
21.06.19
15:38
(28) Прокручивается !
30 Andreyyy
 
21.06.19
15:40
(28) Понятно, через ожидание нужно команду дать.
Спасибо !
31 Юрий Лазаренко
 
21.06.19
15:43
(30) Через ожидание и на клиенте. И можно не в теле страницы html в скрипте, а непосредственно в коде 1С, документ html в коде 1С доступен со всеми его свойствами/методами и прочими причиндалами.
32 Юрий Лазаренко
 
21.06.19
15:46
+(31) Денег не надо ) Там у меня в личке URL, надо зайти на него и кликнуть "Голосовать", а то у нас борьба за первое место в голосовании.
33 Вафель
 
21.06.19
15:47
а в чем причина то? почему нужно обработчик ожиания то?
34 Andreyyy
 
21.06.19
15:48
(31) В боевом режиме прокрутилось, но не до конца, примерно на 2/3...
(32) Проголосовал.
35 Andreyyy
 
21.06.19
15:51
+(34) Увеличение задержки до секунды не помогло.
36 Вафель
 
21.06.19
15:51
(35)а если отдельной кнопкой скролл сделать?
37 Andreyyy
 
21.06.19
15:54
+(34) Этот же самый html текст вставляю в обработку из (28) и по кнопке все работает.
38 Andreyyy
 
21.06.19
15:55
(36) Это архаизм конкретный, столько не выпью.
39 Вафель
 
21.06.19
15:55
(38) для проверки работоспособности
40 Andreyyy
 
21.06.19
15:57
Вот так заработало:
Элементы.КомментарииСписок.Документ.body.scrollTop = Элементы.КомментарииСписок.Документ.body.scrollHeight + 9999;
41 Юрий Лазаренко
 
21.06.19
15:57
(33) document.onload срабатывает когда DOM загружен. window.onload срабатывает когда DOM, картинки и стили загружены. Типа. Потому что есть разница в браузерах. Что там за браузер сейчас в 1С - ХЗ. Надеяться на то, что скрипт сработает вовремя не стоит.
Почему обработчик ожидания - чтобы дать функции, которая формирует документ DOM, полностью отработать. Есть подозрение, что пока не завершилась функция на клиенте, которая дергает функцию на сервере, документ DOM до конца не формируется, а может и вообще не формируется. То есть, пока не завершится "Процедура Огонь(Команда)", никакого документа DOM на клиенте не будет. Или будет, но кастрированный. Надо исследовать этот момент.
Поэтому даем функции завершиться полностью и только потом вызываем обработчик прокрутки.
42 Юрий Лазаренко
 
21.06.19
15:57
(34) Спасибо!
43 Andreyyy
 
21.06.19
15:58
(39) в (37) выяснилось что текст html рабочий по кнопке.
44 Andreyyy
 
21.06.19
16:00
Огромное спасибо !
Думал что само рассосется как сломалось, но полгода, а воз и ныне там.
45 Вафель
 
21.06.19
16:00
получается что именно не успевает вычислиться body.scrollHeight
46 Юрий Лазаренко
 
21.06.19
16:03
+(31) На клиенте - потому что на сервере документа DOM нет. То есть:
1. Рулить документом DOM на клиенте можно как угодно. Практически все, что можно сдеать в браузере яваскрптом, можно сделать языком 1С на клиенте.
2. Рулить документом DOM на сервере нельзя. Его там нет и быть не может. Поэтому при работе с документом в языке 1С всегда проверяйте, где выполняется код.

Как-то так.
47 Вафель
 
21.06.19
16:04
попробуй
offsetHeight вместо scrollHeight
48 Вафель
 
21.06.19
16:05
(46) на сервере никто и не рулит. там мы только текст подсовываем
49 Andreyyy
 
21.06.19
16:07
(47) Элементы.КомментарииСписок.Документ.body.offsetHeight равен "0" после присвоения текста полю HTML, как и scrollHeight
50 Вафель
 
21.06.19
16:09
нужно в onload а не сразу после текста
51 Юрий Лазаренко
 
21.06.19
16:10
(48) Я написал на всякий случай тем, кто будет читать эту ветку в будущем.
52 sitex
 
naïve
21.06.19
16:11
(28) На (8.3.14.1630) попробовал чисто текст без ПодключитьОбработчикОжидания и с ним , поведение одинаковое, прокрутка есть.
53 sitex
 
naïve
21.06.19
16:15
(52) + убрал вообще с <body> -> onload="scrollBottom(). тоже норм.
54 Andreyyy
 
21.06.19
16:17
(5) Работает как надо.
55 Юрий Лазаренко
 
21.06.19
16:20
(52) Опыт разработки фронтов на веб показывает, что один и тот же код может работать в разных браузерах и разных системах настолько по-разному, что заманаешься писать все возможные варианты. Я пока не могу объяснить, почему в 1С это в одном случае работает, а в другом нет, надо глубоко лезть в новый 1Сный браузер. Просто приходилось сталкиваться с подобными задачами в JS, там это решалось путем завершения выполнения кода в одной функции и продолжения в другой через обработчик ожидания. Действия в итоге выполняются одни и те же, до документ успевает прийти в нужную кондицию.

Бывают и обратные задачи, когда надо однозначно все выполнить в одной функции.
56 Andreyyy
 
21.06.19
16:21
(52) Оставлю через обработчик ожидания, а то может 7 пятниц на неделе.
57 Andreyyy
 
21.06.19
16:22
(54) к (47) offsetHeight вместо scrollHeight
58 Вафель
 
21.06.19
16:24
(56) сделай скрипт + обработчик.
что-то одно да сработает )))
59 Andreyyy
 
21.06.19
16:25
(58) И кнопку еще !
60 Юрий Лазаренко
 
21.06.19
16:41
Кстати, если ТС не против, я бы рассказал о подобном поведении платформы на докладе.
(0) Не против?
61 Вафель
 
21.06.19
16:43
(60) Расскажешьш почему scrollHeight не вычисляется? или повторишь (41)
62 Юрий Лазаренко
 
21.06.19
16:46
(61) Думаю, что к сентябрю уже расскажу, почему.
63 Andreyyy
 
21.06.19
16:51
(60) Конечно не против ! Только за.
64 Юрий Лазаренко
 
21.06.19
16:55
(63) Спасибо
65 Сияющий в темноте
 
21.06.19
18:59
А чего,window onload через event повесить нельзя?
66 Юрий Лазаренко
 
23.06.19
12:12
(65) Можно, скрипт и так срабатывал. Вопрос в том, что документ в этот момент еще не сформирован как надо. Или не отображен как надо.
67 Сияющий в темноте
 
24.06.19
08:27
(66)вообще,если верить документации,то onload должен приходить после того как документ ПОЛНОСТЬЮ загружен,если это не так,то,значит,1с использует кривую реализацию html,и там можно будет ловить глюки на каждом шагу.
у осла было еще событие oncompose,насколько я помню.
можно сделатб хитрость,в поле вставить iframe,а уже на нем отрабатывать событие загрузки,по идее,оно должно работать правильно.
68 Юрий Лазаренко
 
24.06.19
09:55
(67) Документ скорее всего загружен, иначе и скрипт не загрузился бы. Вопрос в том, "открылось" ли окно с этим документом. Похоже, что документ уже заполнился, но элементы в нем не отобразились как положено. Поэтому высота страницы считается неверно.
69 Andreyyy
 
18.07.19
01:22
Поправка для web-клиента:

При обработчике ожидания за 0.1 секунды поле HTML документа не успевает сформироваться (Элементы.КомментарииСписок.Документ = Неопределено) и приходится опрашивать повторно, на второй-третий раз срабатывает.
70 Сияющий в темноте
 
18.07.19
07:20
(69)в веб клиенте,поле - это iframe,и он в каждом браузере работает по свойму,но чаще всего,вообще в отдельном потоке,соответственно,нужно ловить события внутри самого html и писать его не через строку,а загрузкой,тогда onload честно отработает.
71 Diversus
 
13.08.19
15:09
Мне вот интересно почему в 8.3.14 не работает событие в body onscroll?
Пример.
<html>
<head>
<script type='text/javascript'>
function fonscroll(value){
    var scrollpos = Math.max( $("html").scrollTop(), $("body").scrollTop() );
    var elem = document.getElementById("scrollpos");
    if (elem != null){
        elem.innerHTML = scrollpos;
    }    
}
</script>
</head>
<body onscroll='fonscroll()'>
Тут текст
<div id="scrollpos">0</div>
</body>
</html>

Смысл такой, что при скролинге обновляется текст в scrollpos и мы при перерисовке можем указать куда сместиться. В 8.3.12 и сейчас в браузере это работает, а вот в 8.3.14 не работает.
Событие onscroll вообще не срабатывает...

Сталкивался кто?