gifts2017

Мини-класс для непосредственного ввода в элементах диалога V7.7

Опубликовал Епрст (Ёпрст) в раздел Программирование - Работа с интерфейсом

Класс основан на баге платформы 7.7, является продолжением публикации
http://infostart.ru/public/140861/
позволяет искать по наименованию в реквизитах типа справочник "а-ля снеговик".

Класс основан на базе Перехватчика.

После его подключения во всех диалоговых окнах появится непосредственный ввод значения и поиск его по "like" среди наименований этого справочника. Строка для поиска может состоять из нескольких слов разделенных пробелом. Если найдено несколько элементов - выведется список значений для выбора.

Работает только для справочников определенного вида. Учитывается связь по владельцу, если в реквизите диалога указано "Связан с"

Фича основана на применении метода Форма.ТолькоПросмотр(0), публикация является продолжением публикации

http://infostart.ru/public/140861/

Работает для дбф и sql варианта.

Для подключения необходимы вк formex.dll , 1cpp.dll, dynawrap.dll , для дбф варианта еще и 1sqlite.dll

 

подключение класса:

скачать архив, распаковать в каталог с ИБ

(если есть свои классы - то в нужное вам место + прописать путь до класса)

 

в глобальном модуле прописать:

Процедура ПриНачалеРаботыСистемы()

    ЗагрузитьВнешнююКомпоненту("1cpp.dll"); 

    Настройки=СоздатьОбъект("УправлениеНастройками");

    Настройки.Сбросить("Проверка типов");

    Настройки.Сбросить("Отладка");  

     //Настройки.Сбросить("Оптимизация");  

     Настройки.Включить("Оптимизация");  

     Настройки.Включить("TurboBL");  

     Настройки.Включить("ПерехватитьСобытияГК");    

     Перехватчик = СоздатьОбъект("Перехватчик");   

     ПерехватчикСобытийГМ = СоздатьОбъект("АляВосьмерка"); 

     Перехватчик.ПерехватитьСобытияГлобальногоМодуля(ПерехватчикСобытийГМ);    

     ЗагрузитьВнешнююКомпоненту("formex.dll");   

     ЗагрузитьВнешнююКомпоненту("1sqlite.dll"); //это в случае дбф варианта.

 

наслаждаться...

 

update 27.06.2012 утро

-поиск осуществляется из независимых слов в строке поиска (разделитель - пробел)

-исправлена ошибка при открытии формы из формы

update 27.06.2012 обед

-мелкие исправления в ходе обсуждения


Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
АляВосьмерка.rar
.rar 8,21Kb
27.06.12
78
.rar 8,21Kb 78 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

0. Епрст (Ёпрст) 26.06.12 17:48
Класс основан на баге платформы 7.7, является продолжением публикации
http://infostart.ru/public/140861/
позволяет искать по наименованию в реквизитах типа справочник "а-ля снеговик".



Перейти к публикации

1. Александр Орефков (orefkov) 27.06.12 09:27
Эх, лет пять бы назад все это...
2. Епрст (Ёпрст) 27.06.12 09:53
(1) ну дык, скоро аналогично про снеговика будут говорить..
Про 8.0 и 8.1 уже никто и не вспоминает :)
3. Александр Алюев (alyuev) 27.06.12 10:58
4. Антон (anton.fly7) 27.06.12 11:04
6. Максим Шуйский (maxpiter) 27.06.12 12:06
(0) научите пожалуйста, как выполнять 2 перехватчика.
вот так вот нельзя
ПерехватчикСобытийГМ = СоздатьОбъект("КлассПерехватСобытий");
ПерехватчикАляВосьмерка = СоздатьОбъект("АляВосьмерка");
Перехватчик.ПерехватитьСобытияГлобальногоМодуля(ПерехватчикСобытийГМ);
Перехватчик.ПерехватитьСобытияГлобальногоМодуля(ПерехватчикАляВосьмерка);
а как тогда??? простите за ламерский вопрос :)
7. Александр Гнитка (smitti911) 27.06.12 12:16
(6) У меня такой же вопрос? Как юзать одновременно 2 перехватчика на ГМ
8. Епрст (Ёпрст) 27.06.12 13:05
(6) не эксперементировал, но судя по доке, нужно прописывать
ВыполнитьСобытиеГК или ВыполнитьСобытиеГлобальногоМодуля

http://www.1cpp.ru/docum/icpp/html/Hooker.html#id3
9. Епрст (Ёпрст) 27.06.12 13:05
Или, у Артура попросить мини примерчик.
10. Максим Шуйский (maxpiter) 27.06.12 13:13
(8)читаю как раз эту ссылку, но с примером было бы нагляднее.
Спасибо.
11. Максим Шуйский (maxpiter) 27.06.12 13:18
(0) Если подключаю без своего перехватчика, все работает, здорово :)
Можно добавить следующую хотелку?
Открывать список когда набрано 3 символа и возможно ли когда список уже открыт, продолжить набор в поле, уменьшая список соответственно введенному.
12. Епрст (Ёпрст) 27.06.12 13:20
(11) на данный момент просто "работает" формула в реквизите диалога при нажатии ентер.
По-идее, можно либо "пасти нажатие" кнопок, либо тупо обработку ожидания втыкать, которая будет "пасти" реквизит, получать значение с него и делать запрос. Кодить надо :)
13. Епрст (Ёпрст) 27.06.12 13:22
По-поводу нескольких перехватчиков, нужно организовывать подписки на события, по-идее.. один класс-перехватчик глобального модуля будет потом рассылать события в остальные КОП.. как-то так.
14. Иван Демидов (ivanov_alex) 27.06.12 13:25
в аля восьмерка-не обнаружена функция вирт() в этом:
Перехватчик.ПерехватитьСобытияГК(КонтФормы,вирт<<?>>());
15. Епрст (Ёпрст) 27.06.12 13:49
(14) дык, это просто синтаксис контроль у тебя не проходит, а так - усё работает.
16. Епрст (Ёпрст) 27.06.12 13:51
Заместо Вирт() можно использовать устаревший метод ПолучитьКонтекстОкружения() ..
ivanov_alex; +1 Ответить
17. Иван Демидов (ivanov_alex) 27.06.12 13:54
видимо у меня 27 совсем старая..
такой метод(ПолучитьКонтекстОкружения()) тоже отсутствует
конфа ТиС 9.2...
обидно, да ))
18. Епрст (Ёпрст) 27.06.12 13:56
(17) дело не в "27", дело в 1cpp.dll

она у тебя какой версии хоть ? Поди 2**** ?
19. Иван Демидов (ivanov_alex) 27.06.12 13:57
(18) Ёпрст,
2.5.07
я чтото упустил?
20. Епрст (Ёпрст) 27.06.12 14:00
(19) как бы да.. года 3-4 развития компоненты
:))

1срр сейчас ужо 3.2.3.20

http://www.1cpp.ru/forum/YaBB.pl?num=1288774760

и есть еще с xmllite 3.2.4.0 rc2

http://www.1cpp.ru/forum/YaBB.pl?num=1332077808
ivanov_alex; +1 Ответить 1
21. Иван Демидов (ivanov_alex) 27.06.12 14:05
(20) Ёпрст, поля открылись, поиск придется допиливать, не ищет
попробовывать приначалевводастроки() наверное надо
22. Епрст (Ёпрст) 27.06.12 14:06
(21) эээ.. в каком реквизите не ищет ?
23. Епрст (Ёпрст) 27.06.12 14:06
24. Епрст (Ёпрст) 27.06.12 14:07
Если что, ищет только в реквизитах с типом <Справочник.ОпределенныйВид> .. во всех остальных - нет, + нет поиска в табличной части документа
25. Иван Демидов (ivanov_alex) 27.06.12 14:09
no such table: Справочник.Контрагенты
при вводе в документе реализация поле контрагент, там определено как Справочник.Контрагенты
26. Александр Алюев (alyuev) 27.06.12 14:10
Я сделал такую замену в добавляемом модуле:

	|   Если Список.РазмерСписка()=1 Тогда
	|       Элем = Список.ПолучитьЗначение(1);
	|   ИначеЕсли Список.РазмерСписка()>1 Тогда
	|	    Если Список.ВыбратьЗначение(Элем,,,,2)=1 Тогда АтрФормы.Значение = Элем; КонецЕсли;
	|   КонецЕсли;
//    |   АтрФормы.Значение = Элем;
...Показать Скрыть


Чтобы если ничего не выбрали из списка, не обнулять значение реквизита
27. Епрст (Ёпрст) 27.06.12 14:13
(25) формат базы какой у тебя ? dbf ? sql ?
28. Епрст (Ёпрст) 27.06.12 14:13
(26) не.. не совсем катит - останется текст на форме, по-идее (не смотрел еще)
29. Иван Демидов (ivanov_alex) 27.06.12 14:14
(27) Ёпрст, DBF
sqlite.dll в корне базы
30. Епрст (Ёпрст) 27.06.12 14:16
Хотя нет, вертает взад..
да, так красившее
31. Епрст (Ёпрст) 27.06.12 14:16
32. Иван Демидов (ivanov_alex) 27.06.12 14:18
33. Епрст (Ёпрст) 27.06.12 14:19
(26) только у тебя ошибка:

| Если Список.РазмерСписка()=1 Тогда
| // Элем = Список.ПолучитьЗначение(1); //вот в этом случае, нужно исправить на
| АтрФормы.Значение= Список.ПолучитьЗначение(1);
| ИначеЕсли Список.РазмерСписка()>1 Тогда
| Если Список.ВыбратьЗначение(Элем,,,,2)=1 Тогда АтрФормы.Значение = Элем; КонецЕсли;
| КонецЕсли;
// | АтрФормы.Значение = Элем;
34. Епрст (Ёпрст) 27.06.12 14:20
35. Александр Алюев (alyuev) 27.06.12 14:22
36. Иван Демидов (ivanov_alex) 27.06.12 14:26
(34) Ёпрст,
дада
щас отрабатывает по энтер
37. Александр Алюев (alyuev) 27.06.12 14:38
И еще.

В обработчике Событие_ПриНачалеВыбораЗначения()

нужно устанавливать флПриНачалеВыбораЗначения = ФСО

т.е.

ФормаРасш.ПолучитьАтрибут("флПриНачалеВыбораЗначения").Значение=ФСО;


Т.к. действие выбора можно отменить в Перехватчике и формула не выполнится, а значит и флПриНачалеВыбораЗначения не обнулится. А по ФСО будет всё ок.
38. Епрст (Ёпрст) 27.06.12 14:50
39. Епрст (Ёпрст) 27.06.12 14:56
Вот думаю, как избавится от флага-атрибута, слепленного через ДобавитьАтрибут, ибо с помощью ВыполняемогоМодуля сходу не получилось - не видит контекст переменную модуля в доп. глобальнике.
Надо попробовать определять ДопФормулу для каждого контекста в отдельности через ВыполняемыйМодуль
40. Епрст (Ёпрст) 27.06.12 14:56
41. Александр Алюев (alyuev) 27.06.12 15:19
Тут ещё одна фигня вылазит.
Если на форме есть атрибуты, у которых ранее был установлен признак Редактирование(0), то при отработке Форма.ТолькоПросмотр(0) они ессно становятся доступными. В частности, я сделал замену Перечислений на форме на атрибут с педалькой, у которого как раз устанавливалось свойство Редактирование(0). Ну и всё у меня полетело... Приходится в Перехватчике заново лопатить все реквизиты и кому нужно - переустанавливать доступность. Точнее - недоступность.
42. Епрст (Ёпрст) 27.06.12 15:21
тогда уж не Доступность..а Редактирование - чтоб просто педалька работала..
43. Александр Алюев (alyuev) 27.06.12 15:24
(42) Ну, я ж про это и говорю... :-)
44. Максим Шуйский (maxpiter) 27.06.12 16:27
(0) Позвольте, предложу функцию по составлению списка.
Ее отличие, в том, что элементы в списке выводятся в порядке вхождения набраннной строки

Функция ПолучитьСписокЭлементов(Вид, СтрокаСимволов)
	СтрДляПозиции = СтрокаСимволов;
	Пробел = Найти(СтрДляПозиции," ");
	Если Пробел>0 Тогда
		СтрДляПозиции = Лев(СтрДляПозиции,Пробел-1);
	КонецЕсли;
	ТекстЗапроса = "
	|SELECT ID [Ссылка $Справочник."+Вид+"]
	|	, case when CHARINDEX ('"+СтрДляПозиции+"', DESCR)=0 then 999 else CHARINDEX ('"+СтрДляПозиции+"', DESCR) end ПозицияВСтроке
	|FROM $Справочник."+Вид+" With (NOLOCK)
	|WHERE (ISFOLDER = 2)
	|";
	Если ПустаяСтрока(СтрокаСимволов)=0 Тогда
		СтрДляЗапроса = "
		|AND (DESCR LIKE '%"+СтрЗаменить(СтрокаСимволов," ","%') AND (DESCR LIKE '%");
		СтрДляЗапроса = СтрДляЗапроса + "%')
		|";
		ТекстЗапроса=ТекстЗапроса+СтрДляЗапроса;
	КонецЕсли;
	ТекстЗапроса = ТекстЗапроса + "
	|ORDER BY ПозицияВСтроке, DESCR
	|";
	глРС.ВыполнитьИнструкцию(ТекстЗапроса, СпЗн);
	Возврат СпЗн;
КонецФункции
...Показать Скрыть
45. Епрст (Ёпрст) 27.06.12 17:36
(44) не совсем подходит. У меня поиск может быть по нескольким словам разделенных пробелом.
46. Максим Шуйский (maxpiter) 27.06.12 17:47
(45) у меня эта штука стоит на справочниках и когда юзверь вводит текст, динамически изменяется список.
Функция ищет по нескольким наборам символов разделенных пробелами.
Прикрепленные файлы:
47. Епрст (Ёпрст) 27.06.12 17:53
(46) ты не понял..
я в строке поиска пишу отдельные слова, а не одно слово для поиска.
Т.е в твоей картинке, искал бы не "фонарь", а набирал бы "фонарь налобный", например.. и поиск был бы по 2-м словам:

descr like '%фонарь%' and descr like '%налобный%'
48. Максим Шуйский (maxpiter) 27.06.12 21:35
(47) у меня именно так и происходит, сколько пробелов, столько раз и like
49. Максим Шуйский (maxpiter) 27.06.12 21:45
(47)+
СтрДляЗапроса = "
|AND (DESCR LIKE '%"+СтрЗаменить(СтрокаСимволов," ","%') AND (DESCR LIKE '%");
50. Максим Шуйский (maxpiter) 27.06.12 21:50
(47) но суть даже не в этом, а в том, чтобы выводить в список согласно позиции набранного текста. У меня до первого пробела.
...
, case when CHARINDEX ('"+ТекстДоПервогоПробела+"', DESCR)=0 then 999 else CHARINDEX ('"+ТекстДоПервогоПробела+"', DESCR) end ПозицияВСтроке
...
51. Яр!к (Попытка1С) 28.06.12 14:29
А зачем все это если уже давно есть подобный класс от Rik'a.
52. Яр!к (Попытка1С) 28.06.12 15:26
+51 Тем более он и в ТЧ позволяет ввод делать.
53. Александр Гнитка (smitti911) 28.06.12 18:19
А можно поподробней про "подобный класс от Rik'a" или ссылку где можно посмотреть
54. Алексей (ADirks) 29.06.12 07:26
например http://www.1cpp.ru/forum/YaBB.pl?num=1155187084/0 http://www.1cpp.ru/forum/YaBB.pl?num=1169222935/156#156
но там тоже есть неприятные моменты, при быстром вводе буквы проглатываются
55. Саня Пупкин (pupkinSana) 29.06.12 11:07
Посидел полдня подумал. И можно реализовать без dynwrap.dll. Обошелся одной формекс и 1с++. Можно использовать ПринажатииКлавиатуры и приОтжатииклавиатуры. Вроде не плохо получилось. Смысл в том, что включаю режим редактирования, на форме есть всегда скрытый список, который подставляю и заполняю значениями.
56. Игорь Снегов (1c@mkd-nn) 29.06.12 12:54
В целом понравилось. Красиво.
Если бы еще и в табличной части работало.....
57. Максим Шуйский (maxpiter) 29.06.12 12:57
(0)это у меня глюк только или нет?
Скажем в групповой обработке справочника номенклатуры, после заполнения таблицы, высвечивается левое поле ввода.
На форме его в принципе нет.
Прикрепленные файлы:
58. Ваня (zk96) 01.07.12 00:38
Хотел скачать "напосмотреть", оборвалось, а "денег" больше нет. Но в принципе не важно, идея понятна.
Я и не знал про такую фичу при Форма.ТолькоПросмотр(0).
59. Епрст (Ёпрст) 02.07.12 09:06
(57) смотреть надо процы, где видимость слоя устанавливается.
"Левое" поле - это добавленный руктями атрибут формы через ДобавитьАтрибут - так реализована "глоб. переменная модуля".
60. Епрст (Ёпрст) 02.07.12 09:07
(58) на форуме 1cpp в репозитарии можешь скачать за так.
61. Епрст (Ёпрст) 02.07.12 09:09
(55) не совсем "удобно" - придётся "пасти" всегда активный атрибут формы + "специфичиские" действия клавы - бекспейс, выделение слова мышой и т.д..

А "по первым символам" есть в (54).
62. Игорь Снегов (1c@mkd-nn) 03.07.12 09:22
Обнаружил глюк. При открытии документа из отчета - аварийное завершение 1С-ки.
63. Евгений Долиновский (Dolly_EV) 05.07.12 13:10
Вот такую штуку обнаружил.
В одной из форм Процедура ПриОткрытии() прописана по-аглицки:

Procedure OnOpen() ... EndProcedure,

так вот, пока не поправил по-русски, она при перехвате НЕ ОТРАБАТЫВАЛА. Т.е. сначала срабатывала

"Функция Событие_ПослеСозданияФормы() Экспорт" Класса, потом

"Процедура ПослеСозданияФормы()" Контекста. Где собака порылась?
64. Епрст (Ёпрст) 05.07.12 14:10
Попробуй в классе прописать событие

Функция Событие_OnOpen(ФлагЧтенияНастройки) Экспорт

аналогично событию

Функция Событие_ПриОткрытии(ФлагЧтенияНастройки) Экспорт
65. Епрст (Ёпрст) 05.07.12 14:10
не проверял, должно работать, по идее
66. Евгений Долиновский (Dolly_EV) 05.07.12 15:52
(64) Ага, должно работать, проверять влом :-))У меня в одном месте только по все конфиге OnOpen был, поменял на "ПриОткрытии", просто в мемориз на будущее

Вот отсюда http://infostart.ru/public/141953/
CHARINDEX для 1SQLite (dbf) чем заменить? :-((
67. Епрст (Ёпрст) 05.07.12 15:56
в http://www.sqlite.org/docs.html
надо пошарится.. возможно, только ежели собственными функциями получится
68. Евгений Долиновский (Dolly_EV) 05.07.12 16:11
(67) http://www.sqlite.org/docs.html это мне "темный лес" ((
Вобщем на dbf пока зарубил "ПозицияВСтроке" - по скорости (правда пока один в базе, завтра на боевой попробую) вполне себе приемлемо для Номенклатуры в 25000 позиций
69. Владимир ЗАЙЦЕВ (Владимир Зайцев) 09.07.12 15:39
Это точно HARINDEX для 1SQLite (dbf) чем заменить!!!
70. Епрст (Ёпрст) 09.07.12 16:29
(69) взять vfp провайдер и написать запрос с использованием AT()
72. Андрей (andru_dv) 18.07.12 00:47
В шапке документа, при переключении закладок вижу реквизит - "флПриНачалеВыбораЗначения".
Пробовал его привязать к слою "НевидимыеЭлементы", не получилось.
Похоже Атр.Видимость=0; не всегда срабатывает.
Как его спрятать от пользователя?
73. Александр Алюев (alyuev) 19.07.12 12:19
(72) я убирал этот реквизит подальше с глаз долой с помощью
Атр.УстановитьКоординаты(10000,,,); 
т.к. у меня тоже Видимость не срабатывает.
74. Андрей (andru_dv) 19.07.12 14:04
Попробовал вставить описанную строку кода, но реквизит так и остался в левом верхнем углу шапки документа.
Можешь скинуть подробную инструкцию для того чтобы убрать "...подальше с глаз долой".
75. Епрст (Ёпрст) 19.07.12 14:08
(74) видать в какой то своей проце играешься с видимостью слоёв - вот и видишь добавленный атрибут формы.

ЗЫ: Атр.УстановитьКоординаты(10000,,,); писать сразу после ДобавитьАтрибут в коде.
76. Епрст (Ёпрст) 19.07.12 14:08
И это, перезапуск нужен, после правки класса.
77. Игорь Игорь (iogann91) 23.07.12 09:01
78. Андрей (andru_dv) 26.07.12 15:30
Ещё вопрос. Перестал работать Шифт-F4 в тех полях где вид справочник.
Если делаю вход для выбора элемента, тогда шифт-F4 срабатывает. У Вас также?
79. Евгений Долиновский (Dolly_EV) 07.08.12 05:57
(0) Текст = scrptCtrl.run("GetText");
{Глобальный модуль(44)}: Microsoft VBScript runtime error: ActiveX component can't create object: 'DynamicWrapper'

На XP - полет нормальный, На любом сервере (2003 x86/x64, 2008) - валится.
80. Епрст (Ёпрст) 29.10.12 14:38
(79)переставь скриптовую машину
81. Евгений Долиновский (Dolly_EV) 29.10.12 15:41
(80) я пока отказался от класса. Много там заморочек с правами доступа, которые на уровне "Предприятия" разруливаются (не заданы в конфигураторе)
82. Евгений Долиновский (Dolly_EV) 29.10.12 15:44
(80) а с Windows Script помнится как только не изголялся, не взлетело
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа