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

21.04.21

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

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

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

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

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

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

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

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

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

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


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


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

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

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

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

См. также

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

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

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

1 стартмани

18.03.2024    2670    0    John_d    8    

54

GUID в 1С 8.3 - как с ними быть

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

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

12.02.2024    4610    atdonya    22    

45

Переоткрытие внешних обработок

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

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

30.11.2023    3961    ke.92@mail.ru    16    

61

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

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

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

28.08.2023    8824    YA_418728146    6    

141

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

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

2 стартмани

22.08.2023    2076    21    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 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    16147    133    sapervodichka    112    

129

Система контроля ведения учета [БСП]

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

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7243    quazare    8    

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

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

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

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