В основе возможности реализовать непосредственный ввод «сложных» значений по введенному тексту (а ля 1С 8.х) в форме 1С 7.7 лежит баг, при котором, если в уже открытой форме выполнить метод «Форма.ТолькоПросмотр(0)», то все поля ввода (исключением являются поля ввода таблицы) становятся доступными для ввода произвольного текста.
К сожалению, 1С 7.7 не «позволяет» получить введенный текст, поэтому нам придется обратиться к некоторым хитростям.
Вооружившись славной dll «dynwrap.dll» (предварительно зарегистрировав ее «regsrv32 dynwrap.dll»), мы проделаем следующее:
- Определим «формулу» в элементе диалога «ВыбратьПоТексту()»
- В процедуре ВыбратьПоТексту()
- Получим хэндл активного окна
- Прочтем текст из него
- Обработаем текст
Собственно, это — краткие теоретические выкладки.
А вот и сам код:
//НАЧАЛО КОДА
Перем РежимРедактированияВключен;
Процедура ВыбратьПоТексту()
scrptCtrl=createobject("MSScriptControl.ScriptControl");
scrptCtrl.language="vbscript";
scrptCtrl.addcode("
|Function GetText()
|Text = Space(128)
|Set Wrapper = CreateObject(""DynamicWrapper"")
|Wrapper.Register ""USER32.DLL"", ""SendMessage"", ""I=lllr"", ""f=s"", ""r=l""
|Wrapper.Register ""USER32.DLL"", ""GetFocus"", ""f=s"", ""r=l""
|ActiveControl = Wrapper.GetFocus 'элемент окна с фокусом ввода
|tcnt = Wrapper.SendMessage (ActiveControl, &HD ,128, Text) 'WM_GETTEXT
|GetText = Text
|End Function");
Текст = scrptCtrl.run("GetText");
//простой пример обработки полученного текста
Сотрудники = СоздатьОбъект("Справочник.Сотрудники");
Сотрудники.НайтиПоНаименованию(Текст,0,0);
Сотр = Сотрудники.ТекущийЭлемент();
КонецПроцедуры
Функция ВключитьРежимРедактированияПолей()
Если РежимРедактированияВключен = 0 Тогда
Форма.ТолькоПросмотр(0);
РежимРедактированияВключен = 1;
КонецЕсли;
КонецФункции
РежимРедактированияВключен = 0;
//КОНЕЦ КОДА
пример более качественной обработки результата для 1С++, позволяющий видеть в выпадающем списке возможные варианты значений, если их несколько:
ТЗ = СоздатьОбъект("ТаблицаЗначений");
RS = СоздатьОбъект("ODBCRecordSet");
RS.ВыполнитьИнструкцию("
|select
| Сотрудники.ID [Сотрудник $Справочник.Сотрудники]
|from
| $Справочник.Сотрудники as Сотрудники
|where
| Сотрудники.DESCR like '%"+Текст+"%'",ТЗ);
СписокСотр = СоздатьОбъект("СписокЗначений");
ТЗ.Выгрузить(СписокСотр,,,"Сотрудник");
Если СписокСотр.РазмерСписка() = 1 Тогда
Сотр = СписокСотр.ПолучитьЗначение(1);
Иначе
зн = 0;
Если СписокСотр.ВыбратьЗначение(зн,,,,2) = 1 Тогда
Сотр = зн;
КонецЕсли;
КонецЕсли;
PS: Данный баг и текущий способ ввода были мною проработаны около 4-х лет назад. Я определил процеуру в глобальном модуле и в ней, используя 1С++ как источник данных, формировал выпадающий список с возможными вариантами значений по like.




Баг 1С 7.7 открывает нам возможность реализовать без использования ВК непостредственный ввод таких значений, как справочники, перечисления, документы по введенному тексту в поле ввода (а ля 1С 8.х)
Перейти к публикации
не пойму, какой баг, для чего ертешка…
баг в том, что 1С не обрабатывает нормально метод формы «ТолькоПросмотр», если в него передать параметр «0».
ert-шка — это демонстрация данного бага и пример его использования. Советую скачать и посмотреть.
сразу насторожило несоответствие заявленного в заголовке:
и описанного в статье:
Дунаврап и без ВК ?
:))))))))))
можно было и формексом поймать значение.
А так, идея супер!
ну про ВК — я наверное некорректно погорячился.
Имел ввиду под ВК стандартное понимание — ЗагрузитьВнешнююКомпоненту()
svcsvc можно еще прикрутить, если в поиске список значений большой…и , если размер списка = 1, то сразу значение присваивать.
to: Ёпрст
в случае если количество вхождений больше одного можно использовать стандартный список значений с выпадающим списком. Такой пример в самом низу с испольщованием 1C++ для получения данных по входению. Там же реализовано если значение только одно то сразу они и берется без выпадающено списка.
Вообще это просто демонстрация возможности использования данного бага.
Далее использование ограничивается только полетом вашего воображения )
(8) это понятно, просто штатный выпадающий список не всегда удобен, ди и ..попривык я к списку с фильтрацией от
svcsvc
Скачал образец на посмотреть.
Замечания:
1.текст на форме с функцией лучше убрать, заместо этого использовать ПослеОткрытия/ПослеСозданияФормы, если есть ВК формекс/1cpp или Форма.ОбработкаОжидания, если её нет..
2.в данный момент нельзя выбрать непосредственно значение в реквизит справочника — «работает формула», которая «забивает» выбранное значение (а в случае со списком — еще и его покажет при выборе) — нужно всего лишь «взвести» флаг в ПриНачалеВыбораЗначения и проверять его /сбрасывать в формуле реквизита…
Это так, чтоб примерчик был более презентабельнее.
мда… без «ВК» 🙂
хотя довольно интересно, правда под 7.7 давно не пишу
По-быстрому накидал мини-класс, воткнул в рабочую конфу.. опробуем на живых пользователях.
Вроде как использование в отчетах даже поудобнее — можно копи-пасте делать в реквизит.
ссылка на мини-класс
Жива еще старушечка 77, и кажется скачивают не только для того чтобы посмотреть, но использовать на полях. Каюсь.. тоже в рядах 🙂 Спасибо!
Я рад что моя публикация вызвала такой интерес и уж тем более применяется в реалии.
Сам я плотно 7.7 перестал заниматься более 3-х лет назад, но память о прошлом дает о себе знать…
Сейчас занимаюсь 8.2. На подходе новая публикация, посвященная работе с актив икс на тонкой форме 8.2 с передачей событий в форму (на примере экселевского листа)
Спасибо за отзывы и плюсы.
гм…без внешних компонент говоришь?
ну тогды нужно убрать весь код из статьи,
использующий объекты 1cpp.dll и formex.dll и прочих dll.
🙂
но все равно плюс автору, за креативность
(18)
PS
с моей точки зрения,
те кто используют объекты
и говорят, что «без внешних компонент» — малость лукавят.
🙂
есть тут одна большая внешняя компонента mswindows.dll
(хоть конешно и есть разница с ВК — ее грузить в 1С не надо)
Круто, мне понравилось!