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