Имя: Пароль:
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) ... и там какая-то тонкость есть у модальной формы с использованием ПослеОткрытия... вроде..
в старых каких-то версиях формекса для модальной формы она не отрабатывала, приходилось юзать ПослеСоздания()
Сейчас есть ПослеСозданияФормы()
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn