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

21.04.21

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

См. также

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

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

21.05.2024    20118    dimanich70    81    

144

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

18.03.2024    4091    3    John_d    11    

57

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

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

12.02.2024    18051    atdonya    24    

56

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    5501    ke.92@mail.ru    16    

65

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

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

28.08.2023    14729    YA_418728146    7    

166

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3579    56    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18478    171    sapervodichka    112    

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

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


В запросе условие
 |ГДЕ
|	КонтактнаяИнформация.Объект В (&СсылкиМассив )
2. Vlad_CK 30 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 4790 12.04.21 16:29 Сейчас в теме
Да уж... "Открытие" из серии 2х2=4. Автор, вы б хоть указывали, обычные это формы или управляемые, динамический список в виду имеется или простой... И вам совершенно правильно показали, как на самом деле надо.
4. Vlad_CK 30 13.04.21 00:17 Сейчас в теме
В данной статье не описивается какие запросы в процедуре ПриПолученииДанных - это давно описано другими авторами! В ней описан метод как вызывать запрос в ПриПолученииДанных только раз за время всего поиска по списку.
5. tormozit 7229 13.04.21 18:41 Сейчас в теме
В таком решении пользователь не сможет найти значение, которое попадает в ячейки колонки кодом обработчиков ПриПолученииДанных и ПриВыводеСтроки. В остальном - полезный прием.
6. Vlad_CK 30 13.04.21 21:42 Сейчас в теме
(5) Извиняюсь, не понял коментарий. Подробнее можно?
7. tormozit 7229 14.04.21 08:25 Сейчас в теме
(6) Поиск значения можно применять к колонке табличного поля, куда значения выводятся в обработчиках ПриВыводеСтроки/ПриПолученииДанных.
8. Vlad_CK 30 14.04.21 10:24 Сейчас в теме
(7) Ага! Понял, я об этом не задумывался.... Но в большинстве случаев такие колонки создаются чисто как информационные, или пиктограммки (на сколько оплачен/отгружен заказ) - по ним точно искать никто не будет.

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

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

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