|
v7: Активизировать поле формы или АктивизироватьОбъект() | ☑ | ||
---|---|---|---|---|
0
Mikhail Volkov
03.11.15
✎
14:02
|
В продолжение темы Перехватить "ввод ручками" (почему-то закрыта для меня!?)
Понадобилось, чтобы фокус формы автоматически возвращался в мое поле для "ШтрихКодПоиска". Посоветовали вставить Активизировать("ШтрихКодПоиска",0); в любую функцию формы. Вставил: Функция ИнфСтрока(СуммаВсего) // Активизировать("ШтрихКодПоиска",0); //+МВ 30.10.2015 для автофокусирования на поле поиска штрих-кода Возврат СуммаВсего; КонецФункции Появилась ошибка: {Справочник.Товары.ФормаСписка.ДляЧеков.Модуль(10)}: В данной формуле не может быть вызвана эта процедура(функция) Пришлось за комментировать. Далее, для своего поля "ШтрихКодПоиска" прописал функцию, взятую из Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные) Если ( Источник = "BarCodeScaner" ) и ( Событие = "BarCodeValue" ) Тогда Если Сканер.OldVersion=0 Тогда Данные=Сканер.ScanData; КонецЕсли; //Отсекаем штрих-код до необходимого количества знаков ШК=Лев(Данные,ДлинаШтрихКода); ШК=СокрП(СокрЛ(ШК)); //Если необходимо, то дополним нулями до нужного количества знаков Если Константа.НеДополнятьШтрихКодНулями<>Перечисление.Булево.Да Тогда КонЦ=(ДлинаШтрихКода-СтрДлина(ШК)); Для i=1 по КонЦ Цикл ШК="0"+ШК; КонецЦикла; КонецЕсли; СпрШК=СоздатьОбъект("Справочник.ШтрихКоды"); //Надо создать таблицу значений и посмотреть, нет ли в ней выбранного товара Табл=СоздатьОбъект("ТаблицаЗначений"); Табл.НоваяКолонка("ВладелецШК","Справочник",,,"Товар/Единица товара",90); Если СпрШК.ВыбратьЭлементыПоРеквизиту("ШтрихКод",ШК)=1 Тогда Пока СпрШК.ПолучитьЭлемент()=1 Цикл Табл.НоваяСтрока(); Табл.ВладелецШК=СпрШК.ВладелецШК; КонецЦикла; Иначе Предупреждение("Товар, имеющий штрих-код "+СокрЛ(ШК)+" не обнаружен."); КонецЕсли; Если Табл.КоличествоСтрок()=1 Тогда Если Табл.ВладелецШК.Вид()="Товары" Тогда АктивизироватьОбъект(Табл.ВладелецШК); Иначе АктивизироватьОбъект(Табл.ВладелецШК.Владелец); КонецЕсли; ИначеЕсли Табл.КоличествоСтрок()>1 Тогда ВремСтрока=ПолучитьПустоеЗначение("Число"); Если Табл.ВыбратьСтроку(ВремСтрока,"Выберите товар")=1 Тогда Если Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК").Вид()="Товары" Тогда АктивизироватьОбъект(Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК")); Иначе АктивизироватьОбъект(Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК").Владелец); КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; Сканер.DeleteEvent(); КонецПроцедуры Своего ничего не придумывал. Дает аналогичную ошибку: АктивизироватьОбъект(Табл.ВладелецШК); {Справочник.Товары.ФормаСписка.ДляЧеков.Модуль(132)}: В данной формуле не может быть вызвана эта процедура(функция) Почему? |
|||
1
Ёпрст
03.11.15
✎
14:09
|
потому, что [:]|||||||||||||||:]
используй ложное закрытие формы или открытие пустышки-модальной формы с статусотказа=о в при открытии для не потери фокуса ввода |
|||
2
Ёпрст
03.11.15
✎
14:10
|
||||
3
Mikhail Volkov
03.11.15
✎
14:16
|
Нашел в В данной формуле не может быть вызвана эта процедура(функция) "с точки зрения 1С нельзя перепрыгнуть на другой реквизит программно влоб если ещё активен текущий", и как быть?
|
|||
4
Ёпрст
03.11.15
✎
14:18
|
(3) читать вниматочно, что вам пишут в ответ.
|
|||
5
Mikhail Volkov
03.11.15
✎
14:37
|
Это в (1)? Пример бы...
|
|||
6
HawkEye
03.11.15
✎
14:41
|
(5) в том месте где надо активировать
запомнить идентификтор поля и вызвать закрытие формы.. в ПриЗакрытии посмотреть можно закрывать или нет, если нет то активизировать нужное поле и отменить закрытие.. |
|||
7
Mikhail Volkov
07.11.15
✎
13:04
|
А имитировать нажатие клавиши Tab как?
|
|||
8
Chameleon1980
07.11.15
✎
14:09
|
(5) слушайте внимательно про ложное закрытие. Самому именно так мне тут недавно помогли. Еще раз спасибо добрым людям.
|
|||
9
Mikhail Volkov
07.11.15
✎
15:27
|
(8) "Ложное закрытие" работает, но как-то громоздко...
Когда курсор находится в табличных частях: списка товара, или отобранного товара активизация моего поля поиска по штрих-коду ошибки не вызывает. Но оказалось, что иногда этот режим надо отключать, например, пришел "оптовик" с большим списком. Тогда продавцы подбирают товар по наименованию. Если курсор автоматом уходит на мое поле, то "стрелочки" не работают. Попросили сделать галочку "Работа со сканером", сделал. Но когда они ее включают появляется ошибка "В данной формуле не может быть вызвана эта процедура(функция)". "Ложное закрытие" работает, но достаточно нажать Tab, чтобы курсор перешел в мое поле поиска. Можно имитировать нажатие клавиши Tab, как? |
|||
10
Chameleon1980
07.11.15
✎
15:37
|
мож формекс
|
|||
11
Mikhail Volkov
08.11.15
✎
04:50
|
(10) Без него при установки моей галки "Работа со сканером" автоматический переход на следующее поле (имитировать нажатие клавиши Tab) никак?
|
|||
12
Chameleon1980
08.11.15
✎
08:28
|
(11) как... гугл рулит
|
|||
13
Chameleon1980
08.11.15
✎
08:30
|
||||
14
Mikhail Volkov
09.11.15
✎
04:32
|
(13) Спс. Тоже не пара строк получается, лучше оставлю "Ложное закрытие".
|
|||
15
Mikhail Volkov
12.11.15
✎
11:35
|
Еще непонятный момент всплыл, в коде (0) когда по штрих-коду найден только один товар, мы его АктивизироватьОбъект(), и курсор встает на него. А когда найдено несколько, то пользователю предлагается выбрать нужный:
Табл.ВыбратьСтроку(ВремСтрока,"Выберите товар") в этом случае АктивизироватьОбъект(Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК")); уже не срабатывает, курсор остается там где был!? |
|||
16
Mikhail Volkov
12.11.15
✎
12:40
|
+ точнее в начало списка курсор стает.
|
|||
17
Злопчинский
12.11.15
✎
12:43
|
Проверить что возвращает
ЧтоТо = Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК"); Сообщить(""+ЧтоТо+ " "+ТипЗначенияСтр(ЧтоТо)); |
|||
18
Mikhail Volkov
12.11.15
✎
14:22
|
(17) Думал над этим, даже так написал:
Если Табл.КоличествоСтрок()=1 Тогда Если Табл.ВладелецШК.Вид()="Товары" Тогда АктивизироватьОбъект(Табл.ВладелецШК); Иначе АктивизироватьОбъект(Табл.ВладелецШК.Владелец); КонецЕсли; ИначеЕсли Табл.КоличествоСтрок()>1 Тогда ВремСтрока=ПолучитьПустоеЗначение("Число"); Если Табл.ВыбратьСтроку(ВремСтрока,"Выберите товар")=1 Тогда ВыбранныйТовар = ?(Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК").Вид()="Товары", Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК"), Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК").Владелец); СпрТов=СоздатьОбъект("Справочник.Товары"); Если СпрТов.НайтиЭлемент(ВыбранныйТовар)=1 Тогда Сообщить("Выбранный товар: "+СпрТов.ТекущийЭлемент()); АктивизироватьОбъект(СпрТов.ТекущийЭлемент()); Иначе Сообщить("Не найден: "+ВыбранныйТовар); КонецЕсли; // Если Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК").Вид()="Товары" Тогда // АктивизироватьОбъект(Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК")); // Иначе // АктивизироватьОбъект(Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК").Владелец); // КонецЕсли; КонецЕсли; КонецЕсли; //-МВ В сообщении правильно пишет, но курсор не переходит на выбранный товар. |
|||
19
Mikhail Volkov
12.11.15
✎
14:35
|
+ А что должно быть? На Сообщить("Выбранный товар: "+СпрТов.ТекущийЭлемент()+" / "+ТипЗначенияСтр(ВыбранныйТовар)+" / "+ТипЗначенияСтр(СпрТов.ТекущийЭлемент())); пишет: Выбранный товар: 1000 секретов. Спецвыпуск 20С/15 Экономим правильно / Справочник / Справочник
|
|||
20
Mikhail Volkov
12.11.15
✎
15:10
|
Понял, в форме фильтр стоит по остаткам. Если его снять, то курсор встает на выбранный товар.
|
|||
21
Злопчинский
12.11.15
✎
17:02
|
(20) Это ты быстро справился...
я сегодня суммарно часов 8 тупил - в глубинах стеков вызовов транзакцию не зафиксировал... |
|||
22
Злопчинский
12.11.15
✎
17:03
|
(20) кстати в форме можно получить условие отбора и при необходимости его отключать
|
|||
23
Mikhail Volkov
13.11.15
✎
08:24
|
(21) Выбранный товар есть на остатке, в форме подбора доступен. Но не активизируется, когда стоит фильтр по остаткам, и выбирается из таблицы значений (когда найдено несколько товаров с одним штрих-кодом). Когда фильтр снят, или найден один товар (не предлагается выбирать из таблицы), то нормально активизируется!
Может и активизируется, но после выбора из таблицы форма обновляется, и курсор уходит в начало списка? Этот момент понять не могу. |
|||
24
Злопчинский
13.11.15
✎
09:41
|
нет, если стоит фильтр (то есть отбор на форме списка) - то просто активизировать - не находит и прыгает в начало.
ты фигню какую-то лепишь. вникни что выше написано. формы для акттивной работы со скангером или попеременной работы сканер-ручки - надо вдумчиво дизайнерить. Штатные флормы вообще бяка. сядь нарисуй на листике что НАДО (не как должно быть а ЧТО НАДО - а как уже сделать - потом определять. Не надо делать мегаэкран с мегакнопочками в диком количестве и многими таблицами. сделай нескольо экранов с быстрым удобным ручным или автопереключением (по контексту). В твоем примере - вот нахера позиционироваться в списке на элемент (который еще и невидим?) - ты сам уже потерялся, а как будут тупить персональи? - отсканировал шк, что надо сделать с этим товаром известно? - в подавляющем колве случаев - ДА - или выбрать его или отказаться (иногда посмотреть на кучку похожих) - вот отсканировал - товар нашли - открой офрму с данными для просмотра - по энтеру - выбор, по ескапу отказ, при нажатии цифровых клавиш - считаем что вводится количество - его показываем на форме. все. будь проще |
|||
25
Mikhail Volkov
13.11.15
✎
13:56
|
(24) > просто активизировать - не находит и прыгает в начало.
Просто интересно стало, почему когда 1 товар найден активируется, а когда несколько (надо выбрать из предложенного) - нет. > что надо сделать с этим товаром известно? - в подавляющем колве случаев - ДА Дальше все путем идет, найденный/выбранный товар переносится в таблицу отобранных товаров независимо "активировался" он или нет. А далее при закрытии формы подбора переносится в чек. |
|||
26
Злопчинский
13.11.15
✎
20:39
|
(25) " а когда несколько (надо выбрать из предложенного) - нет. " - как напрограммленно так и работаент видимо
|
|||
27
Mikhail Volkov
14.11.15
✎
03:03
|
Если Табл.КоличествоСтрок()=1 Тогда
// Товар активируется Если Табл.ВладелецШК.Вид()="Товары" Тогда АктивизироватьОбъект(Табл.ВладелецШК); Иначе АктивизироватьОбъект(Табл.ВладелецШК.Владелец); КонецЕсли; ИначеЕсли Табл.КоличествоСтрок()>1 Тогда // Здесь нет!? ВремСтрока=ПолучитьПустоеЗначение("Число"); Если Табл.ВыбратьСтроку(ВремСтрока,"Выберите товар")=1 Тогда Если Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК").Вид()="Товары" Тогда АктивизироватьОбъект(Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК")); Иначе АктивизироватьОбъект(Табл.ПолучитьЗначение(ВремСтрока,"ВладелецШК").Владелец); КонецЕсли; КонецЕсли; КонецЕсли; |
|||
28
Mikhail Volkov
15.11.15
✎
05:55
|
Этот фрагмент взят без изменений из Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные) формы списка товаров. Перенес в форму подбора для чека, в которой есть отбор по остаткам. Если фильтр отключен, то АктивизироватьОбъект() в ней тоже работает при выборе товара из таблицы. Сперва (20) я подумал товара нет в наличии, поэтому не находит и прыгает в начало. Но это не так, товар есть и доступен в форме.
Особенность 7-ки? Как будь то вновь на велосипед сел после мерса. |
|||
29
Мимохожий Однако
15.11.15
✎
08:05
|
В 7-ке не так как в 8-ке. Смирись с этим. В СП про метод АктивизироватьОбъект() написано, когда срабатывает.
Тебе в (24) идея вполне реально описана. |
|||
30
Mikhail Volkov
15.11.15
✎
09:11
|
(29) Да проблемы то нет (25), чисто "спортивный" интерес. Давно с 7-кой не работал.
|
|||
31
Злопчинский
15.11.15
✎
15:03
|
(28) "...Этот фрагмент взят без изменений из Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные) формы списка товаров..."
- сомневаюсь я сильно насчет этого. стиль написания и именования весьма нехарактерен для типовой ТиС |
|||
32
Mikhail Volkov
15.11.15
✎
18:27
|
(31) Штрих-М: Торговое предприятие PROF v.4.10
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |