Имя: Пароль:
1C
 
Отловить событие нажатия клавиши
0 Злобный Йожег
 
17.08.10
08:26
Суть задачи в следующем. В ТЗ на форме содержится список документов. При переводе курсора на другую строку атрибуты формы перезаполняются соответствующими значениями реквизитов документа в тек. строке ТЗ. Для этого применяется 1СРР+Сервис, предопределенные процедуры ПриОтжатииЛевойКнопки, ПриНажатииКнопкиКлавиатуры. В первом случае все отрабатывается на 5, во втором есть небольшая проблема. Изначально система не успевала за сменой курсора, и потому при переходе на другую строку выдавались данные документа из предыдущей, на которой был установлен курсор. Эта проблема частично решилась, когда я стал отлавливать нажатие клавиш ВВерх-Вниз по коду, и т.о. получал ту строку, на которой нужно спозиционироваться в ТЗ. Вот код процедуры:

Процедура ПриНажатииКнопкиКлавиатуры(Код, Альт, Шифт, Контрол, Символ, ФСО)
   Если (Форма.АктивныйЭлемент() = "ТЗПартий") И (Найти("37_38_39_40", Строка(Код)) <> 0) Тогда
       ТекСтрокаТаблицы = ТЗПартий.ТекущаяСтрока();
       Если ТекСтрокаТаблицы = 1 Тогда
           Шаг = ?(Код = 38, 0, ?(Код = 40, 1, 0));
       ИначеЕсли ТекСтрокаТаблицы = ТЗпартий.КоличествоСтрок() Тогда
           Шаг = ?(Код = 38, -1, 0);
       Иначе
           Шаг = ?(Код = 38, -1, ?(Код = 40, 1, 0));
       КонецЕсли;
       
       ТекСтрокаТаблицы = ТекСтрокаТаблицы+Шаг;
       ПереустановитьАтрибутыФормы(ТекСтрокаТаблицы);
   КонецЕсли;    
КонецПроцедуры

НО! Остается еще 1 проблема:

Т.к. юзер может перемещаться по ТЗ при помощи PageUp и PageDown, как в этом случае определить, на сколько шагов вверх/вниз он перешел?
1 Fragster
 
гуру
17.08.10
08:35
здесь не нужет 1с++ с наворотами, достаточно на форму кинуть надпись с формулой
2 Злобный Йожег
 
17.08.10
08:40
(1) Была. Мы от нее специально уходим, ибо формула выполняется перманентно, пока открыта форма, и съедает больше памяти. Так что не вариант.
3 1Сергей
 
17.08.10
08:41
не понимаю, почему не используешь ТЗ.ТекущаяСтрока()?
4 skunk
 
17.08.10
08:41
5 Злобный Йожег
 
17.08.10
08:45
(3) Говорю же, когда переходишь в процедуре на другую строку и выполняешь в ней перерисовку реквизитов формы, 1с еще не успевает отловить номер новой строки.
6 Злобный Йожег
 
17.08.10
09:13
(4) Это опять-таки перманентное выполнение функции, которое будет всё так же вызывать доп. нагрузку на процессор.
7 Fragster
 
гуру
17.08.10
09:25
(2) если нормально написать - нагрузка будет минимальная
8 Злобный Йожег
 
17.08.10
09:26
(7) "А по-простому - это, простите, как?" (с) Собачье сердце
9 smaharbA
 
17.08.10
09:28
(0) запомнить прежнюю колонку и сравнить с текущей в тексте на форме
10 smaharbA
 
17.08.10
09:28
строку разумеется
11 smaharbA
 
17.08.10
09:30
на коньяк мпорил на адинесине об отлове строк и колонок по одному клику и тем более по кнопкам
12 Злобный Йожег
 
17.08.10
09:30
(9) блин... ну говорю же, в момент исполнения процедуры ПриНажатииКнопкиКлавиатуры() "прежняя" строка будет еще текущей.
13 smaharbA
 
17.08.10
09:37
(12)

Перем СтрокаПрежняя;

...
Если СтрокаПрежняя<>ТЗ.ТекущаяСтрока() Тогда
   Сообщить("Шагнули с " + СтрокаПрежняя + " на " + ТЗ.ТекущаяСтрока();
   СтрокаПрежняя = ТЗ.ТекущаяСтрока();
КонецЕсли;
14 Злобный Йожег
 
17.08.10
09:37
6ля... по ходу тут вообще никто не понимает, о чем речь
15 smaharbA
 
17.08.10
09:40
(14) все понимают
(13) в процедуре что на тексте на форме
16 Кириллка
 
17.08.10
09:48
(14)при отжатии кнопки?
17 Злобный Йожег
 
17.08.10
09:49
(15) Т.е. предлагаешь вернуться к функции в формуле лейбла на форме? Так-то оно работает, и тормозит вроде меньше, но... Хотелось бы еще узнать про вариант решения вопроса в (0).
(16) ПриОтжатииКнопкиКлавиатуры()? такой процедуры вроде нет...
18 zuza
 
17.08.10
09:53
(17) Процедура ПриОтжатииКнопкиКлавиатуры() КонецПроцедуры
Параметры:
<КодКлавиши> - код нажатой кнопки клавиатуры.
<Alt> - флаг нажатия кнопки
<Shift> - флаг нажатия кнопки
<Ctrl> - флаг нажатия кнопки
<Символ> - символ нажатой кнопки в формате ASCII.
<ФСО> - флаг стандартной обработки. Изначально равен 1. Если в теле процедуры сбросить
значение в 0, то стандартная обработка события не вызывается.
19 Злобный Йожег
 
17.08.10
09:57
(18) хм... А почему в СП о ней ни слова? Кстати, с какой версии 1С++ она появилась?
20 smaharbA
 
17.08.10
10:00
нафига тебе отлавливать нажатие - делается штатно
21 smaharbA
 
17.08.10
10:02
весь код сабжа

на форме ТЗ, текст с формулой КолонкаТЗ() и реквизиты формы НомерДок и ДатаДок


Перем КолонкаПреж,СтрокаПреж;
Функция КолонкаТЗ()
   Если (ТЗ.ТекущаяКолонка()<>КолонкаПреж) Тогда
       Сообщить(ТЗ.ТекущаяКолонка());
       КолонкаПреж=ТЗ.ТекущаяКолонка();
   КонецЕсли;
   Если (ТЗ.НомерСтроки<>СтрокаПреж) Тогда
       Сообщить(ТЗ.НомерСтроки);
       СтрокаПреж=ТЗ.НомерСтроки;
       Попытка
           ДатаДок=ТЗ.Док.ДатаДок;;
           НомерДок=ТЗ.Док.НомерДок;
       Исключение
       КонецПопытки;
   КонецЕсли;
   Форма.Обновить();
КонецФункции    // КолонкаТЗ
//*******************************************
Процедура Сформировать()
   ТЗ.НоваяКолонка("Док");
   Стр="";
   Для к=1 По Метаданные.Документ() Цикл
       Стр=Стр+"Документ."+Метаданные.Документ(к).Идентификатор+".ТекущийДокумент"+?(к=Метаданные.Документ(),"",",
       |");
   КонецЦикла;
   Стр="Документ.СчетФактура.ТекущийДокумент";
   Запрос = СоздатьОбъект("Запрос");
   ТекстЗапроса =
   "//{{ЗАПРОС(Сформировать)
   |Период с ДатаНач по ДатаКон;
   |ОбрабатыватьДокументы все;
   |Док = "+Стр+";
   |Группировка Док;
   |Без Итогов;
   |";
   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
       Возврат;
   КонецЕсли;
   Запрос.Выгрузить(ТЗ);
КонецПроцедуры
ДатаНач=НачГода(ТекущаяДата());
ДатаКон=КонМесяца(ТекущаяДата());



и ФСЁ !
22 smaharbA
 
17.08.10
10:03
и заполняет реквизиты формы и отслеживает одиночный клик и строку и колонку
23 Злобный Йожег
 
17.08.10
10:05
(22) А колесиком мыши если прокручивать? :)
24 Ёпрст
 
гуру
17.08.10
10:05
(19) это метод формекса, а не 1c++
25 smaharbA
 
17.08.10
10:06
Да хоть веретином !
26 Злобный Йожег
 
17.08.10
10:06
(24) Ну, какбэ формекс - это один из модулей 1С++?
27 Ёпрст
 
гуру
17.08.10
10:07
(26) нет, это отдельная ВК.
и только далеко в прошлом, было объединение 1с++ и формекса в 1 ВК.. с тех пор ужо хрен знает сколько лет прошло.
28 smaharbA
 
17.08.10
10:11
29 smaharbA
 
17.08.10
10:16
а вообще тебе даже не надо (21)
текст на форме и заполняй в его функции реквизиты формы и опять же ФСЁ !
нафиг для (0) не надо клики и нажатия ловить
30 Злобный Йожег
 
17.08.10
10:18
(29) Оно так и было!!
Единственное, что сделал после подсказок в этой ветке - добавил в функцию условие проверки по текущей строке.
31 Злобный Йожег
 
17.08.10
10:42
Кстати, а сцылочкой на свежий релиз FormEx нихто не поделиццо?
32 Ёпрст
 
гуру
17.08.10
10:46
(31) www.dorex.ru