Мини-класс для непосредственного ввода в элементах диалога 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 не будет опубликован. Обязательные поля помечены *