gifts2017

Баги 1С 7.7 - добро или зло: непосредственный ввод "а ля 1С 8.х" без использования ВК

Опубликовал Сергей Марченко (MarSeN) в раздел Программирование - Практика программирования

Баг 1С 7.7 открывает нам возможность реализовать без использования ВК непостредственный ввод таких значений, как справочники, перечисления, документы по введенному тексту в поле ввода (а ля 1С 8.х)

В основе возможности реализовать непосредственный ввод «сложных» значений по введенному тексту (а ля 1С 8.х) в форме 1С 7.7 лежит баг, при котором, если в уже открытой форме выполнить метод «Форма.ТолькоПросмотр(0)», то все поля ввода (исключением являются поля ввода таблицы)  становятся доступными для ввода произвольного текста.

К сожалению, 1С 7.7 не «позволяет» получить введенный текст, поэтому нам придется обратиться к некоторым хитростям.

Вооружившись славной dll «dynwrap.dll» (предварительно зарегистрировав ее «regsrv32 dynwrap.dll»), мы проделаем следующее:

  1. Определим «формулу» в элементе диалога «ВыбратьПоТексту()»
  2. В процедуре ВыбратьПоТексту()
    1. Получим хэндл активного окна
    2. Прочтем текст из него
    3. Обработаем текст

Собственно, это - краткие теоретические выкладки.

А вот и сам код:

//НАЧАЛО КОДА

Перем РежимРедактированияВключен;

Процедура ВыбратьПоТексту()

                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. 


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

Наименование Файл Версия Размер
1C 7.7 Ввод в поле "а ля 1С 8" 33
.zip 25,86Kb
18.06.14
33
.zip 25,86Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
0. Сергей Марченко (MarSeN) 24.06.12 15:30
Баг 1С 7.7 открывает нам возможность реализовать без использования ВК непостредственный ввод таких значений, как справочники, перечисления, документы по введенному тексту в поле ввода (а ля 1С 8.х)

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

1. Саня Пупкин (pupkinSana) 25.06.12 12:50
не пойму, какой баг, для чего ертешка...
2. Сергей Марченко (MarSeN) 25.06.12 14:26
баг в том, что 1С не обрабатывает нормально метод формы "ТолькоПросмотр", если в него передать параметр "0".

ert-шка - это демонстрация данного бага и пример его использования. Советую скачать и посмотреть.
3. Дмитрий Елисеев (w-divin) 25.06.12 14:33
сразу насторожило несоответствие заявленного в заголовке:
без использования ВК
и описанного в статье:
Вооружившись славной dll «dynwrap.dll» (предварительно зарегистрировав ее «regsrv32 dynwrap.dll»)
wolfsoft; xzorkiix; +2 Ответить
4. Епрст (Ёпрст) 25.06.12 14:44
Дунаврап и без ВК ?
:))))))))))

можно было и формексом поймать значение.
5. Епрст (Ёпрст) 25.06.12 14:54
6. Сергей Марченко (MarSeN) 25.06.12 15:22
ну про ВК - я наверное некорректно погорячился.
Имел ввиду под ВК стандартное понимание - ЗагрузитьВнешнююКомпоненту()
7. Епрст (Ёпрст) 25.06.12 15:47
svcsvc можно еще прикрутить, если в поиске список значений большой...и , если размер списка = 1, то сразу значение присваивать.
8. Сергей Марченко (MarSeN) 25.06.12 19:10
to: Ёпрст

в случае если количество вхождений больше одного можно использовать стандартный список значений с выпадающим списком. Такой пример в самом низу с испольщованием 1C++ для получения данных по входению. Там же реализовано если значение только одно то сразу они и берется без выпадающено списка.

Вообще это просто демонстрация возможности использования данного бага.
Далее использование ограничивается только полетом вашего воображения )
9. Епрст (Ёпрст) 26.06.12 10:01
(8) это понятно, просто штатный выпадающий список не всегда удобен, ди и ..попривык я к списку с фильтрацией от
svcsvc
10. Епрст (Ёпрст) 26.06.12 10:11
Скачал образец на посмотреть.
Замечания:

1.текст на форме с функцией лучше убрать, заместо этого использовать ПослеОткрытия/ПослеСозданияФормы, если есть ВК формекс/1cpp или Форма.ОбработкаОжидания, если её нет..
2.в данный момент нельзя выбрать непосредственно значение в реквизит справочника - "работает формула", которая "забивает" выбранное значение (а в случае со списком - еще и его покажет при выборе) - нужно всего лишь "взвести" флаг в ПриНачалеВыбораЗначения и проверять его /сбрасывать в формуле реквизита...

Это так, чтоб примерчик был более презентабельнее.
11. Serg Kondrasgov (SergDi) 26.06.12 13:14
12. Serg Kondrasgov (SergDi) 26.06.12 13:15
хотя довольно интересно, правда под 7.7 давно не пишу
13. Епрст (Ёпрст) 26.06.12 15:57
По-быстрому накидал мини-класс, воткнул в рабочую конфу.. опробуем на живых пользователях.
Вроде как использование в отчетах даже поудобнее - можно копи-пасте делать в реквизит.
14. Епрст (Ёпрст) 26.06.12 20:27
15. Ильшат (shatt) 28.06.12 23:01
Жива еще старушечка 77, и кажется скачивают не только для того чтобы посмотреть, но использовать на полях. Каюсь.. тоже в рядах :) Спасибо!
17. Сергей Марченко (MarSeN) 29.06.12 23:45
Я рад что моя публикация вызвала такой интерес и уж тем более применяется в реалии.
Сам я плотно 7.7 перестал заниматься более 3-х лет назад, но память о прошлом дает о себе знать...
Сейчас занимаюсь 8.2. На подходе новая публикация, посвященная работе с актив икс на тонкой форме 8.2 с передачей событий в форму (на примере экселевского листа)
Спасибо за отзывы и плюсы.
18. Юрий Осипов (yuraos) 31.01.13 09:39
гм...без внешних компонент говоришь?
ну тогды нужно убрать весь код из статьи,
использующий объекты 1cpp.dll и formex.dll и прочих dll.
:)
но все равно плюс автору, за креативность
19. Юрий Осипов (yuraos) 31.01.13 09:48
(18)
PS
с моей точки зрения,
те кто используют объекты Windows Script Host
и говорят, что "без внешних компонент" - малость лукавят.
:)
есть тут одна большая внешняя компонента mswindows.dll
(хоть конешно и есть разница с ВК - ее грузить в 1С не надо)
20. OnikTs (onikts) 05.01.15 10:54