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


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

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

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

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

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

//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 обед

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


88 Comments

  1. Ёпрст

    Класс основан на баге платформы 7.7, является продолжением публикации

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

    позволяет искать по наименованию в реквизитах типа справочник «а-ля снеговик».

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

    Reply
  2. orefkov

    Эх, лет пять бы назад все это…

    Reply
  3. Ёпрст

    (1) ну дык, скоро аналогично про снеговика будут говорить..

    Про 8.0 и 8.1 уже никто и не вспоминает 🙂

    Reply
  4. alyuev

    (1) Ничего! Жив курилка!

    Reply
  5. anton.fly7

    крууутоооо!!!

    Reply
  6. maxpiter

    (0) научите пожалуйста, как выполнять 2 перехватчика.

    вот так вот нельзя

    ПерехватчикСобытийГМ = СоздатьОбъект(«КлассПерехватСобытий»);

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

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

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

    а как тогда??? простите за ламерский вопрос 🙂

    Reply
  7. smitti911

    (6) У меня такой же вопрос? Как юзать одновременно 2 перехватчика на ГМ

    Reply
  8. Ёпрст

    (6) не эксперементировал, но судя по доке, нужно прописывать

    ВыполнитьСобытиеГК или ВыполнитьСобытиеГлобальногоМодуля

    http://www.1cpp.ru/docum/icpp/html/Hooker.html#id3

    Reply
  9. Ёпрст

    Или, у Артура попросить мини примерчик.

    Reply
  10. maxpiter

    (8)читаю как раз эту ссылку, но с примером было бы нагляднее.

    Спасибо.

    Reply
  11. maxpiter

    (0) Если подключаю без своего перехватчика, все работает, здорово 🙂

    Можно добавить следующую хотелку?

    Открывать список когда набрано 3 символа и возможно ли когда список уже открыт, продолжить набор в поле, уменьшая список соответственно введенному.

    Reply
  12. Ёпрст

    (11) на данный момент просто «работает» формула в реквизите диалога при нажатии ентер.

    По-идее, можно либо «пасти нажатие» кнопок, либо тупо обработку ожидания втыкать, которая будет «пасти» реквизит, получать значение с него и делать запрос. Кодить надо 🙂

    Reply
  13. Ёпрст

    По-поводу нескольких перехватчиков, нужно организовывать подписки на события, по-идее.. один класс-перехватчик глобального модуля будет потом рассылать события в остальные КОП.. как-то так.

    Reply
  14. ivanov_alex

    в аля восьмерка-не обнаружена функция вирт() в этом:

    Перехватчик.ПерехватитьСобытияГК(КонтФормы,вирт<<?>>());
    Reply
  15. Ёпрст

    (14) дык, это просто синтаксис контроль у тебя не проходит, а так — усё работает.

    Reply
  16. Ёпрст

    Заместо Вирт() можно использовать устаревший метод ПолучитьКонтекстОкружения() ..

    Reply
  17. ivanov_alex

    видимо у меня 27 совсем старая..

    такой метод(ПолучитьКонтекстОкружения()) тоже отсутствует

    конфа ТиС 9.2…

    обидно, да ))

    Reply
  18. Ёпрст

    (17) дело не в «27», дело в 1cpp.dll

    она у тебя какой версии хоть ? Поди 2**** ?

    Reply
  19. ivanov_alex

    (18)

    2.5.07

    я чтото упустил?

    Reply
  20. Ёпрст

    (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

    Reply
  21. ivanov_alex

    (20) поля открылись, поиск придется допиливать, не ищет

    попробовывать приначалевводастроки() наверное надо

    Reply
  22. Ёпрст

    (21) эээ.. в каком реквизите не ищет ?

    Reply
  23. Ёпрст

    например ?

    Reply
  24. Ёпрст

    Если что, ищет только в реквизитах с типом <Справочник.ОпределенныйВид> .. во всех остальных — нет, + нет поиска в табличной части документа

    Reply
  25. ivanov_alex

    no such table: Справочник.Контрагенты

    при вводе в документе реализация поле контрагент, там определено как Справочник.Контрагенты

    Reply
  26. alyuev

    Я сделал такую замену в добавляемом модуле:

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

    Чтобы если ничего не выбрали из списка, не обнулять значение реквизита

    Reply
  27. Ёпрст

    (26) не.. не совсем катит — останется текст на форме, по-идее (не смотрел еще)

    Reply
  28. Ёпрст

    (25) формат базы какой у тебя ? dbf ? sql ?

    Reply
  29. ivanov_alex

    (27) DBF

    sqlite.dll в корне базы

    Reply
  30. Ёпрст

    (29) sqlite.dll какой версии ?

    Reply
  31. Ёпрст

    Хотя нет, вертает взад..

    да, так красившее

    Reply
  32. ivanov_alex

    (31) 1.0.1.9

    Reply
  33. Ёпрст

    (26) только у тебя ошибка:

    | Если Список.РазмерСписка()=1 Тогда

    | // Элем = Список.ПолучитьЗначение(1); //вот в этом случае, нужно исправить на

    | АтрФормы.Значение= Список.ПолучитьЗначение(1);

    | ИначеЕсли Список.РазмерСписка()>1 Тогда

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

    | КонецЕсли;

    // | АтрФормы.Значение = Элем;

    Reply
  34. Ёпрст

    (32) пробуй с этой:

    http://webfile.ru/6016402

    Reply
  35. alyuev

    (33) Ага, точно. Упустил.

    Reply
  36. ivanov_alex

    (34)

    дада

    щас отрабатывает по энтер

    Reply
  37. alyuev

    И еще.

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

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

    т.е.

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

    Т.к. действие выбора можно отменить в Перехватчике и формула не выполнится, а значит и флПриНачалеВыбораЗначения не обнулится. А по ФСО будет всё ок.

    Reply
  38. Ёпрст

    Перезалил..

    Reply
  39. Ёпрст

    Вот думаю, как избавится от флага-атрибута, слепленного через ДобавитьАтрибут, ибо с помощью ВыполняемогоМодуля сходу не получилось — не видит контекст переменную модуля в доп. глобальнике.

    Надо попробовать определять ДопФормулу для каждого контекста в отдельности через ВыполняемыйМодуль

    Reply
  40. Ёпрст

    Есть идеи ?

    Reply
  41. alyuev

    Тут ещё одна фигня вылазит.

    Если на форме есть атрибуты, у которых ранее был установлен признак Редактирование(0), то при отработке Форма.ТолькоПросмотр(0) они ессно становятся доступными. В частности, я сделал замену Перечислений на форме на атрибут с педалькой, у которого как раз устанавливалось свойство Редактирование(0). Ну и всё у меня полетело… Приходится в Перехватчике заново лопатить все реквизиты и кому нужно — переустанавливать доступность. Точнее — недоступность.

    Reply
  42. Ёпрст

    тогда уж не Доступность..а Редактирование — чтоб просто педалька работала..

    Reply
  43. alyuev

    (42) Ну, я ж про это и говорю… 🙂

    Reply
  44. maxpiter

    (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
    |»;
    глРС.ВыполнитьИнструкцию(ТекстЗапроса, СпЗн);
    Возврат СпЗн;
    КонецФункции

    Показать

    Reply
  45. Ёпрст

    (44) не совсем подходит. У меня поиск может быть по нескольким словам разделенных пробелом.

    Reply
  46. maxpiter

    (45) у меня эта штука стоит на справочниках и когда юзверь вводит текст, динамически изменяется список.

    Функция ищет по нескольким наборам символов разделенных пробелами.

    Reply
  47. Ёпрст

    (46) ты не понял..

    я в строке поиска пишу отдельные слова, а не одно слово для поиска.

    Т.е в твоей картинке, искал бы не «фонарь», а набирал бы «фонарь налобный», например.. и поиск был бы по 2-м словам:

    descr like ‘%фонарь%’ and descr like ‘%налобный%’

    Reply
  48. maxpiter

    (47) у меня именно так и происходит, сколько пробелов, столько раз и like

    Reply
  49. maxpiter

    (47)+

    СтрДляЗапроса = »

    |AND (DESCR LIKE ‘%»+СтрЗаменить(СтрокаСимволов,» «,»%’) AND (DESCR LIKE ‘%»);

    Reply
  50. maxpiter

    (47) но суть даже не в этом, а в том, чтобы выводить в список согласно позиции набранного текста. У меня до первого пробела.



    , case when CHARINDEX (‘»+ТекстДоПервогоПробела+»‘, DESCR)=0 then 999 else CHARINDEX (‘»+ТекстДоПервогоПробела+»‘, DESCR) end ПозицияВСтроке

    Reply
  51. Попытка1С

    А зачем все это если уже давно есть подобный класс от Rik’a.

    Reply
  52. Попытка1С

    +51 Тем более он и в ТЧ позволяет ввод делать.

    Reply
  53. smitti911

    А можно поподробней про «подобный класс от Rik’a» или ссылку где можно посмотреть

    Reply
  54. ADirks

    например http://www.1cpp.ru/forum/YaBB.pl?num=1155187084/0 http://www.1cpp.ru/forum/YaBB.pl?num=1169222935/156#156

    но там тоже есть неприятные моменты, при быстром вводе буквы проглатываются

    Reply
  55. pupkinSana

    Посидел полдня подумал. И можно реализовать без dynwrap.dll. Обошелся одной формекс и 1с++. Можно использовать ПринажатииКлавиатуры и приОтжатииклавиатуры. Вроде не плохо получилось. Смысл в том, что включаю режим редактирования, на форме есть всегда скрытый список, который подставляю и заполняю значениями.

    Reply
  56. 1c@mkd-nn

    В целом понравилось. Красиво.

    Если бы еще и в табличной части работало…..

    Reply
  57. maxpiter

    (0)это у меня глюк только или нет?

    Скажем в групповой обработке справочника номенклатуры, после заполнения таблицы, высвечивается левое поле ввода.

    На форме его в принципе нет.

    Reply
  58. zk96

    Хотел скачать «напосмотреть», оборвалось, а «денег» больше нет. Но в принципе не важно, идея понятна.

    Я и не знал про такую фичу при Форма.ТолькоПросмотр(0).

    Reply
  59. Ёпрст

    (57) смотреть надо процы, где видимость слоя устанавливается.

    «Левое» поле — это добавленный руктями атрибут формы через ДобавитьАтрибут — так реализована «глоб. переменная модуля».

    Reply
  60. Ёпрст

    (58) на форуме 1cpp в репозитарии можешь скачать за так.

    Reply
  61. Ёпрст

    (55) не совсем «удобно» — придётся «пасти» всегда активный атрибут формы + «специфичиские» действия клавы — бекспейс, выделение слова мышой и т.д..

    А «по первым символам» есть в (54).

    Reply
  62. 1c@mkd-nn

    Обнаружил глюк. При открытии документа из отчета — аварийное завершение 1С-ки.

    Reply
  63. Dolly_EV

    Вот такую штуку обнаружил.

    В одной из форм Процедура ПриОткрытии() прописана по-аглицки:

    Procedure OnOpen() … EndProcedure,

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

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

    «Процедура ПослеСозданияФормы()» Контекста. Где собака порылась?

    Reply
  64. Ёпрст

    Попробуй в классе прописать событие

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

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

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

    Reply
  65. Ёпрст

    не проверял, должно работать, по идее

    Reply
  66. Dolly_EV

    (64) Ага, должно работать, проверять влом :-))У меня в одном месте только по все конфиге OnOpen был, поменял на «ПриОткрытии», просто в мемориз на будущее

    Вот отсюда http://infostart.ru/public/141953/

    CHARINDEX для 1SQLite (dbf) чем заменить? :-((

    Reply
  67. Ёпрст

    в http://www.sqlite.org/docs.html

    надо пошарится.. возможно, только ежели собственными функциями получится

    Reply
  68. Dolly_EV

    (67) http://www.sqlite.org/docs.html это мне «темный лес» ((

    Вобщем на dbf пока зарубил «ПозицияВСтроке» — по скорости (правда пока один в базе, завтра на боевой попробую) вполне себе приемлемо для Номенклатуры в 25000 позиций

    Reply
  69. Владимир Зайцев

    Это точно HARINDEX для 1SQLite (dbf) чем заменить!!!

    Reply
  70. Ёпрст

    (69) взять vfp провайдер и написать запрос с использованием AT()

    Reply
  71. Ёпрст
  72. andru_dv

    В шапке документа, при переключении закладок вижу реквизит — «флПриНачалеВыбораЗначения».

    Пробовал его привязать к слою «НевидимыеЭлементы», не получилось.

    Похоже Атр.Видимость=0; не всегда срабатывает.

    Как его спрятать от пользователя?

    Reply
  73. alyuev

    (72) я убирал этот реквизит подальше с глаз долой с помощью

    Атр.УстановитьКоординаты(10000,,,); 

    т.к. у меня тоже Видимость не срабатывает.

    Reply
  74. andru_dv

    Попробовал вставить описанную строку кода, но реквизит так и остался в левом верхнем углу шапки документа.

    Можешь скинуть подробную инструкцию для того чтобы убрать «…подальше с глаз долой».

    Reply
  75. Ёпрст

    (74) видать в какой то своей проце играешься с видимостью слоёв — вот и видишь добавленный атрибут формы.

    ЗЫ: Атр.УстановитьКоординаты(10000,,,); писать сразу после ДобавитьАтрибут в коде.

    Reply
  76. Ёпрст

    И это, перезапуск нужен, после правки класса.

    Reply
  77. iogann91

    старая штука однако

    Reply
  78. andru_dv

    Ещё вопрос. Перестал работать Шифт-F4 в тех полях где вид справочник.

    Если делаю вход для выбора элемента, тогда шифт-F4 срабатывает. У Вас также?

    Reply
  79. Dolly_EV

    (0) Текст = scrptCtrl.run(«GetText»);

    {Глобальный модуль(44)}: Microsoft VBScript runtime error: ActiveX component can’t create object: ‘DynamicWrapper’

    На XP — полет нормальный, На любом сервере (2003 x86/x64, 2008) — валится.

    Reply
  80. Ёпрст

    (79)переставь скриптовую машину

    Reply
  81. Dolly_EV

    (80) я пока отказался от класса. Много там заморочек с правами доступа, которые на уровне «Предприятия» разруливаются (не заданы в конфигураторе)

    Reply
  82. Dolly_EV

    (80) а с Windows Script помнится как только не изголялся, не взлетело

    Reply
  83. pk3-20

    Времени прошло много, ну а вдруг ))

    1. Не доработал никто все-таки, чтобы при вводе символов поиск осуществлялся сразу (без нажатия энтер)?

    2. После внедрения на форме перестала отрабатываться «Форма.********.Доступность()» для элементов. При этом «видимость()» работает. Так и должно быть?

    Reply
  84. CheBurator

    (83) можно попробовать доработать — это надо формексом ловить нажатия клавиш и смотреть какой активный элемент формы в данный момент.

    про доступность — непонятно, что значит «перестала отрабатываться»?

    Reply
  85. pk3-20

    (84) Про доступность: изначально на форме был реквизит, например, «Справочник.Контрагенты», который в зависимости от ситуации через Форма.ВыбКонтр.Доступность(0) становился недоступным на форме. А после внедрения этого класса — они все стали доступны для редактирования. Как я понимаю это проблема из-за Форма.ТолькоПросмотр(0). При это даже если после открытия формы я принудительно пытаюсь сделать недоступным элемент — не помогает.

    Reply
  86. pk3-20

    (84)

    (84)

    ожно попробовать доработать — это надо формексом ловить нажатия клавиш и смотреть какой активный элемент формы в данный момент.

    Возьметесь? )

    Reply
  87. CheBurator

    (85) это, по моему фича этой примочки. но лучше попытать автора

    Reply
  88. CheBurator

    (86) ну… мне это особо не надо.. пока..так что вряд ли.. сугубо может только из спортивного интереса когда время будет, но не сейчас

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *