Имя: Пароль:
1C
1C 7.7
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) Ясно.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.