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

21.04.21

Разработка - Универсальные функции

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

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

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

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

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

Перем СтопЗапрос

    //Изначальный
    //код
    //модуля
    //формы

Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    Если СтопЗапрос Тогда
        Возврат;
    КонецЕсли;

    //Запросы к данным
    //Заполнение ячеек
    //Раскраска ячеек


    СтопЗапрос = Истина;
    
КонецПроцедуры


Процедура ОбновлениеОтображения()
    СтопЗапрос = Ложь;
    ЭтаФорма.Обновить();
КонецПроцедуры

СтопЗапрос = Истина;

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

Вступайте в нашу телеграмм-группу Инфостарт

ПриПолученииДанных тормоза "обычные_формы"

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    3487    Abysswalker    8    

45

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    6445    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    48976    dimanich70    83    

170

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7333    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    61255    atdonya    31    

69

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

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

30.11.2023    9132    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. t278 61 09.04.21 02:37 Сейчас в теме
Давно нашёл этот способ решения. Автор верно расписал.
https://infostart.ru/1c/articles/81415/

От себя добавлю. В запрос делаю не по одной строке, а сразу по многим.
Соответствие = Новый Соответствие;
	СсылкиМассив = Новый Массив;
	Для каждого ТекСтрока из ОформленияСтрок Цикл	   
		Если Не ТекСтрока.ДанныеСтроки.ЭтоГруппа Тогда   
			СсылкиМассив.Добавить(ТекСтрока.ДанныеСтроки.Ссылка);			
		КонецЕсли;		
	КонецЦикла;


В запросе условие
 |ГДЕ
|	КонтактнаяИнформация.Объект В (&СсылкиМассив )
2. Vlad_CK 33 09.04.21 08:17 Сейчас в теме
(1) Совершенно верно.... Сам пользуюсь советом автора https://infostart.ru/1c/articles/81415/ Но, когда, пользователи начали делать поиск в не ограниченом (периодом) списке документов - я был в шоке. Пришлось искать срочно решение.
10. TVA_11 21.07.23 08:36 Сейчас в теме
(2)

УТ 10.3 на 50 человек раз, два раза в месяц возникает вечный цикл и ест ресурсы сервера до 10% на сеанс.
ПриПолученииДанных и ПриВыводеСтроки

Пользователи ничего не делают, если начинают работать цикл пропадает.
Отлавливается через Подключение.

Пробую ваш метод через переменную, очевидно бегать продолжит, но без Запросов.
Возможно сервер не будет нагружен.
11. TVA_11 21.07.23 09:42 Сейчас в теме
(10)

Процедура ОбновлениеОтображения()
	
	Если СтопЗапрос Тогда
		 СтопЗапрос = ложь;
	иначе
		ЭтаФорма.Обновить();	
	КонецЕсли;
    
КонецПроцедуры
Показать


Доработал таким путем, иначе так же вечный цикл выходит.
3. Yashazz 4891 12.04.21 16:29 Сейчас в теме
Да уж... "Открытие" из серии 2х2=4. Автор, вы б хоть указывали, обычные это формы или управляемые, динамический список в виду имеется или простой... И вам совершенно правильно показали, как на самом деле надо.
4. Vlad_CK 33 13.04.21 00:17 Сейчас в теме
В данной статье не описивается какие запросы в процедуре ПриПолученииДанных - это давно описано другими авторами! В ней описан метод как вызывать запрос в ПриПолученииДанных только раз за время всего поиска по списку.
5. tormozit 7329 13.04.21 18:41 Сейчас в теме
В таком решении пользователь не сможет найти значение, которое попадает в ячейки колонки кодом обработчиков ПриПолученииДанных и ПриВыводеСтроки. В остальном - полезный прием.
6. Vlad_CK 33 13.04.21 21:42 Сейчас в теме
(5) Извиняюсь, не понял коментарий. Подробнее можно?
7. tormozit 7329 14.04.21 08:25 Сейчас в теме
(6) Поиск значения можно применять к колонке табличного поля, куда значения выводятся в обработчиках ПриВыводеСтроки/ПриПолученииДанных.
8. Vlad_CK 33 14.04.21 10:24 Сейчас в теме
(7) Ага! Понял, я об этом не задумывался.... Но в большинстве случаев такие колонки создаются чисто как информационные, или пиктограммки (на сколько оплачен/отгружен заказ) - по ним точно искать никто не будет.

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

И разве поиск по таким колонкам в стандартном режиме будет работать, если я оформляю ячейку типа так:
			ОформлениеСтроки.Ячейки.СерЭД.УстановитьТекст(ОформлениеСтроки.ДанныеСтроки.Контрагент.СервисЭД.Наименование);

?
9. tormozit 7329 16.06.21 18:11 Сейчас в теме
(8) Будет. За этим платформа и получает оформление всех строк списка через эти события.
Pavl0; Vlad_CK; +2 Ответить
Для отправки сообщения требуется регистрация/авторизация