• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

7.7 Обновление Формы

  • Автор темы Автор темы olga13
  • Дата начала Дата начала
O

olga13

Добрый день! Есть процедура подбора товара в документ с помощью штрих-сканера:
Код:
Процедура ШтрихСканер()
Перем ШК;
Спр = СоздатьОбъект("Справочник.НоменклатураК");
Если ВвестиСтроку(ШК, "Отсканируйте штрих-код", 13, 0, 15) = 1 Тогда
Если Спр.НайтиПоРеквизиту("ШтрихКод", ШК, 1) = 1 Тогда
НоваяСтрока();
Товар = Спр.ТекущийЭлемент();
Кол_во = 1;
ПересчетСтроки(1, "Товар");
//ФормаРасш.Обновить();
Форма.Обновить(1);
Иначе										 
Предупреждение("Товар не найден!");
КонецЕсли;
ШтрихСканер();
КонецЕсли;
КонецПроцедуры
Проблема в том, что пока открыто диалоговое окно ввода строки, в табличной части новые строки не отображаются. Я пробовала обновлять форму и штатными средствами, и через FormEx - ничего не получается. Что не так?
 
А как вызывается эта процедура и диалоговое окно? Что происходит в режиме отладки?
 
АктивизироватьСтроку(<НомСтроки>)

Правда я проблемы не понял.
* На экране появилось сообщение "Введите.."
* Человек ввел
* Сообщение пропадает и фокус возвращается к документу. Все строки видны. Даже Форма.Обновить(1); не нужно.
 
А как вызывается эта процедура и диалоговое окно? Что происходит в режиме отладки?

Процедура вызывается "горячей" клавишей. Можем вводить строки в документ вручную, а можем сканировать штрих-коды. Тогда товар добавляется автоматически.

Добавлено:
АктивизироватьСтроку(<НомСтроки>)

Правда я проблемы не понял.
* На экране появилось сообщение "Введите.."
* Человек ввел
* Сообщение пропадает и фокус возвращается к документу. Все строки видны. Даже Форма.Обновить(1); не нужно.

Задумка такая: пользователь решил вводить товар не вручную, а с помощью сканера. Тиснет "горячую" клавишу, появляется диалоговое окно. Чтобы не нажимать эту клавишу для каждого товара, значение штрих кода запрашивается до тех пор, пока пользователь не нажмет "Отмена". Так вот, пока не нажмешь эту самую "Отмену", новые строки в документе не видны.
 
Ни какой логической ошибки я не вижу. Попробуйте отказаться от рекурсии и организовать цикл каким-то другим способом.
 
Процедура-то рекурсивная)

Ну, глазастый!
Апалдеть! Это ж какое воспаленное сознание воткнуло сюда рекурсию? Что будет со стеком вызова после сотен сканирований? Простой цикл вполне к месту.

Но раз из процедуры не осуществляется выход, то фокус на форму не возвращается. Значит ничего и не отрисуется. Выход надо поискать в "ОткрытьПодбор()".


Добавлено: Есть, однако, еще один замысловатый прием.
- после добавления товара - Форма.Закрыть() и выйти из проц-ры.
- ПриЗакрытии() анализирует, что закрытие ложное и отказывается, затем вызывает повторный скан.
Соль в том, что в промежутке до закрытия, форма получает управление и отрисовывается.
 
Ну, глазастый!
Апалдеть! Это ж какое воспаленное сознание воткнуло сюда рекурсию? Что будет со стеком вызова после сотен сканирований? Простой цикл вполне к месту.
Не совсем поняла, чем в данном случае рекурсия хуже простого цикла. Ни о какой сотне сканирований речь не идет. Процедура крутится до тех пор, пока пользователь не нажмет кнопку "Отмена" в диалогов окне для ввода штрих-кода. На мой взгляд, это то же самое, что Пока ВвестиСтроку(,,,) = 1 Цикл.
Добавлено: Есть, однако, еще один замысловатый прием.
- после добавления товара - Форма.Закрыть() и выйти из проц-ры.
- ПриЗакрытии() анализирует, что закрытие ложное и отказывается, затем вызывает повторный скан.
Соль в том, что в промежутке до закрытия, форма получает управление и отрисовывается.
Дельный совет, все получилось. Спасибо большое.
 
Не совсем поняла, чем в данном случае рекурсия хуже простого цикла
Я тоже не понял) Стек вызовов, мне кажется, не лопнет))
Хотя она тут усложняет восприятие. Кажется, кому-то просто хотелось "побаловаться рекурсией" :)
 
Ну, парни, я возмущен всей своей тонкой натурой! Рекурсия нужна в редких случаях:
- обусловленных самой природой анализируемого объекта.
- обязательным условием является конечность вложенных циклов (именно иделогическая)

А когда человек "циклически" кликает по сканеру, то не хрен ее сюда за уши притягивать. И не надо ныть: "ну подумаешь, рука когда-то устанет", "и так ведь работает..." и в таком стиле. А надо думать и писать красиво.

Сейчас посмотрю предудущие посты, всем минусов навешаю со злости!
 
Пугает Мастер, никаких минусов он не навешает. Но ведь прав он по сути - слушайте Мегагуру, и да прибудет вам счастье :)
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab