Имя: Пароль:
1C
1C 7.7
v7: Финт с выводом текущей колонки с функцией на форме - как?
0 Злопчинский
 
08.09.23
13:26
Например, Спр.Номенклатура.ФормаСписка
кладем на форму текст с функцией, которая выводит идентификатор текущей колонки формы списка

//************************************************************************
//
Функция ИмяКолонки()
   //Форма.Обновить(0);
   ЗначениеКолонки = Форма.ТекущаяКолонка();    
   Возврат ЗначениеКолонки;
КонецФункции // ИмяКолонки()  
.
если по строке справочника бегаем курсором влево-вправо - функция не отрабатывает, имя колонки не меняется
впихнуть в функцию Форма.Обновить() - бяка, экран постоянно перерисовывается.
.
был какой-то финт, который позволял получить нужный результат, но какой? не помню...  
???
1 victuan1
 
08.09.23
13:39
Функция ИмяКолонки()
    ИмяКолонки_="";
    ИмяКолонки_= Форма.ПолучитьАтрибут(Форма.ТекущаяКолонка()).Заголовок();
    Форма.Обновить();

    Возврат ""+ИмяКолонки_;
КонецФункции
2 Злопчинский
 
08.09.23
13:45
И чем это отличается от (0)..?
не пойдет, обновить - вызывает "зацикливание" перерисовки экрана, проц грузится на постоянку
3 ЯнСмит
 
08.09.23
13:51
(0) а если попробовать не штатный метод Обновить(), а одноименной от Альфа (РасширениеФормы), он вроде как никаких перерасчетов не делает
4 РусскийВедун
 
08.09.23
13:53
(0) поставь флаг если колонка видна то не не надо обновлять и наоборот.
5 РусскийВедун
 
08.09.23
13:55
(4) чтобы обновлялось 1 раз при смене видимости.
6 ЯнСмит
 
08.09.23
13:57
(0) а еще можно формексом эмулировать нажатие стрелка вниз+стрелка вверх, тогда все работает без всяких обновлений
7 Харлампий Дымба
 
08.09.23
14:47
(6) Не сработает, если список пуст или один элемент. Или если курсор на последнем элементе (но тут поможет стрелка вверх+стрелка вниз). Но это надо прикладную задачу уже знать, так-то я бы тоже в эту сторону бы попытался.
8 Харлампий Дымба
 
08.09.23
14:48
А было вроде что-то типа Форма.ОбработкаОжидания(1)
9 Djelf
 
08.09.23
14:56
(0) Используй ТабличноеПоле Люк!
10 Злопчинский
 
08.09.23
15:25
(4) всё колонки видны и при чем здесь это?
11 Злопчинский
 
08.09.23
15:26
(3) была мысль, но пока м. Б. Штатно..?
12 Злопчинский
 
08.09.23
15:27
(8) и как это сюда прилепить?
13 tgu82
 
08.09.23
15:32
(11) Пробовал. ФормаРасш - это РасширениФормы из глобального модуля. Но тогда ничего не работает вообще
Функция ИмяКолонки()
    ИмяКолонки_="";  
    Попытка      
    ФормаРасш.Обновить();
     ИмяКолонки_= ""+ФормаРасш.ТекущаяКолонка()+":  "+ПолучитьАтрибут(ФормаРасш.ТекущаяКолонка());       
     Возврат ИмяКолонки_;                                                        
    Исключение
     Возврат "";  
    КонецПопытки;  
    Возврат "";
КонецФункции
14 tgu82
 
08.09.23
15:33
(13)+ Или ФормаРасш надо каждый раз инициализировать в процедуре формекса После Открытия ???
15 Харлампий Дымба
 
08.09.23
15:39
(12) Перерисовывать реже, не при пробеге курсора по каждой колонке таблицы дёргать Форма.Обновить(), а раз в секунду проверять изменилось ли Форма.ТекущаяКолонка() и обновлять при необходимости.
16 tgu82
 
08.09.23
15:42
(12) Через ФормаРасш.Обновить() не мигает но и значения атрибутов не показывает.
(15) Так Форма.ТекущаяКолонка() и меняется после Обновить(1) Иначе вообще не меняется пока клавишу Ввода не нажмешь
17 Харлампий Дымба
 
08.09.23
15:44
(16) То есть без внешних компонент никак? Хм
18 tgu82
 
08.09.23
15:50
(18) ТАк из помощью Формекса не получается. Чего-то я не соображаю.
Там есть еще процедура ПослеОБновленияФормы. Но как к ней прицепить вызов функции в текстовом поле на форме чтоб показать необходимую мне информацию - не знаю
19 tgu82
 
08.09.23
15:50
(17) Сорри
20 tgu82
 
08.09.23
15:54
(19)+ ФиксироватьМногострочнуюЧасть получается, максимизировать окно получается а вот тут неудобно потому что экран дергается как ненормальный.

Мне это надо из-за того что нет возможность наименование колонок в форме списка справочника в несколько строк (для ТЗ у Альфа такое работает) и поэтому я показываю наименование заголовка колонки (на форме не видно если длинные) и тут же значений колонки, которые тоже не видны потому что растянуть значение колонки по высоте исходя из ее ширина я не смог - не нашел какими методами такое можно сделать в Формексе.
21 tgu82
 
08.09.23
15:56
(9) Насчет использования ТАбличногоПоля. Слишком мало знаний о нем. И к тому же если его использовать как я понимаю то
все удобства Формы списка справочника включая отбор поиск и пр - придется делать самому
22 tgu82
 
08.09.23
15:57
Я и Альфу написал но пока он ничего не ответил. Занят видимо
23 tgu82
 
08.09.23
16:22
(17) Есть реквизит справочника Дата_Точки_подключения с синонимом :Срок представления точки подключения по договору (доп. согл.)
В Форме списка справочника выходит именно нормальное человеческое название но Форма.ТекущаяКолонка() показывает Дата_Точки_подключения а не Синоним - название в человеческом виде. Как зацепить именно синоним ???
24 Харлампий Дымба
 
08.09.23
16:27
(23) а как в (1) Форма.ПолучитьАтрибут(Форма.ТекущаяКолонка()).Заголовок(), не?
25 tgu82
 
08.09.23
16:45
(24) Ну точно же. Спасибо огромное!!! Вот я баран. Но мигает и дергается экран. Как бы хоть с помощью чего угодно добороть бы это!!!
26 FN
 
08.09.23
17:54
(0) В добавок к этому используй другие события
ПриИзмененииРазмераОкна
27 FN
 
08.09.23
17:55
+
ПриОтжатииКнопкиКлавиатуры
ПриОтжатииЛевойКнопки
ПриОтжатииПравойКнопки

Если текущая колонка поменялась - то значит меняй заголовко нужного атрибута.
28 Guk
 
08.09.23
18:03
(12) ты не в курсе, что есть нештатная ОбработкаОжидания для каждой формы?...
29 Guk
 
08.09.23
18:10
+(28) по крайней мере форма рефрешиться не будет. вполне себе вариант...
30 tgu82
 
08.09.23
19:42
(28) В курсе и я ее использую частенько
31 Djelf
 
08.09.23
21:00
(21) Это надуманно что это сложно, это довольно просто.
Но там немного другая идеология работы, примерно как в 8ке.
Поиск и штатно нормально работает (но можно бустануть средствами ТП), а с вот с отбором посложнее - слишком много вариантов реализаций, можно по тыке на заголовке, можно по пкм по текущему элементу или что-то другое, можно при наборе паттерна по like при наборе в быстром поиске.
ТЗ нервно курит в сторонке…
32 Злопчинский
 
08.09.23
21:42
Вот засосало @Ëпрст болото снеговика... И всë... Некому мастер класс показать...
33 Злопчинский
 
08.09.23
21:46
(15) ну так если толькоивлеаовпраао курсор то хоть раз в двадцать секунд - форма.ТекущаяКолонка() без обновить() не поменяется
34 Guk
 
08.09.23
22:34
проверил. как два пальца об асфальт. работает...

Процедура ПолучитьИмяКолонки()
    Сообщить(Таб.ТекущаяКолонка());
КонецПроцедуры


Таб.НоваяКолонка("Колонка1");
Таб.НоваяКолонка("Колонка2");
Таб.НоваяКолонка("Колонка3");

Форма.ОбработкаОжидания("ПолучитьИмяКолонки", 1);
35 Guk
 
08.09.23
22:34
Таб, это ТЗ на форме...
36 Guk
 
08.09.23
22:36
чтобы постоянно не херачила, надо завести переменную, где будет имя текущей колонки. если имя текущей колонки  = имя текущей колонки, тогда возврат...
37 Харлампий Дымба
 
08.09.23
22:41
(33) Да tgu82 в (16 ) написал же. Да и я поэкспрементировал - видимо действительно горизонтальное движение по форме списка не является событием обновления формы и 1Ска не меняет значение функции ТекущаяКолонка() - тупо возвращает значение, которое было после последнего "обновления".
(34) ТЗ возможно работает, а вот заставить бы форму списка без внешних компонент - было бы интересно
38 Guk
 
08.09.23
22:45
(37) а какая разница?...
39 Харлампий Дымба
 
08.09.23
22:53
(38) ну это Злопа надо спрашивать.
Мне как пользователю со типовой формой списка работать поприятнее чем с типовой ТЗ.
40 Злопчинский
 
09.09.23
00:07
(34) для формы списка это тоже работает.
.
но интересует не вывод в табло, а на форму...
41 Злопчинский
 
09.09.23
00:14
а на форму без Обновить - не получится
42 Злопчинский
 
09.09.23
00:19
получается вот так
на форму кладем Текст, в формуле указываем переменную ФормаТекущаяКолонка
в код кладем
.


Перем ФормаТекущаяКолонка;
Перем ФормаПредыдущаяКолонка;

//*********************************************************************************
//
Процедура ПолучитьИмяКолонки()
    ФормаТекущаяКолонка = СокрЛП(Форма.ПолучитьАтрибут(Форма.ТекущаяКолонка()).Заголовок());
    Если ФормаПредыдущаяКолонка <> ФормаТекущаяКолонка Тогда
        // ОТЛАДКА Сообщить(""+_GetPerformanceCounter()+": "+ФормаПредыдущаяКолонка +" -> "+ ФормаТекущаяКолонка);
        ФормаПредыдущаяКолонка = ФормаТекущаяКолонка;
        Форма.Обновить();
    КонецЕсли;
КонецПроцедуры // ПолучитьИмяКолонки()

...
    ФормаПредыдущаяКолонка = ""; ФормаТекущаяКолонка = "";    
    Форма.ОбработкаОжидания("ПолучитьИмяКолонки", 1);
КонецПроцедуры // ПриОткрытии()    
43 Злопчинский
 
09.09.23
00:21
есть некомфортный лаг отрисовки на форме после позиционирования курсора на новой колонке, можно этого избежать если ОО запустить через РасширениеФормы с таймаутом ~100 мсек (подобрать максимально большое, но еще комфортное)
44 Злопчинский
 
09.09.23
00:33

Перем РасширениеФормы;
Перем ФормаТекущаяКолонка;
Перем ФормаПредыдущаяКолонка;

//******************************************************************************************
//
Процедура ПолучитьИмяКолонки()
    ФормаТекущаяКолонка = СокрЛП(Форма.ПолучитьАтрибут(Форма.ТекущаяКолонка()).Заголовок());
    Если ФормаПредыдущаяКолонка <> ФормаТекущаяКолонка Тогда
        // ОТЛАДКА Сообщить(""+_GetPerformanceCounter()+": "+ФормаПредыдущаяКолонка +" -> "+ ФормаТекущаяКолонка);
        ФормаПредыдущаяКолонка = ФормаТекущаяКолонка;
        Форма.Обновить();
    КонецЕсли;
КонецПроцедуры // ПолучитьИмяКолонки()

//******************************************************************************************
//
Процедура ПослеСозданияФормы()
    ФормаПредыдущаяКолонка = ""; ФормаТекущаяКолонка = "";
    РасширениеФормы = СоздатьОбъект("РасширениеФормы");
    РасширениеФормы.ОбработкаОжидания("ПолучитьИмяКолонки", 250);
КонецПроцедуры // ПослеСозданияФормы()

45 Злопчинский
 
09.09.23
00:34
у меня 250мсек - еще комфортно, 50мсек - отлично.
но чем меньше таймаут - выше нагрузка на проц, но процент испоользования ~ до 3%
46 Злопчинский
 
09.09.23
00:38
но, блин, как-то это иначе решалось кажется мне... (поэтому и ветку завел, что про ОО сразу думал, но как-то "вроде по другому...").
.
а может, просто туплю, и так это и решалось...
47 Злопчинский
 
09.09.23
00:50
50мсек хватает чтобы словить быстрое перемещение по всем колонкам. 250мсек - уже "пропуски", но это некритично для интерактивной работы с просмотром значения на форме и движением курсорам по колонкам ;-)
48 Злопчинский
 
09.09.23
00:50
Всем спасибо!
49 tgu82
 
09.09.23
10:58
(48) А в яем тут смысл использования Формекс ???
Только в том что штатная обработка ожидания шаг меньше 1с не дает ???
50 Злопчинский
 
09.09.23
12:01
(49) угу
51 FN
 
11.09.23
09:13
(46)
Надо по событию исполнять код, а не по таймеру. В данном случае код будет работать всегда, даже когда 1С свернута или окно не активно.

Вот пример того же функционала, но по событиям.


//
Процедура ВывестиТекКолонку()
    Если Форма.Заголовок()<>Форма.ТекущаяКолонка() Тогда
        Форма.Заголовок(Форма.ТекущаяКолонка());
    КонецЕсли;
КонецПроцедуры

Процедура ПриОтжатииКнопкиКлавиатуры(КодКлавиши,Альт,Шифт,Кнтрл,Символ,ФСО)
    ВывестиТекКолонку();
КонецПроцедуры

Процедура ПриОтжатииЛевойКнопки(СостояниеМыши,КоординатаПоГоризонтали,КоординатаПоВертикали,ФСО)
    ВывестиТекКолонку();
КонецПроцедуры

Процедура ПриОтжатииПравойКнопки(СостояниеМыши,КоординатаПоГоризонтали,КоординатаПоВертикали,ФСО)
    ВывестиТекКолонку();
КонецПроцедуры

Процедура ПриИзмененииРазмераОкна(ТипСобытия,Ширина,Высота)
    ВывестиТекКолонку();
КонецПроцедуры
52 Злопчинский
 
11.09.23
09:37
(51) ну, в части задачи ТС это требуется для визуального просмотра выводимого, так что свернут/неактивно - не сильно актуально.
53 Злопчинский
 
11.09.23
09:38
(51) локальные события формы срабатывают когда форма неактивна?
54 FN
 
11.09.23
09:51
(53) нет
55 Злопчинский
 
11.09.23
13:44
(54) "В данном случае код будет работать всегда, даже когда 1С свернута или окно не активно." - ???
56 FN
 
11.09.23
14:58
(55) это я писал про код из (42) - обработка ожидания работает всегда. даже если пользователь занимается чем-то другим.

локальные события формы как в (51) срабатывают только когда форма активна и когда произошло событие.
То есть процессор не нагружается лишней работой и нет никаких некомфортных лагов.
57 Злопчинский
 
12.09.23
00:25
(56) ага, спасиб.
.
если форму с ОО перекрыть сверху дочерней модальной формой, то ОО в родительской форме продолжает фурычить... Это открывает интересные возможности... Осталось придумать какие ;-)
58 Злопчинский
 
12.09.23
00:39
(51) кстати, так не выйдет, 1Ска упадет вот здесь при открытии формы списка (тестил на Спр.Номенклатура)
ПриИзмененииРазмераОкна() -> ВывестиТекКолонку() -> Форма.ТекущаяКолонка() -> 1C молча падает...
59 FN
 
12.09.23
10:46
(58) у меня не падала. Может от версии формеска зависит.
Событие ПриИзмененииРазмераОкна можно не использовать для этой задачи - вряд ли изменится текущая колонка при изменении размера.
60 Злопчинский
 
12.09.23
23:46
(59) а у тебя какая версия формекса? у меня - 175
61 Злопчинский
 
13.09.23
00:16
(59) плюс твой вариант для ТС не подойдет.
да, при изменении размеров окна можно, наверное, убрать (но тестил чисто твой вариант ;-)

1. но если убрать ПриИзмененииРазмеровОкна (на котором у меня падает, пока непонятно почему) - то при открытии формы заголовок формы не поменяется... ;-) Приходится использовать ПриАктивацииОкна()
2. без Форма.Обновить() - не обойтись, ибо заголовок формы менеятс, но функция на форме не отрабатывает-то.. ;-)
62 Злопчинский
 
13.09.23
00:16
Рабочий вариант:
.

Перем ФормаТекущаяКолонка;
Перем ФормаПредыдущаяКолонка;

//******************************************************************************************
//
Процедура ПолучитьИмяКолонки()
    ФормаТекущаяКолонка = СокрЛП(Форма.ПолучитьАтрибут(Форма.ТекущаяКолонка()).Заголовок());
    Если ФормаПредыдущаяКолонка <> ФормаТекущаяКолонка Тогда
        // ОТЛАДКА Сообщить(""+_GetPerformanceCounter()+": "+ФормаПредыдущаяКолонка +" -> "+ ФормаТекущаяКолонка);
        ФормаПредыдущаяКолонка = ФормаТекущаяКолонка;
        Форма.Обновить();
    КонецЕсли;
КонецПроцедуры // ПолучитьИмяКолонки()

//******************************************************************************************
// отладочная, для индикации текущей колонки В ЗАГОЛОВКЕ
Процедура ВывестиТекКолонку()
    //{--- ОТЛАДКА
    Если Форма.Заголовок()<>Форма.ТекущаяКолонка() Тогда
        Форма.Заголовок(Форма.ТекущаяКолонка());
    КонецЕсли;
    //}--- ОТЛАДКА
    ПолучитьИмяКолонки();
КонецПроцедуры // ВывестиТекКолонку()

//******************************************************************************************
//
Процедура ПослеСозданияФормы()
    ФормаПредыдущаяКолонка = ""; ФормаТекущаяКолонка = "";
КонецПроцедуры // ПослеСозданияФормы()  

//******************************************************************************************
//
Процедура ПриОтжатииКнопкиКлавиатуры(КодКлавиши,Альт,Шифт,Кнтрл,Символ,ФСО)
    ВывестиТекКолонку();
КонецПроцедуры

//******************************************************************************************
//
Процедура ПриОтжатииЛевойКнопки(СостояниеМыши,КоординатаПоГоризонтали,КоординатаПоВертикали,ФСО)
    ВывестиТекКолонку();
КонецПроцедуры

//******************************************************************************************
//
Процедура ПриОтжатииПравойКнопки(СостояниеМыши,КоординатаПоГоризонтали,КоординатаПоВертикали,ФСО)
    ВывестиТекКолонку();
КонецПроцедуры

//******************************************************************************************
//
Процедура ПриАктивацииОкна()
   ВывестиТекКолонку();
КонецПроцедуры
63 tgu82
 
13.09.23
10:19
И тогда обработка ожидания не нужна ???
64 FN
 
13.09.23
11:34
(60) у меня 2.0.5.131

(61)
вместо "кладем на форму текст с функцией, которая выводит идентификатор текущей колонки формы списка"
нужно атрибуту с текстом назначить идентификатор и в процедуре ВывестиТекКолонку просто меняем заголовок атрибута формы.
Например:

Процедура ВывестиТекКолонку()
    Если Форма.АтрибутТекст_ТекущаяКолонка.Заголовок()<>Форма.ТекущаяКолонка() Тогда
        Форма.АтрибутТекст_ТекущаяКолонка.Заголовок(Форма.ТекущаяКолонка());
    КонецЕсли;
КонецПроцедуры

При этом не нужно делать Обновить().

Вместо ПриИзмененииРазмеровОкна() можно использовать событие ПослеОткрытия()

(63) обработка ожидания в таком случае не нужна. Как и принудительное обновление формы.
65 Злопчинский
 
13.09.23
11:55
(64) насчет менять заголовок атрибута - это ты ловко придумал... Сейчас попробую!
66 Злопчинский
 
13.09.23
12:16
(64) Проверил, работает. Здорово.
.

//******************************************************************************************
//
Процедура ВывестиТекКолонку()
    
   ТекущаяКолонка = Форма.ТекущаяКолонка();
   Если Форма.тТекущаяКолонка.Заголовок()<>ТекущаяКолонка Тогда
        Форма.тТекущаяКолонка.Заголовок(ТекущаяКолонка);
   КонецЕсли;

   //{--- ОТЛАДКА
   //Если Форма.Заголовок()<>лТекущаяКолонка Тогда
   //    Форма.Заголовок(лТекущаяКолонка);
   //КонецЕсли;
   //}--- ОТЛАДКА

КонецПроцедуры // ВывестиТекКолонку()

//******************************************************************************************
//
Процедура ПриОтжатииКнопкиКлавиатуры(КодКлавиши,Альт,Шифт,Кнтрл,Символ,ФСО)
    ВывестиТекКолонку();
КонецПроцедуры

//******************************************************************************************
//
Процедура ПриОтжатииЛевойКнопки(СостояниеМыши,КоординатаПоГоризонтали,КоординатаПоВертикали,ФСО)
    ВывестиТекКолонку();
КонецПроцедуры

//******************************************************************************************
//
Процедура ПриОтжатииПравойКнопки(СостояниеМыши,КоординатаПоГоризонтали,КоординатаПоВертикали,ФСО)
    ВывестиТекКолонку();
КонецПроцедуры

//******************************************************************************************
//
Процедура ПослеОткрытия() // или ПриАктивацииОкна() или ПослеСозданияФормы()
   ВывестиТекКолонку();
КонецПроцедуры
67 Злопчинский
 
13.09.23
12:17
(64)я там скинул на почту 175 формекс - будет возможность - проверь первоначальный вариант с ПриИзмененииРазмераОкна() с этим формексом.
68 Злопчинский
 
13.09.23
12:18
(66) ... и там какая-то тонкость есть у модальной формы с использованием ПослеОткрытия... вроде..
в старых каких-то версиях формекса для модальной формы она не отрабатывала, приходилось юзать ПослеСоздания()
Сейчас есть ПослеСозданияФормы()
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан