http://infostart.ru/public/140861/
позволяет искать по наименованию в реквизитах типа справочник "а-ля снеговик".
Класс основан на базе Перехватчика.
После его подключения во всех диалоговых окнах появится непосредственный ввод значения и поиск его по «like» среди наименований этого справочника. Строка для поиска может состоять из нескольких слов разделенных пробелом. Если найдено несколько элементов — выведется список значений для выбора.
Работает только для справочников определенного вида. Учитывается связь по владельцу, если в реквизите диалога указано «Связан с»
Фича основана на применении метода Форма.ТолькоПросмотр(0), публикация является продолжением публикации
Работает для дбф и sql варианта.
Для подключения необходимы вк formex.dll , 1cpp.dll, dynawrap.dll , для дбф варианта еще и 1sqlite.dll
подключение класса:
скачать архив, распаковать в каталог с ИБ
(если есть свои классы — то в нужное вам место + прописать путь до класса)
в глобальном модуле прописать:
Процедура ПриНачалеРаботыСистемы()
ЗагрузитьВнешнююКомпоненту(«1cpp.dll»);
Настройки=СоздатьОбъект(«УправлениеНастройками»);
Настройки.Сбросить(«Проверка типов»);
Настройки.Сбросить(«Отладка»);
//Настройки.Сбросить(«Оптимизация»);
Настройки.Включить(«Оптимизация»);
Настройки.Включить(«TurboBL»);
Настройки.Включить(«ПерехватитьСобытияГК»);
Перехватчик = СоздатьОбъект(«Перехватчик»);
ПерехватчикСобытийГМ = СоздатьОбъект(«АляВосьмерка»);
Перехватчик.ПерехватитьСобытияГлобальногоМодуля(ПерехватчикСобытийГМ);
ЗагрузитьВнешнююКомпоненту(«formex.dll»);
ЗагрузитьВнешнююКомпоненту(«1sqlite.dll»); //это в случае дбф варианта.
наслаждаться…
update 27.06.2012 утро
-поиск осуществляется из независимых слов в строке поиска (разделитель — пробел)
-исправлена ошибка при открытии формы из формы
update 27.06.2012 обед
-мелкие исправления в ходе обсуждения
Класс основан на баге платформы 7.7, является продолжением публикации
http://infostart.ru/public/140861/
позволяет искать по наименованию в реквизитах типа справочник «а-ля снеговик».
Перейти к публикации
Эх, лет пять бы назад все это…
(1) ну дык, скоро аналогично про снеговика будут говорить..
Про 8.0 и 8.1 уже никто и не вспоминает 🙂
(1) Ничего! Жив курилка!
крууутоооо!!!
(0) научите пожалуйста, как выполнять 2 перехватчика.
вот так вот нельзя
ПерехватчикСобытийГМ = СоздатьОбъект(«КлассПерехватСобытий»);
ПерехватчикАляВосьмерка = СоздатьОбъект(«АляВосьмерка»);
Перехватчик.ПерехватитьСобытияГлобальногоМодуля(ПерехватчикСобытийГМ);
Перехватчик.ПерехватитьСобытияГлобальногоМодуля(ПерехватчикАляВосьмерка);
а как тогда??? простите за ламерский вопрос 🙂
(6) У меня такой же вопрос? Как юзать одновременно 2 перехватчика на ГМ
(6) не эксперементировал, но судя по доке, нужно прописывать
ВыполнитьСобытиеГК или ВыполнитьСобытиеГлобальногоМодуля
Или, у Артура попросить мини примерчик.
(8)читаю как раз эту ссылку, но с примером было бы нагляднее.
Спасибо.
(0) Если подключаю без своего перехватчика, все работает, здорово 🙂
Можно добавить следующую хотелку?
Открывать список когда набрано 3 символа и возможно ли когда список уже открыт, продолжить набор в поле, уменьшая список соответственно введенному.
(11) на данный момент просто «работает» формула в реквизите диалога при нажатии ентер.
По-идее, можно либо «пасти нажатие» кнопок, либо тупо обработку ожидания втыкать, которая будет «пасти» реквизит, получать значение с него и делать запрос. Кодить надо 🙂
По-поводу нескольких перехватчиков, нужно организовывать подписки на события, по-идее.. один класс-перехватчик глобального модуля будет потом рассылать события в остальные КОП.. как-то так.
в аля восьмерка-не обнаружена функция вирт() в этом:
(14) дык, это просто синтаксис контроль у тебя не проходит, а так — усё работает.
Заместо Вирт() можно использовать устаревший метод ПолучитьКонтекстОкружения() ..
видимо у меня 27 совсем старая..
такой метод(ПолучитьКонтекстОкружения()) тоже отсутствует
конфа ТиС 9.2…
обидно, да ))
(17) дело не в «27», дело в 1cpp.dll
она у тебя какой версии хоть ? Поди 2**** ?
(18)
2.5.07
я чтото упустил?
(19) как бы да.. года 3-4 развития компоненты
:))
1срр сейчас ужо 3.2.3.20
и есть еще с xmllite 3.2.4.0 rc2
(20) поля открылись, поиск придется допиливать, не ищет
попробовывать приначалевводастроки() наверное надо
(21) эээ.. в каком реквизите не ищет ?
например ?
Если что, ищет только в реквизитах с типом <Справочник.ОпределенныйВид> .. во всех остальных — нет, + нет поиска в табличной части документа
no such table: Справочник.Контрагенты
при вводе в документе реализация поле контрагент, там определено как Справочник.Контрагенты
Я сделал такую замену в добавляемом модуле:
Чтобы если ничего не выбрали из списка, не обнулять значение реквизита
(26) не.. не совсем катит — останется текст на форме, по-идее (не смотрел еще)
(25) формат базы какой у тебя ? dbf ? sql ?
(27) DBF
sqlite.dll в корне базы
(29) sqlite.dll какой версии ?
Хотя нет, вертает взад..
да, так красившее
(31) 1.0.1.9
(26) только у тебя ошибка:
| Если Список.РазмерСписка()=1 Тогда
| // Элем = Список.ПолучитьЗначение(1); //вот в этом случае, нужно исправить на
| АтрФормы.Значение= Список.ПолучитьЗначение(1);
| ИначеЕсли Список.РазмерСписка()>1 Тогда
| Если Список.ВыбратьЗначение(Элем,,,,2)=1 Тогда АтрФормы.Значение = Элем; КонецЕсли;
| КонецЕсли;
// | АтрФормы.Значение = Элем;
(32) пробуй с этой:
(33) Ага, точно. Упустил.
(34)
дада
щас отрабатывает по энтер
И еще.
В обработчике Событие_ПриНачалеВыбораЗначения()
нужно устанавливать флПриНачалеВыбораЗначения = ФСО
т.е.
Т.к. действие выбора можно отменить в Перехватчике и формула не выполнится, а значит и флПриНачалеВыбораЗначения не обнулится. А по ФСО будет всё ок.
Перезалил..
Вот думаю, как избавится от флага-атрибута, слепленного через ДобавитьАтрибут, ибо с помощью ВыполняемогоМодуля сходу не получилось — не видит контекст переменную модуля в доп. глобальнике.
Надо попробовать определять ДопФормулу для каждого контекста в отдельности через ВыполняемыйМодуль
Есть идеи ?
Тут ещё одна фигня вылазит.
Если на форме есть атрибуты, у которых ранее был установлен признак Редактирование(0), то при отработке Форма.ТолькоПросмотр(0) они ессно становятся доступными. В частности, я сделал замену Перечислений на форме на атрибут с педалькой, у которого как раз устанавливалось свойство Редактирование(0). Ну и всё у меня полетело… Приходится в Перехватчике заново лопатить все реквизиты и кому нужно — переустанавливать доступность. Точнее — недоступность.
тогда уж не Доступность..а Редактирование — чтоб просто педалька работала..
(42) Ну, я ж про это и говорю… 🙂
(0) Позвольте, предложу функцию по составлению списка.
Ее отличие, в том, что элементы в списке выводятся в порядке вхождения набраннной строки
Показать
(44) не совсем подходит. У меня поиск может быть по нескольким словам разделенных пробелом.
(45) у меня эта штука стоит на справочниках и когда юзверь вводит текст, динамически изменяется список.
Функция ищет по нескольким наборам символов разделенных пробелами.
(46) ты не понял..
я в строке поиска пишу отдельные слова, а не одно слово для поиска.
Т.е в твоей картинке, искал бы не «фонарь», а набирал бы «фонарь налобный», например.. и поиск был бы по 2-м словам:
descr like ‘%фонарь%’ and descr like ‘%налобный%’
(47) у меня именно так и происходит, сколько пробелов, столько раз и like
(47)+
СтрДляЗапроса = »
|AND (DESCR LIKE ‘%»+СтрЗаменить(СтрокаСимволов,» «,»%’) AND (DESCR LIKE ‘%»);
(47) но суть даже не в этом, а в том, чтобы выводить в список согласно позиции набранного текста. У меня до первого пробела.
…
, case when CHARINDEX (‘»+ТекстДоПервогоПробела+»‘, DESCR)=0 then 999 else CHARINDEX (‘»+ТекстДоПервогоПробела+»‘, DESCR) end ПозицияВСтроке
…
А зачем все это если уже давно есть подобный класс от Rik’a.
+51 Тем более он и в ТЧ позволяет ввод делать.
А можно поподробней про «подобный класс от Rik’a» или ссылку где можно посмотреть
напримерhttp://www.1cpp.ru/forum/YaBB.pl?num=1155187084/0 http://www.1cpp.ru/forum/YaBB.pl?num=1169222935/156#156
но там тоже есть неприятные моменты, при быстром вводе буквы проглатываются
Посидел полдня подумал. И можно реализовать без dynwrap.dll. Обошелся одной формекс и 1с++. Можно использовать ПринажатииКлавиатуры и приОтжатииклавиатуры. Вроде не плохо получилось. Смысл в том, что включаю режим редактирования, на форме есть всегда скрытый список, который подставляю и заполняю значениями.
В целом понравилось. Красиво.
Если бы еще и в табличной части работало…..
(0)это у меня глюк только или нет?
Скажем в групповой обработке справочника номенклатуры, после заполнения таблицы, высвечивается левое поле ввода.
На форме его в принципе нет.
Хотел скачать «напосмотреть», оборвалось, а «денег» больше нет. Но в принципе не важно, идея понятна.
Я и не знал про такую фичу при Форма.ТолькоПросмотр(0).
(57) смотреть надо процы, где видимость слоя устанавливается.
«Левое» поле — это добавленный руктями атрибут формы через ДобавитьАтрибут — так реализована «глоб. переменная модуля».
(58) на форуме 1cpp в репозитарии можешь скачать за так.
(55) не совсем «удобно» — придётся «пасти» всегда активный атрибут формы + «специфичиские» действия клавы — бекспейс, выделение слова мышой и т.д..
А «по первым символам» есть в (54).
Обнаружил глюк. При открытии документа из отчета — аварийное завершение 1С-ки.
Вот такую штуку обнаружил.
В одной из форм Процедура ПриОткрытии() прописана по-аглицки:
Procedure OnOpen() … EndProcedure,
так вот, пока не поправил по-русски, она при перехвате НЕ ОТРАБАТЫВАЛА. Т.е. сначала срабатывала
«Функция Событие_ПослеСозданияФормы() Экспорт» Класса, потом
«Процедура ПослеСозданияФормы()» Контекста. Где собака порылась?
Попробуй в классе прописать событие
Функция Событие_OnOpen(ФлагЧтенияНастройки) Экспорт
аналогично событию
Функция Событие_ПриОткрытии(ФлагЧтенияНастройки) Экспорт
не проверял, должно работать, по идее
(64) Ага, должно работать, проверять влом :-))У меня в одном месте только по все конфиге OnOpen был, поменял на «ПриОткрытии», просто в мемориз на будущее
Вот отсюдаhttp://infostart.ru/public/141953/
CHARINDEX для 1SQLite (dbf) чем заменить? :-((
вhttp://www.sqlite.org/docs.html
надо пошарится.. возможно, только ежели собственными функциями получится
(67)http://www.sqlite.org/docs.html это мне «темный лес» ((
Вобщем на dbf пока зарубил «ПозицияВСтроке» — по скорости (правда пока один в базе, завтра на боевой попробую) вполне себе приемлемо для Номенклатуры в 25000 позиций
Это точно HARINDEX для 1SQLite (dbf) чем заменить!!!
(69) взять vfp провайдер и написать запрос с использованием AT()
пример тут
http://forum.infostart.ru/forum24/topic64901/message708878/#message708878
В шапке документа, при переключении закладок вижу реквизит — «флПриНачалеВыбораЗначения».
Пробовал его привязать к слою «НевидимыеЭлементы», не получилось.
Похоже Атр.Видимость=0; не всегда срабатывает.
Как его спрятать от пользователя?
(72) я убирал этот реквизит подальше с глаз долой с помощью
т.к. у меня тоже Видимость не срабатывает.
Попробовал вставить описанную строку кода, но реквизит так и остался в левом верхнем углу шапки документа.
Можешь скинуть подробную инструкцию для того чтобы убрать «…подальше с глаз долой».
(74) видать в какой то своей проце играешься с видимостью слоёв — вот и видишь добавленный атрибут формы.
ЗЫ: Атр.УстановитьКоординаты(10000,,,); писать сразу после ДобавитьАтрибут в коде.
И это, перезапуск нужен, после правки класса.
старая штука однако
Ещё вопрос. Перестал работать Шифт-F4 в тех полях где вид справочник.
Если делаю вход для выбора элемента, тогда шифт-F4 срабатывает. У Вас также?
(0) Текст = scrptCtrl.run(«GetText»);
{Глобальный модуль(44)}: Microsoft VBScript runtime error: ActiveX component can’t create object: ‘DynamicWrapper’
На XP — полет нормальный, На любом сервере (2003 x86/x64, 2008) — валится.
(79)переставь скриптовую машину
(80) я пока отказался от класса. Много там заморочек с правами доступа, которые на уровне «Предприятия» разруливаются (не заданы в конфигураторе)
(80) а с Windows Script помнится как только не изголялся, не взлетело
Времени прошло много, ну а вдруг ))
1. Не доработал никто все-таки, чтобы при вводе символов поиск осуществлялся сразу (без нажатия энтер)?
2. После внедрения на форме перестала отрабатываться «Форма.********.Доступность()» для элементов. При этом «видимость()» работает. Так и должно быть?
(83) можно попробовать доработать — это надо формексом ловить нажатия клавиш и смотреть какой активный элемент формы в данный момент.
про доступность — непонятно, что значит «перестала отрабатываться»?
(84) Про доступность: изначально на форме был реквизит, например, «Справочник.Контрагенты», который в зависимости от ситуации через Форма.ВыбКонтр.Доступность(0) становился недоступным на форме. А после внедрения этого класса — они все стали доступны для редактирования. Как я понимаю это проблема из-за Форма.ТолькоПросмотр(0). При это даже если после открытия формы я принудительно пытаюсь сделать недоступным элемент — не помогает.
(84)
(84)
Возьметесь? )
(85) это, по моему фича этой примочки. но лучше попытать автора
(86) ну… мне это особо не надо.. пока..так что вряд ли.. сугубо может только из спортивного интереса когда время будет, но не сейчас