• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

olga13

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

Guest

А как вызывается эта процедура и диалоговое окно? Что происходит в режиме отладки?
 
Д

Дайнеко

АктивизироватьСтроку(<НомСтроки>)

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

olga13

А как вызывается эта процедура и диалоговое окно? Что происходит в режиме отладки?

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

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

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

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

Guest

Ни какой логической ошибки я не вижу. Попробуйте отказаться от рекурсии и организовать цикл каким-то другим способом.
 
Д

Дайнеко

Процедура-то рекурсивная)

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

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


Добавлено: Есть, однако, еще один замысловатый прием.
- после добавления товара - Форма.Закрыть() и выйти из проц-ры.
- ПриЗакрытии() анализирует, что закрытие ложное и отказывается, затем вызывает повторный скан.
Соль в том, что в промежутке до закрытия, форма получает управление и отрисовывается.
 
O

olga13

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

unknown181538

Не совсем поняла, чем в данном случае рекурсия хуже простого цикла
Я тоже не понял) Стек вызовов, мне кажется, не лопнет))
Хотя она тут усложняет восприятие. Кажется, кому-то просто хотелось "побаловаться рекурсией" :)
 
Д

Дайнеко

Ну, парни, я возмущен всей своей тонкой натурой! Рекурсия нужна в редких случаях:
- обусловленных самой природой анализируемого объекта.
- обязательным условием является конечность вложенных циклов (именно иделогическая)

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

Сейчас посмотрю предудущие посты, всем минусов навешаю со злости!
 
V

vbs

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!