Множественные клики [Полтергейсты 1С]

25.09.20

Разработка - Механизмы платформы 1С

Что будет, если нажимать на кнопки в Предприятии в момент выполнения кода? А если в отладке? Оказывается, 1С в отладке в ожидании запоминает нажатые кнопки, а потом выполняет их поочерёдно...

Всем привет!

И пока на стадии монтажа находится видео про запуск своего сервиса регистрации ошибок 1С, открываем новую рубрику "Полтергейсты 1С".

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

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

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

 

 

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

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

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

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

А = "";

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

КонецЦикла;

 

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

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

А = "";

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

КонецЦикла;

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

 

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

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

 

 

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

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

 

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

 

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

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

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

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

 

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

 

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

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

 

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

 

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

 

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

 

 

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

 

 

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

 

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

 

И так:

 

 

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

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

 

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

 

 

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

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

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

 

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

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

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

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

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

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

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

 

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

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

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

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

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

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

 

Понравилась статья?

Не будьте равнодушными! Поставьте лайк плюс, оставьте комментарий.

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

И переходите к другим публикациям:

отладка ошибки особенность баг полтергейсты

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4547    dsdred    53    

72

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5298    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6412    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18480    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12094    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8831    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

20.08.2023    6283    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15989    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1448 25.09.20 11:05 Сейчас в теме
Интересная штука, буду знать, спасибо!
jaroslav.h; +1 Ответить
2. temdj 13 30.09.20 08:24 Сейчас в теме
Неосознанно пользовался этим...
3. nvv1970 18.10.20 14:23 Сейчас в теме
Приходилось реализовывать блокировку повторного нажатия. Поэтому обратил внимание на статью.
Можно через асинхронную блокировку кнопки (пользователям наглядно), можно через допфлаги обрабатывать логику.

Фича в конце видео у меня не воспроизводится. Повторное нажатие срабатывает ВСЕГДА!) Win10/1c17
4. SeiOkami 3423 18.10.20 14:40 Сейчас в теме
(3)


Фича в конце видео у меня не воспроизводится

Интересно, а вы пробовали так же с разделенным экраном?
5. nvv1970 18.10.20 15:11 Сейчас в теме
(4) Да. Без разницы: просто расположенные рядом окна или разделенный в виндовс экран - поведение одинаковое, "нажимается всегда". Паузы организовывал по разному: отладкой, паузой в коде на первой кнопке.

Это же не фишка 1С. Это поведение ОС, которая буферизирует действия. Поэтому вполне может быть, что обнаруженная вами фича - это баг сборки ОС, который предположим уже исправили (у меня WINVER 19041.572) или баг отдельного инстанса ОС ))
6. rpgshnik 3633 22.03.21 04:26 Сейчас в теме
Оставьте свое сообщение