Как ограничить частоту нажатия кнопки Обновить (F5) в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе эксплуатации высоконагруженных систем 1С часто возникает ситуация, когда пользователи (преднамеренно или с помощью стороннего ПО, например, автокликеров) начинают слишком часто обновлять формы списков. Каждое нажатие клавиши F5 инициирует новый запрос к базе данных. Если форма содержит сложный динамический список с множеством соединений, это создает колоссальную нагрузку на СУБД. Рассмотрим, как технически реализовать ограничение частоты обновлений, чтобы нажатие кнопки срабатывало, например, не чаще одного раза в 30 секунд.

Метод 1. Программная подмена стандартной команды обновления

Самый надежный способ в рамках платформы 1С:Предприятие 8.3 — это перехват стандартного действия. Платформа позволяет нам отключить стандартные кнопки командной панели и заменить их собственными с сохранением привычных горячих клавиш. Разберем этот процесс по шагам.

Шаг 1. Отключение стандартной команды

В конфигураторе откройте форму, в которой необходимо ограничить обновление. Перейдите к свойствам командной панели (или конкретного элемента ДинамическийСписок). В свойствах командной панели снимите галочку Автозаполнение, либо, если вы хотите сохранить остальные кнопки, найдите в составе команд стандартную кнопку Обновить и установите ей свойство Видимость в значение Ложь.

Шаг 2. Создание собственной команды

Создайте новую команду формы, назовите ее, например, ЛимитированноеОбновление. В свойствах команды в поле Сочетание клавиш укажите F5. Это заставит платформу при нажатии клавиши вызывать ваш программный код вместо стандартного механизма.

Шаг 3. Реализация логики проверки времени

Для реализации этого механизма нам потребуется хранить время последнего успешного обновления. Создадим переменную модуля формы ДатаПоследнегоОбновления. Проанализируем пример кода, который реализует проверку интервала в 30 секунд:


&НаКлиенте
Перем ДатаПоследнегоОбновления;

&НаКлиенте
Процедура ЛимитированноеОбновление(Команда)
    
    ТекущийМомент = ТекущаяДатаСеанса();
    ИнтервалБлокировки = 30; // интервал в секундах
    
    Если ЗначениеЗаполнено(ДатаПоследнегоОбновления) Тогда
        ПрошлоСекунд = ТекущийМомент - ДатаПоследнегоОбновления;
        
        Если ПрошлоСекунд < ИнтервалБлокировки Тогда
            ОсталосьЖдать = ИнтервалБлокировки - ПрошлоСекунд;
            ТекстПредупреждения = СтрШаблон("Обновление возможно через %1 сек.", Цел(ОсталосьЖдать));
            ПоказатьОповещениеПользователя("Ограничение частоты", , ТекстПредупреждения, БиблиотекаКартинок.Важное);
            Возврат;
        КонецЕсли;
    КонецЕсли;
    
    // Если проверка пройдена, обновляем данные
    ДатаПоследнегоОбновления = ТекущийМомент;
    Элементы.Список.Обновить(); 
    
КонецПроцедуры

В данном примере мы используем ТекущаяДатаСеанса(), чтобы избежать проблем с разницей часовых поясов между клиентом и сервером. Если пользователь попытается нажать F5 раньше времени, он получит всплывающее уведомление, а запрос к базе данных не будет отправлен.

Метод 2. Использование Системы взаимодействия для автоматического обновления

Часто пользователи жмут F5 не потому, что хотят нагрузить систему, а потому, что им критически важно видеть актуальные данные (например, статус заказа в CRM). Вместо того чтобы заставлять их вручную обновлять список, мы можем внедрить механизм оповещений. Рассмотрим ситуацию, когда сервер сам сообщает форме о необходимости обновиться.

Для этого используется СистемаВзаимодействия. Когда в базе данных происходит запись важного объекта, на сервере срабатывает код, отправляющий сообщение определенным пользователям или в канал обсуждения. На стороне клиента форма "подписывается" на это сообщение.

Разберем примерную схему работы:

  1. В модуле объекта (например, документа) в событии ПриЗаписи вызывается отправка сообщения через СистемаВзаимодействия.СоздатьСообщение().
  2. В форме списка в обработчике ПриОткрытии выполняется подключение обработчика оповещений.
  3. При поступлении сообщения форма вызывает метод Элементы.Список.Обновить() автоматически.

Этот подход полностью снимает потребность в использовании автокликеров, так как данные на экране обновляются в режиме реального времени (Push-уведомление).

Метод 3. Визуальная блокировка интерфейса ("Прозрачная заглушка")

Если программный перехват F5 по каким-то причинам неудобен, можно применить визуальный прием. Рассмотрим ситуацию, когда после нажатия кнопки обновления нам нужно физически запретить пользователю кликать по элементам формы.

Мы можем разместить на форме группу (вид — Обычная группа без отображения), которая будет наложена поверх списка. По умолчанию она скрыта. При нажатии "Обновить" мы делаем группу видимой и запускаем ПодключитьОбработчикОжидания, который через 30 секунд снова скроет эту панель. Пока панель активна, она перехватывает клики мышкой, работая как прозрачный щит.

Однако стоит учитывать, что этот метод не блокирует само нажатие клавиши F5 на клавиатуре, поэтому его лучше комбинировать с первым методом.

Метод 4. Оптимизация запросов динамического списка

Выясним причину, по которой пользователи вообще прибегают к массовому обновлению. Если ДинамическийСписок работает медленно, пользователь может нажимать F5 несколько раз, думая, что программа "зависла".

Проанализируем настройки списка:

Если запрос в списке содержит сложные вложенные запросы или соединения с виртуальными таблицами остатков без указания периодов, любое нажатие F5 становится "тяжелым" для сервера. Оптимизировав сам запрос, мы снизим критичность проблемы частого обновления.

Метод 5. Административные меры и мониторинг

Если пользователи используют автокликеры, это часто является нарушением регламента работы с информационной системой. Посмотрим на ситуацию со стороны системного администрирования. С помощью Технологического журнала (ТЖ) 1С можно настроить сбор событий DBMSSQL или SDBL. Проанализировав логи, можно вычислить конкретные учетные записи, которые генерируют аномальное количество запросов SELECT к одной и той же таблице в секунду.

В некоторых случаях эффективнее будет не блокировать кнопку в коде, а настроить на стороне СУБД (например, в MS SQL Server) Resource Governor, чтобы ограничить ресурсы для конкретных сессий, но это является крайней мерой и требует высокой квалификации администратора БД.

Резюме: Оптимальным решением является комбинация Метода 1 (программное ограничение в коде формы) и Метода 4 (оптимизация запроса). Это обеспечит комфортную работу добросовестным пользователям и защитит систему от избыточной нагрузки, создаваемой средствами автоматизации на стороне клиента.

← На главную