Каталог решений - Предотвращение многократного вызова ПриПолученииДанных во время поиска в табличном поле в обычных формах

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

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

В наличии

Долго искал решение: как при выводе строк заполнить значениями колонки, которые созданы программно, чтобы, не было тормозов при стандартном поиске. И с минимальными изменениями (легко контролируемыми, при обновлении).

Категория:

Описание

За оформление ячеек отвечают две процедуры, которые реагируют на события табличного поля:
ПриВыводеСтроки и ПриПолученииДанных. Но первая из них вызывается столько раз сколько строк прорисовывается и выполняется после события ПриПолученииДанных. Вторая — выполняется всего раз при прокрутке табличного поля (на строку, на страницу, в начало/конец).

Но есть такое безобразие: если пользователь производит поиск по колонке то платформа ведет себя так, как будто во время поиска перелистываются все страницы для отображения на форме в списке, хотя этого фактически не происходит, пока не будет найдено искомое значение. И все это время происходят события ПриПолученииДанных и ПриВыводеСтроки, со всеми вытекающими негативными последствиями. То есть: срабатывает событие ПриПолученииДанных столько раз сколько типа_страниц перелисталось до искомой строки, и каждый раз после этого срабатывает событие ПриВыводеСтроки столько раз сколько типа_строк помещается в типа_страницу.

Но! Есть такое событие формы ОбновлениеОтображения. Вот оно-то и происходит каждый раз когда на форме что-то реально меняется. И есть метод формы Обновить().

ОбновлениеОтображения выполняется после того как будет найдено значение (или произойдет смещение поля на строку, на страницу, в начало/конец) и ТабличноеПоле обновится. Нам остается запретить запросы, заполнения и раскраски ячеек пока не произойдет изменение на форме. Затем разрешить и запросить обновить форму. После чего снова установить флаг запрета. Код из процедуры события ПриПолученииДанных выполнится всего один раз, как нам и надо было. Примерный код:

  Перем СтопЗапрос
  
      //Изначальный
      //код
      //модуля
      //формы
  
  Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
      Если СтопЗапрос Тогда
          Возврат;
      КонецЕсли;
  
      //Запросы к данным
      //Заполнение ячеек
      //Раскраска ячеек
  
  
      СтопЗапрос = Истина;
      
  КонецПроцедуры
  
  
  Процедура ОбновлениеОтображения()
      СтопЗапрос = Ложь;
      ЭтаФорма.Обновить();
  КонецПроцедуры
  
  СтопЗапрос = Истина;

P.S. в процедуре события ПриВыводеСтроки не стоит выполнять что-либо ресурсоемкое. Максимум раскраска строк или ячеек в зависимости от значения реквизитов Ссылки. И не использовать ее вообще, если предполагается использование процедуры события ПриПолученииДанных.

has been added to your cart:
Оформление заказа