|   |   | 
| 
 | 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) Ясно.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |