Пост

Множественные клики в 1С

Оказывается, 1С в отладке в ожидании запоминает нажатые кнопки, а потом выполняет их поочерёдно. 😅


Открываем новую рубрику “Полтергейсты 1С”.

В ней будем показывать всякие несерьёзные “особенности” платформы, которые могут однажды отнять у вас время на разбор ситуации.

И сегодня это “множественные клики”. Оказывается, 1С в отладке в ожидании запоминает нажатия пользователя, а потом выполняет их поочерёдно.

Всё описанное в этой статье можно наглядно увидеть в снятом видео:

Давайте для начала вспомним, что будет, если во время выполнения какого-то кода, пользователь начнет нажимать на кнопки и поля формы. В то время, когда сеанс для пользователя висит. Да, во время выполнения кода 1С не будет реагировать ни на какие действия. Это нормальное поведение, ведь если сейчас выполняется код, то и нельзя обрабатывать нажатия на кнопки и поля формы.

Но бывает ситуация, с которой может столкнуться и сам разработчик во время отладки. Давайте подготовим всё для эксперимента.

Для этого создадим обработку с формой и кнопочкой:

Скрин

А в коде кнопки делаем простой код. Просто для того, чтобы поставить точку останова =)

1
2
3
4
5
А = "";

Для й = 1 По 1000 Цикл

КонецЦикла;

Теперь добавим реквизит формы, который будет подсчитывать количество выполнений нашей кнопки.

Скрин

И в конце каждого выполнения кнопки, будем увеличивать этот счётчик

1
2
3
4
5
6
7
А = "";

Для й = 1 По 1000 Цикл

КонецЦикла;

КоличествоВыполнений = КоличествоВыполнений + 1;

Далее будем работать с разделённым экраном, чтобы было удобнее.

Откроем обработку, установим точку останова и нажмём кнопку.

Скрин

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

А теперь в конфигураторе нажимаем “F5”, чтобы пропустить код дальше. И видим, что снова 1С решила выполнить код. Отпускаем отладку - количество выполнений кнопочки намного больше единицы:

Скрин

Демонстрация:

Скрин

По количеству выполнению видим, что каждое наше нажатие отработалось. При том, что все это время код находился на отладке, то есть 1С не должна никак реагировать на действия. И, в принципе, 1С так и делает, когда мы в обычном сеансе открываем обработку и выживаем на кнопку, которая будет выполнять какое-то сложные действия и “зависает” сеанс. В этот момент 1С не реагирует никак на действие пользователя. Но вот если разработчик поставил точку останова и находится сейчас на ней, то случайно нажав на какую-нибудь кнопку обработки он может с удивлением увидеть, что она выполнится повторно.

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

Для этого снова откроем обработку, поставим точку останова и нажмём кнопку “Тестирование”. И на этот момент, во время отладки, нажмём не снова на эту же кнопку, а на стандартную кнопку “Ещё”.

Как видно на GIF, после снятия отладки 1С открыла подменю “Ещё”.

Скрин

А теперь повторим эксперимент и нажмём на кнопку “Ещё”, а потом и в то место, где должна появиться кнопка “Изменить форму”:

Скрин

Интересное поведение. Выходит, что в момент отладки 1С накапливает нажатия на экране, а потом воспроизводит их. Вот такая магия.

Таким образом можно “накликать” всё что угодно. И калькулятор открыть, и сеанс завершить.

Давайте для тестирования добавим вторую кнопку и вынесем её на командную панель.

Скрин

А в обработчик добавим просто “Сообщить()”

Скрин

Поставим нашу точку останова на первой кнопке. Нажмём на первую кнопку. Теперь мы находимся на отладке. И будем “накликивать” вторую кнопку.

Скрин

И вот мы видим, что и вторая кнопка тоже сработала:

Скрин

Выполняются любые кнопки в любых комбинациях. И независимо от того, действие находится на клиенте или на сервере.

Работает и так:

Скрин

И так:

Скрин

Но и у этой “особенности” платформы есть ещё одна “особенность”.

Для наглядности сделаем набор команд и вынесем их в виде кнопочек таким образом:

Скрин

Напишем код. Теперь, когда мы нажимаем на Тестирование, кнопочки будут раскрашены в одинаковый цвет (Аквамарин). А когда вы нажимаете на конкретную кнопку, то она окрашивается в другой (Красный).

Скрин

Скрин

Теперь сделаем один прогон, чтобы все кнопки окрасились, а после уже поймаем код точкой останова.

Наша задача - в момент “ожидания” сеанса на отладке, нажимать на кнопочки.

Как мы видим на записи, они красятся в красный:

Скрин

А теперь давайте вызовем “особенность” нашей “особенности”. Для этого повторим наши действия.

Скрин

Как видите, ничего не произошло. Кнопки не покрасили в красный. А значит и код не выполнялся. Но почему?

Дело в том, что обычно, когда 1С останавливается на точке останова, разработчик переходит в конфигуратор. Т.е. он позиционируется на окне конфигуратора.

Но мы сейчас находимся с разделённым экраном. И во все разы до текущему момента мы после нажатия на кнопку “Тестирование” переводили курсор на окно конфигуратора.

Но сейчас (на последней анимации) этого не происходило. Мы просто нажали кнопку “Тестирование” и сразу “накликивали” действия”.

Теперь проведём такой эксперимент. Накликаем сначала часть кнопок сразу же после нажатия “Тестирование” (без перехода на конфигуратор), а потом переведём курсор на конфигуратор и накликаем другие кнопки.

Скрин

На анимации видно, что покрасились в результате только те кнопки, которые были нажаты после перевода курсора на конфигуратор.

Что это такое?

Хотелось бы узнать =)

Это “особенность” платформы. Выходит, что в момент отладки, если вы будете нажимать на “ожидающий” сеанс, то 1С “запомнит” все ваши нажатия на экран, а после выхода из отладки повторит их.

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

Эта статья была рождена как следствие того, что однажды мы с коллегами пытались понять, почему наша очень сложна обработка иногда совершает несколько проходов. О причинах никто не догадывался, пока не заметил, что это происходило только во время отладки. Просто разработчик иногда случайно тыкал на кнопку второй раз. Этот “тык” в экран запоминался платформой, а после выхода из отладки - воспроизводился. И отладка могла занимать долгое время. Совсем удивительно было видеть, как после десяти минут отладки в процедуре от “самого начала” и “до конца”, мы почему-то попадает в неё снова.

Если у вас есть объяснения (может это вообще какой-то известный “феномен”), то пишите в комментариях. А так же присылайте своих “Полтергейстов 1С”. Возможно, благодаря вашей наводке, и по ним будет пятничная статья =)

Авторский пост защищен лицензией CC BY 4.0 .