|
v7: ТЗ на форме обработки с фиксированным количеством строк. Как правильно сделать? | ☑ | ||
---|---|---|---|---|
0
MWWRuza
гуру
05.10.22
✎
23:19
|
Добрый вечер!
Есть некая обработка, на форме которой ТаблицаЗначений со строго фиксированным количеством строк - 10. Заполняется из справочника при открытии, и при некоторых других действиях, не важно. Понадобилось сделать сдвиг строк кнопками вверх/вниз. Сделал. Все работает. Но, хочу, что-бы текущей строкой была строка, куда была сдвинута позиция. Тоже все работает, но нормально - только на первых пяти верхних строках. Потом, текущая строка как-бы "замораживается" на месте, и начинают "ездить" все остальные строки таблицы - первые(верхние) строки уезжают вверх за пределы таблицы, а снизу вылезают пустые строки. Если не понятно объяснил, то вот видео, как это происходит: https://cloud.mail.ru/public/cz1D/pdfra248h Есть какие-то варианты, что-бы избежать этого, т.е., при сдвиге строк в нижней половине таблицы, просто перемещалась текущая строка, а не ползла вверх вся таблица? |
|||
1
Garykom
гуру
05.10.22
✎
23:44
|
||||
2
Garykom
гуру
05.10.22
✎
23:47
|
Но имхо у тебя косяк list index out of bounds
|
|||
3
MWWRuza
гуру
05.10.22
✎
23:50
|
(2) Тоесть, сделать, что-бы лишняя, 11 строка изначально была видна?
(1) А Формекс... Весь перекопал, ничего похожего не нашел... |
|||
4
MWWRuza
гуру
06.10.22
✎
00:05
|
(3) Тоесть, сделать, что-бы лишняя, 11 строка изначально была видна?
Попробовал, не помогает... Есть штатный аметод: ТаблДиалога.ВидимостьКолонки("Код, Цена, 8, 5"); Зафиксировать в элементе диалоговой формы «Таблица значений» колонки и строки позволяет метод Фиксировать() (англоязычный синоним — Fix()). Фиксированные колонки и строки не прокручиваются с помощью полос прокрутки. Синтаксис метода: Фиксировать(<КолСтрок>, <КолКолонок>) где <КолСтрок> — количество фиксируемых строк. Параметр является необязательным. Если не указан, то не изменяет фиксацию; <КолКолонок> — количество фиксируемых колонок. Параметр является необязательным. Если не указан, то не изменяет фиксацию. Пример использования: ТЗ.Фиксировать(1, 1); Казалось бы, то, что надо, зафиксировать 10 строк, и все... Но, не тут-то было... Перестает вообще курсор попадать на фиксированные строки... |
|||
5
MWWRuza
гуру
06.10.22
✎
00:19
|
Т.Е, после применения метода Фиксировать(), активной становится 11 строка, первая следом за фиксированными. Те, что зафиксированы, становятся недоступными :-(
|
|||
6
MWWRuza
гуру
06.10.22
✎
00:45
|
Заменить ТЗ на ТабличныйДокумент Йоксель-?
Можно конечно, думаю будет работать... Но, это как-то "из пушки по воробьям"... Неужели ничего попроще нельзя сделать? |
|||
7
victuan1
06.10.22
✎
05:10
|
(0) Не смог у себя воспроизвести твою проблему https://ibb.co/HxcJNMV
Процедура ИзменениеПорядка(НаправлениеСдвига, ТекТаб) ТекСтр = ТекТаб.ТекущаяСтрока(); Если ТекСтр = 0 Тогда Возврат ИначеЕсли (ТекСтр=1) и (НаправлениеСдвига=-1) Тогда ТекТаб.СдвинутьСтроку(ТекТаб.КоличествоСтрок()-1, ТекСтр); ТекТаб.ТекущаяСтрока(ТекТаб.КоличествоСтрок()) ИначеЕсли (ТекСтр=ТекТаб.КоличествоСтрок()) и (НаправлениеСдвига=1) Тогда ТекТаб.СдвинутьСтроку(1-ТекТаб.КоличествоСтрок(), ТекСтр); ТекТаб.ТекущаяСтрока(1) Иначе ТекТаб.СдвинутьСтроку(НаправлениеСдвига, ТекСтр); ТекТаб.ТекущаяСтрока(ТекСтр+НаправлениеСдвига) КонецЕсли; КонецПроцедуры // ИзменениеПорядка() |
|||
8
Garykom
гуру
06.10.22
✎
05:32
|
(7) ну да нет такой проблемы если за границы первой и последней строк не пытаться передвинуть
|
|||
9
uno-group
06.10.22
✎
09:08
|
Нужно вычислять сколько строк фиксировать и фиксировать при сдвиге все строки сверху. Как то так.
//******************************************* Процедура Сформировать2() Тз.Фиксировать(0); КонецПроцедуры Процедура Сформировать() Текстрока=Тз.ТекущаяСтрока(); Тз.Фиксировать(Текстрока-2,1); Тз.ТекущаяСтрока(Текстрока-1); Сформировать2(); КонецПроцедуры Тз.НоваяКолонка("Ном"); Тз.НоваяКолонка("ТМЦ"); Тз.НоваяСтрока();Тз.Ном="1"; Тз.НоваяСтрока();Тз.Ном="2"; Тз.НоваяСтрока();Тз.Ном="3"; Тз.НоваяСтрока();Тз.Ном="4"; Тз.НоваяСтрока();Тз.Ном="5"; Тз.НоваяСтрока();Тз.Ном="6"; Тз.НоваяСтрока();Тз.Ном="7"; Тз.НоваяСтрока();Тз.Ном="8"; Тз.НоваяСтрока();Тз.Ном="9"; Тз.НоваяСтрока();Тз.Ном="10"; Тз.Фиксировать(9,1); Тз.ТекущаяСтрока(10); |
|||
10
uno-group
06.10.22
✎
09:11
|
через обработку ожидания Через секунду после открытия выполнить Сформировать2() иначе на даст мышкой активизировать строку до первого выполнения сдвига по кнопке.
|
|||
11
takefive
06.10.22
✎
09:17
|
Строки не трогать а менять данные строки?
|
|||
12
uno-group
06.10.22
✎
10:09
|
Можно заменить раскраску активного Элемента на формекс при желании не меняя текущую строку. хотя 9 прекрасно работает без доп вк.
|
|||
13
MWWRuza
гуру
06.10.22
✎
10:29
|
(9) Спасибо, буду пробовать... Фиксировать не все 10 строк, а только те, что выше, интересная идея.
(11) Да пофик. Во вложении тестовая обработка, кусок от моей рабочей, где выкинуто все "лишнее" и оставлено только то, что относится к теме сабжа... Там переключатель двух вариантов сдвига - строку не двигаем, мненяем только данные и строку двигаем, меняем только ее код. Без разницы. Таблица начинает "сползать" после команды установки текущей строки. И даже если вообще ничего не двигать, а просто текущую строку устанавливать, то наблюдается такой эффект. (Отдельная кнопка в тестовой обработке)... Тестовая обработка для демонстрации всего этого "безобразия": https://cloud.mail.ru/public/LBuq/iW5hJ9mi7 |
|||
14
uno-group
06.10.22
✎
11:09
|
По идее можно просто зафиксировать все строки и 1 колонку. а по остальным спокойно перемещается. нужно это только в правильной процедуре в правильный момент времени сделать.
|
|||
15
uno-group
06.10.22
✎
11:14
|
при открытии Тз.Фиксировать(,1);
А при сдвиге Фиксируем все что выше, меняем ТекущуюСтроку() и Тз.Фиксировать(,1); |
|||
16
MWWRuza
гуру
06.10.22
✎
11:15
|
(9), (10) Сделал. Работает идеально. Без обработки ожидания - перед установкой текущей строки фиксирую строки на одну меньше новой текущей, устанавливаю текущую, и тут-же отменяю фиксацию.
Ничего никуда не сползает. Спасибо за идею! Вот, исправленная тестовая обработка, может кому пригодится: https://cloud.mail.ru/public/w6xC/CnYg7EV1P Тут говорят, что может поползти при изменении масштаба или шрифта... Надо попробовать, но, не знаю - вроде не с чего... Максимум, что может случиться - не влезут эти десять строк в таблицу на форме. Ну, и ладно, прокрутят, котя это полностью нарушает всю концепцию этой таблицы с фиксированным количеством строк - все строки должны быть видны и ничего лишнего. Можно конечно, вычислять высоту строки и подгонять высоту таблицы под 10 строк любой новой высоты... Но, я не думааю, что это нужно. (14) Это я еще вчера пробовал, не прокатило... Фиксировал все 10 и только первую колонку, где код строки. Не дает перемещаться о строкам. |
|||
17
ADirks
06.10.22
✎
11:20
|
(0) можно вообще отказаться от ТЗ в пользу таблицы в режиме ввода, или ещё лучше ТабличныйДокумент (TableDoc.dll)
(16) с фиксированием строк есть неприятность: если количество фиксируемых строк не помещается в окно (изменили масштаб или шрифты), то 1С тупо сворачивается. |
|||
18
MWWRuza
гуру
06.10.22
✎
11:56
|
(7) Не смог у себя воспроизвести твою проблему https://ibb.co/HxcJNMV
Виктор, я так понял, что у тебя не воспроизводится, потому, что только 5 строк в ТЗ. Она начинает "ползти" начиная с 6-той строки. А у меня их 10. Это требование кассовой программы-фронта, для которой это я делал. Потому, что открывается менюшка "быстрого доступа", в котором достаточно тыкнуть одну клавишу на цифровой клавиатуре и товар добавляется в чек. А там клавиш всего десять, с 0 по 9 :-) (17) Да, есть такое, падает 1С если зафиксировать строку большую, чем влезает в таблицу. Ну, значит не будут масштаб/шрифты менять... У меня в конфе много мест, где увеличение масштаба/шрифта приводит минимум к неудобству работы. Одна только загрузка из ЭДО чего стоит... Теперь добавилось еще одно, которое вообще приводит к падению 1С :-( Ну, что поделать, издержки. А насчет ТабличногоДокумента, я конечно подумаю. Но, пока лень переделывать, если бы сразу знал о таком эффекте, то да. А теперь, работает - и ладно :-) |
|||
19
MWWRuza
гуру
06.10.22
✎
12:29
|
+(18) В принципе, если как-то определить, сколько строк влезает в видимую часть ТЗ, то можно просто запретить фиксацию строк больше, чем "влезло" - 1, и все. Да, будет "ползать", если сдвигаем строку за пределы видимой части ТЗ, но это и правильно, так и должно быть.
Вопрос - как определить высоту видимой части ТЗ при текущем масштабе/размере шрифта?... Надо ФормЕкс покопать, наверняка он это должен уметь... |
|||
20
MWWRuza
гуру
06.10.22
✎
15:33
|
(19) Вопрос - как определить высоту видимой части ТЗ при текущем масштабе/размере шрифта?
Ответ - похоже никак... Высоту таблицы я получаю, в "попугаях", а вот высоту строки, я не нашел как можно определить... ВысотаСтроки() в ФормЕкс, может возвращать высоту строки только табличного документа, но не строки ТЗ на форме. Но и похоже проблемы нет как таковой - изначально задаешь размер таблицы, что-бы все десять строк уместились, снимаешь галочку в свойствах формы "ИзменятьРазмер" и все. Любой шрифт задаешь, хоть для формы этой обработки, хоть для всех форм конфигурации - вся форма увеличивается пропорционально, в том числе и высота таблицы, количество видимых строк остается тем-же, и ничего за пределы видимости не вылезает, соответственно 1С не падает. Во всяком случае, любыми экспериментами со шрифтами, мне завалить 1С не удалось :-) А вот с этой галочкой, можно подтянуть нижнюю границу формы так, что таблица тоже уменьшится, и при попытке сдвинуть строку ниже последней видимой строки - 1С вылетает. Как-то так. |
|||
21
Garykom
гуру
06.10.22
✎
18:08
|
(18) в 1C 7.7 так то много багов и часто падает
на модальную форму повесь поле даты, встань на него и сканером клавиатурным туда считай ШК и упс |
|||
22
Злопчинский
07.10.22
✎
00:28
|
(20) можно, даже где-то в залежах у меня валяется (но глубоко), полистай ветки с обсужденяими формекса кто-то давал код...
|
|||
23
MWWRuza
гуру
07.10.22
✎
10:08
|
(22) Поищу, может пригодится на будущее, не для этой задачи...
(21) Ну, багов хватает, и у снеговика их не меньше, если не больше. А "клавиатурные сканеры" - это ЗЛО :-) Но, это ОФФ для этой темы :-) |
|||
24
Arbuz
07.10.22
✎
12:25
|
(21) Слушай, у меня не падает! Совсем. Ни на одном месте. Хотя обвешана как рождественская ёлка. За последние лет 10 падала исключительно по внешним причинам, в основном аппаратным.
|
|||
25
victuan1
12.10.22
✎
06:58
|
(18) "(7) Не смог у себя воспроизвести твою проблему https://ibb.co/HxcJNMV
Виктор, я так понял, что у тебя не воспроизводится, потому, что только 5 строк в ТЗ. Она начинает "ползти" начиная с 6-той строки. А у меня их 10." В моем примере тоже 10 строк - на приложенном скрине это видно. |
|||
26
MWWRuza
гуру
12.10.22
✎
23:17
|
Я понимаю, что судя по нумерации, их там 10. Но видимых - то только пять. Остальные пять, за пределами окошка ТЗ. И при перемещениям по строкам, строки ТЗ "прокручиваются", так и должно быть. А как иначе?
В моем же случае, все 10 строк видимые, высота таблицы такая, что они все видны. И выделенная строка должна просто перемещаться по таблице, с первой по десятую видимые строки, не вызывая ее "прокрутку" и появления "из под низа" лишних пустых. В (16) лежит тестовая обработка, где это пофиксено, работает именно так, как мне нужно. А в (13), исходная, где этот эффект виден в полной мере. |
|||
27
victuan1
14.10.22
✎
06:22
|
(26) Ясно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |