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

Баг 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. 


20 Comments

  1. MarSeN

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

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

    Reply
  2. pupkinSana

    не пойму, какой баг, для чего ертешка…

    Reply
  3. MarSeN

    баг в том, что 1С не обрабатывает нормально метод формы «ТолькоПросмотр», если в него передать параметр «0».

    ert-шка — это демонстрация данного бага и пример его использования. Советую скачать и посмотреть.

    Reply
  4. w-divin

    сразу насторожило несоответствие заявленного в заголовке:

    без использования ВК

    и описанного в статье:

    Вооружившись славной dll «dynwrap.dll» (предварительно зарегистрировав ее «regsrv32 dynwrap.dll»)
    Reply
  5. Ёпрст

    Дунаврап и без ВК ?

    :))))))))))

    можно было и формексом поймать значение.

    Reply
  6. Ёпрст

    А так, идея супер!

    Reply
  7. MarSeN

    ну про ВК — я наверное некорректно погорячился.

    Имел ввиду под ВК стандартное понимание — ЗагрузитьВнешнююКомпоненту()

    Reply
  8. Ёпрст

    svcsvc можно еще прикрутить, если в поиске список значений большой…и , если размер списка = 1, то сразу значение присваивать.

    Reply
  9. MarSeN

    to: Ёпрст

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

    Вообще это просто демонстрация возможности использования данного бага.

    Далее использование ограничивается только полетом вашего воображения )

    Reply
  10. Ёпрст

    (8) это понятно, просто штатный выпадающий список не всегда удобен, ди и ..попривык я к списку с фильтрацией от

    svcsvc

    Reply
  11. Ёпрст

    Скачал образец на посмотреть.

    Замечания:

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

    2.в данный момент нельзя выбрать непосредственно значение в реквизит справочника — «работает формула», которая «забивает» выбранное значение (а в случае со списком — еще и его покажет при выборе) — нужно всего лишь «взвести» флаг в ПриНачалеВыбораЗначения и проверять его /сбрасывать в формуле реквизита…

    Это так, чтоб примерчик был более презентабельнее.

    Reply
  12. SergDi

    мда… без «ВК» 🙂

    Reply
  13. SergDi

    хотя довольно интересно, правда под 7.7 давно не пишу

    Reply
  14. Ёпрст

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

    Вроде как использование в отчетах даже поудобнее — можно копи-пасте делать в реквизит.

    Reply
  15. Ёпрст

    ссылка на мини-класс

    http://infostart.ru/public/141197/

    Reply
  16. shatt

    Жива еще старушечка 77, и кажется скачивают не только для того чтобы посмотреть, но использовать на полях. Каюсь.. тоже в рядах 🙂 Спасибо!

    Reply
  17. MarSeN

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

    Сам я плотно 7.7 перестал заниматься более 3-х лет назад, но память о прошлом дает о себе знать…

    Сейчас занимаюсь 8.2. На подходе новая публикация, посвященная работе с актив икс на тонкой форме 8.2 с передачей событий в форму (на примере экселевского листа)

    Спасибо за отзывы и плюсы.

    Reply
  18. yuraos

    гм…без внешних компонент говоришь?

    ну тогды нужно убрать весь код из статьи,

    использующий объекты 1cpp.dll и formex.dll и прочих dll.

    🙂

    но все равно плюс автору, за креативность

    Reply
  19. yuraos

    (18)

    PS

    с моей точки зрения,

    те кто используют объекты Windows Script Host

    и говорят, что «без внешних компонент» — малость лукавят.

    🙂

    есть тут одна большая внешняя компонента mswindows.dll

    (хоть конешно и есть разница с ВК — ее грузить в 1С не надо)

    Reply
  20. onikts

    Круто, мне понравилось!

    Reply

Leave a Comment

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