Имя: Пароль:
1C
1C 7.7
v7: Как обновлять ТабличноеПоле + ПоставщикДанныхИТ (1С++)
,
0 zelenprog
 
09.07.24
13:53
Здравствуйте!

Подскажите, как правильно обновить ТП (ТабличноеПоле)?

Есть ТП + ПоставщикДанныхИТ + ИТ (ИндексированнаяТаблица).
В цикле в ИТ добавляются строки.

Нужно сделать, чтобы после добавления каждой новой строки в ИТ, ТП обновилось и показало эту последнюю строку.
Какие методы каких объектов для этого нужно вызвать?

Сейчас у меня сделано просто вот так:


     ИТДанные = ... // Создание ИТ
     .....
     мФорма = СоздатьОбъект("Форма");
     мФорма.УстановитьФорму(Форма);
     мТабличноеПоле = мФорма.СоздатьЭлементУправления("ТабличноеПоле", "дКнТабличноеПоле");
     мТабличноеПоле.ВертСкроллер = 1;
    
     мПоставщикТабличногоПоля = СоздатьОбъект("ПоставщикДанныхИТ");
     мПоставщикТабличногоПоля.ИндексированнаяТаблица = ИТДанные;
     мТабличноеПоле.ПоставщикДанных = мПоставщикТабличногоПоля;

     // затем в цикле
     Цикл
          ....
          ИТДанные.НоваяСтрока();
          ИТДанные.Знач1 = ххх;
          ИТДанные.Знач2 = ууу;
          ....
          мТабличноеПоле.ТекущаяСтрока = ИТДанные.КоличествоСтрок();
          мТабличноеПоле.ОбновитьСтроки();

     КонецЦикла;


Вроде работает, но интерфейс сильно "дергается" при этом.
Можно ли это сделать как-то по другому, чтобы было меньше "дерганий"?
1 trad
 
09.07.24
11:41
зачем обновлять "после добавления каждой новой строки"?
2 zelenprog
 
09.07.24
11:42
(1) Мне нужно, чтобы именно в цикле при добавлении каждой новой строки это отображалось пользователю.
То есть чтобы пользователь видел как "растет" табличка.

Но без лишних мельканий. Сейчас это очень сильно мелькает.
3 trad
 
09.07.24
11:42
попробуй ПерерисоватьСтроки()
4 Злопчинский
 
09.07.24
11:58
(2) ну нарисуй прогресс-бар. Будет видно как идет процесс. В формексе для прогрессбара появился спецметод.
5 zelenprog
 
09.07.24
12:04
(3) А в чем разница "ОбновитьСтроки" и "ПерерисоватьСтроки"?

Кстати, экспериментируя, я выяснил что если убрать строку
"мТабличноеПоле.ВертСкроллер = 1;"

то мельканий становится меньше.
6 zelenprog
 
09.07.24
12:07
(4) Это уже не то.

Задумка была такая, что в строках выводится нужная информация по обработанному объекту:
- обработали объект - добавили в таблицу строку - заполнили нужной для пользователя информацией.
И пользователь сидит и видит подробную информацию о ходе обработки.
7 trad
 
09.07.24
12:24
(5) >> А в чем разница "ОбновитьСтроки" и "ПерерисоватьСтроки"?
Кратко в документации написано, подробно - в исходниках
8 Злопчинский
 
09.07.24
12:26
(6) имитация бурной деятельности пользователем?
9 trad
 
09.07.24
12:44
Собрал тестовый пример (с чего собственно нужно было начать тебе) - ничего не мелькает.
Отсекай все лишнее. Ищи что приводит к мельканию. Во-первых проверь ПриВыводеСтроки, ПриАктивизацииСтроки
10 trad
 
09.07.24
12:42
(8) почему?..
Вполне бывает нужно видеть ход какого-то процесса с выводом информации (логирование) с автоскролом
11 Злопчинский
 
09.07.24
12:57
(10) сомневаюсь, что это такой случай.
Скорее просто "для красоты", сам иногда так делаю ;-)
12 zelenprog
 
09.07.24
13:26
(9) >> Отсекай все лишнее.... Во-первых проверь ПриВыводеСтроки, ПриАктивизацииСтроки

Да вроде нету у меня ничего лишнего. Код примерно такой как в (0). То есть просто цикл и в цикле добавление строки.
Есть обработчики событий "ПриНачалеВыбораЗначения", "ПриИзмененииРазмераОкна". Они не срабатывают при заполнении таблицы. Других событий нет.

>> Собрал тестовый пример ... ничего не мелькает.

А ты пробовал с включенной полосой прокрутки?
"мТабличноеПоле.ВертСкроллер = 1;"
13 zelenprog
 
09.07.24
13:51
(7) >> >> А в чем разница "ОбновитьСтроки" и "ПерерисоватьСтроки"?
>> Кратко в документации написано, подробно - в исходниках

Где взять исходники?
14 zelenprog
 
09.07.24
14:43
(13)+ В документации написано:
Синтаксис: ОбновитьСтроки()
Описание: перечитать строки, отображаемые в данный момент в табличном поле. Табличное поле будет стараться сохранить текущую строку.

ПерерисоватьСтроки / RedrawRows
Синтаксис:    ПерерисоватьСтроки()
Описание:    Обновить строки, отображаемые в данный момент в табличном поле, без обращения к провайдеру.


Из этого описания следует, что метод "ПерерисоватьСтроки" не подходит при добавлении в ИТ новой строки.
Он не сможет корректно отобразить изменения в ТП без обращения к провайдеру. Так как про новую добавленную строку "знает" только провайдер.

Хотя вопрос про взаимодействие провайдера и ТП интересно.
В какой момент ТП запрашивает данные у провайдера? Только при вызове "ОбновитьСтроки"?
15 trad
 
09.07.24
14:39
(14) отлично. Значит не подходит
16 trad
 
09.07.24
14:40
(12) полоса есть, не выключал
17 zelenprog
 
09.07.24
15:43
(15) >> ... Значит не подходит

Из любопытства проверил - работает!!!
Либо описание метода неверно, либо реализация не соответствует описанию.

Действительно без исходников не разобраться.
Все-таки где их взять? На 1cpp.ru - не нашел.
18 zelenprog
 
09.07.24
15:42
И еще второй вопрос.
Если в ИТДанные меняется какое-то значение в конкретной колонке в конкретной строке.
Как сделать, чтобы это изменение сразу отобразилось в ТабличномПоле в соответствующей ячейке с минимальной перерисовкой интерфейса?
То есть нужно обновить только эту ячейку, всю ТП обновлять не надо. Если обновлять всю ТП - опять получим "мельканья".
19 trad
 
09.07.24
15:48
(18) нет такой возможности. Самый "щадящий" метод ПерерисоватьСтроки
20 trad
 
09.07.24
15:55
21 zelenprog
 
09.07.24
16:00
(20) нет, не мелькает
22 trad
 
09.07.24
16:07
значит все же есть что-то "лишнее"
23 zelenprog
 
09.07.24
16:25
(22) Согласен.
Только не могу понять, что мешает.

Думал может быть привязка границ приводит к лишним перерисовкам?
У меня привязка делается классом "Общие.Форма.Привязка2".
Убрал эту привязку - все равно мелькает.
Причем мелькает при включенном скроллере: "ВертСкроллер = 1".
Если сделать "ВертСкроллер = 0" - не мелькает.

Похоже, что как будто каждый раз при добавлении новой строки в ИТ, текущая строка Табличного поля прыгает в начало.
24 zelenprog
 
09.07.24
16:55
У тебя какая версия TableDoc.dll?
У меня 0.1.1.47.
Может быть в этом дело?
25 trad
 
09.07.24
18:14
Табледок то тут причем?
У тебя есть два образца для исследования. С проблемой и без. Какая сложность выявить зависимость?
26 zelenprog
 
10.07.24
08:41
Понял, в чем дело.
Мелькание есть и в твоем тесте. Просто в твоем тесте оно не заметно, потому что окошко в высоту слишком маленькое.

Прикладываю твой тест чуть переделанный: сделал окошко побольше и добавил задержку между выводом строк. Теперь мелькание очень даже заметно.
Мелькание происходит пока не заполнена вся видимая часть таблицы при включенном вертикальном скроллбаре.
https://dropmefiles.com/BSxAn

При выключенном вертскроллере мелькание отсутствует.
27 trad
 
10.07.24
08:54
да, есть мелькание
Выход - оставлять полоску в авторежиме
28 zelenprog
 
10.07.24
08:56
А насчет исходников можешь помочь?
Все-таки интересно посмотреть как реализованы "ОбновитьСтроки", "ПерерисоватьСтроки".
29 trad
 
10.07.24
09:02
У меня, скорее всего, не самые последние, но, касательно твоего вопроса, актуальные
https://www.dropbox.com/scl/fi/znuh9q8prji5vyfr8gqh6/icpp.zip?rlkey=ldet9l0t18qfkpujpqbkki00g&dl=0
30 trad
 
10.07.24
09:14
Тут, у Димы trdm, еще есть
https://github.com/trdm/alterplast
31 victuan1
 
11.07.24
07:21
А есть метод, который позволяет позиционироваться на выбранную строку тп? или хотя бы на первую строку?

А то иной раз при изменении данных в тп, часть верхних строк после обновления данных в ПД в тп загружаются, но оказываются за пределами видимости.
Например, в тп стало 30 строк, но видны с 18-ой по 30-ую.
Первые 17 строк за пределами видимости, приходится пролистывать пользователю тп.
32 zelenprog
 
11.07.24
08:34
(31) Дык выше в примерах есть пример позиционирования: "          мТабличноеПоле.ТекущаяСтрока = ИТДанные.КоличествоСтрок();"
33 victuan1
 
11.07.24
14:18
(32) Этот пример не работает, делаю так:
мТабличноеПоле.ТекущаяСтрока = 1;
мТабличноеПоле.ОбновитьСтроки();

И всё равно верхняя строка на форме - 18-я.
Чтобы увидеть первую, приходится перелистывать тп.
34 victuan1
 
11.07.24
15:04
(33) Оно и не должно работать, т.к. фильтр на ИТ установлен.
Видимая строка, к примеру 1-ая, а фактическая - 64-ая.

Получается, нужно указывать номер первой видимой строки.
Ладно, подумаю еще...

PS. Подумал, вопрос решен: для свойства ТекущаяСтрока нужно брать номер видимой строки (с учетом индекса по ПД).
35 zelenprog
 
12.07.24
08:39
(34) То есть, чтобы в ТП спозиционироваться на первой строке для твоего примера с учетом индекса, надо указать
мТабличноеПоле.ТекущаяСтрока = 64;

Верно я понял?
А как определить этот реальный номер "64"?
36 victuan1
 
12.07.24
09:42
(35) Верно понял.
Способы найти разные. Например, через метод ИТ - НайтиСтроку отыскать номер первой строки по нужному индексу.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.