Событие обновления динамического списка на клиенте

29.01.26

Разработка - Работа с интерфейсом

Описание способа отловить событие обновления динамического списка в клиентском контексте.

Введение

Единственное событие элемента формы, привязанного к динамическому списку, которое позволяет поймать момент обновления данных в списке - это "ПриПолученииДанныхНаСервере". Но он должен иметь директиву "&НаСервереБезКонтекста". Есть способы передать в это событие данные формы, а вот наоборот - нет. Например: при каждом обновлении динамического списка мы хотим делать нечто с данными формы.

 

Решение

Текущий способ решения данной проблемы заключается в использовании свойства глобального контекста УведомленияКлиента, который был представлен в 26 платформе.

При открытии формы мы подписываемся на определенное уведомление, а в событии ПриПолученииДанныхНаСервере посылаем это самое уведомление, тем самым оповещая клиент о том, что динамический список был обновлен.

В качестве примера поставим задачу: показывать пользователю количество строк в динамическом списке. Ниже приведен код модуля формы списка.

 
 Модуль формы списка

 

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	// Сохраняем УникальныйИдентификатор для использования в СписокПриПолученииДанныхНаСервере()
	Список.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("УникальныйИдентификаторФормы", УникальныйИдентификатор);
	ДелаемНечто();
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ОписаниеОповещения = Новый ОписаниеОповещения("СписокПослеПолученияДанных", ЭтотОбъект);
	УведомленияКлиента.ПодключитьОбработчик(КлючУведомленияПослеПолученияДанных(УникальныйИдентификатор), ОписаниеОповещения);
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок

&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
	Адресаты = Новый Массив;
	Адресаты.Добавить(НомерСеансаИнформационнойБазы());
	КлючУведомления = КлючУведомленияПослеПолученияДанных(Настройки.ДополнительныеСвойства.УникальныйИдентификаторФормы);
	// Второй параметр обязательный и при передачи в него Неопределено уведомление не отправляется.
	// Поэтому заполняем его любым значением.
	УведомленияКлиента.ОтправитьУведомление(КлючУведомления, 1, Адресаты);
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиентеНаСервереБезКонтекста
Функция КлючУведомленияПослеПолученияДанных(УникальныйИдентификатор)
	// Сделаем ключ уведомления уникальным среди открытых форм пользвателя, 
	// что бы текущая форма не воздействовала на другую, в которой используется этот же метод.
	Возврат "СписокПослеПолученияДанных" + УникальныйИдентификатор;
КонецФункции

&НаКлиенте
Процедура СписокПослеПолученияДанных(Данные, ДополнительныеПараметры) Экспорт
	// Тут главное не делать ничего, что может спровоцировать обновление дин. списка.
	// Иначе получим бесконечный цикл.
	ДелаемНечто();
КонецПроцедуры

&НаСервере
Процедура ДелаемНечто()
	
	// Мы поймали событие обновления дин. списка, и нам доступен контекст. 
	// Что делать с этим дальше - на ваше усмотрение.
	// Код ниже исключительно для примера.
	Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
	Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки,,, Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	
	Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
	// КоличествоСтрок - это реквизит формы
	КоличествоСтрок = Результат.Количество();
	
КонецПроцедуры

#КонецОбласти

 

 

Итог

С помощью механизма уведомлений клиента мы добились, что клиентский код "узнает" о событии "ПриПолученииДанныхНаСервере".

Но важно понимать: это событие вызывается не только при изменении данных (смене отбора, добавлении элемента, сортировке), но и при обычном динамическом считывании. Иной единой точки входа, увы, нет.

Забавно: клиент сам инициирует обновление списка - через кнопку обновления, изменение параметров, запись объектов. Все это происходит на его стороне, сервер никогда не присылает на клиент команду "Надо обновить дин. список". Но при этом в платформе так и не появилось единого события, которое сообщало бы клиенту: "Список только что обновился".

На данный момент это единственное решение, которое мне удалось найти для обхода этой особенности платформы.

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

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

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

31720 руб.

27.03.2025    84939    60    42    

71

Работа с интерфейсом Рабочее место 1С:Предприятие 8 1C:Бухгалтерия 1С:Комплексная автоматизация 2.х Платные (руб)

Универсальный редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью рисовать на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). В комплект поставки включены Расширения для легкого подключения данного функционала в БК, УТ, КА и ERP. Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу. Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6100 руб.

16.01.2015    68709    46    60    

85

Работа с интерфейсом Программист 1С:Предприятие 8 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами (виджетами) в 1С.

5246 руб.

29.06.2020    25028    34    6    

53

Консолидация данных Работа с интерфейсом Программист Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)

Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.

6088 руб.

17.10.2025    2328    3    0    

2

Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)

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

36600 руб.

28.08.2025    8306    2    2    

6

Работа с интерфейсом Программист Стажер 1С:Предприятие 8 Бесплатно (free)

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

20.08.2024    50686    mrXoxot    44    

139

Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    26823    smielka    39    

117

Инструментарий разработчика Работа с интерфейсом Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

3 стартмани

10.04.2023    17731    182    acces969    31    

132
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. RustIG 1955 29.01.26 11:03 Сейчас в теме
"Делаем нечто" на сервере? с контекстом формы? параметр КоличествоСтрок не надо отдельно передавать на клиент?
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);

форма по идее сама вывела результат, а вы еще раз его выводите программно?

Распишите, пож-та, порядок вызова процедур и функций - кто первый , кто второй и т.д.
2. RustIG 1955 29.01.26 11:09 Сейчас в теме
https://its.1c.ru/db/v8std/content/558/hdoc

Поиск - это стандартная команда динамического списка? Если так, то ее можно обработать в обработчике команды - затем используем процедуру Оповестить(...) , далее в обработчике Оповещения формы динамического списка "делаем что нужно"....

ПС. Не тестил, но рассуждаю....
3. PowerBoy 3499 29.01.26 12:37 Сейчас в теме
(2) нет обработчика поиска
9. RustIG 1955 30.01.26 13:59 Сейчас в теме
(3) не знаете, есть где-нибудь описание всех событий стандартных команд и соот-их обработчиков? (в техдокументации , например)
4. aximo 2692 29.01.26 16:41 Сейчас в теме
Если это работает, наконец-то можно подсчитать сумму строк динамического списка без всяких ухищрений, которые бешено тормозили вывод
5. triviumfan 101 29.01.26 22:57 Сейчас в теме
За то, что откапал такое - спасибо, но вот где это применить и главное зачем - загадка.
6. krasnoshchekovpavel 264 30.01.26 00:53 Сейчас в теме
(5) откопал в процессе решения реально поставленной задачи, которая в данной статье перетекла в "пример"
7. gzharkoj 594 30.01.26 09:17 Сейчас в теме
(5) замена ПодключитьОбработчикОжидания()
8. Viktor_Ermakov 401 30.01.26 12:56 Сейчас в теме
(7)
ПодключитьОбработчикОжидания

А как бы Вы использовали обработчик ожидания в данном случае?
10. RustIG 1955 30.01.26 14:02 Сейчас в теме
(2) Протестил: для строки Поиска срабатывает обработчик ПриАктивизацииСтроки(), но не всегда (если одна и таже строка активируется, то не срабатывает), и поэтому неуниверсально его использовать ....
11. RustIG 1955 30.01.26 14:12 Сейчас в теме
(10) я бы для таких целей попробовал свое поле Поиска поместить на форму - чтобы однозначно отловить событие и иметь возможность управлять кодом в обработчике события... Тем более, речь идет о платформе 26, которая вышла не так давно (год назад)
12. RustIG 1955 30.01.26 14:26 Сейчас в теме
Видимо, так и надо делать - раз сами разработчики знают о проблеме и описали ее:

https://wonderland.v8.1c.ru/blog/otpravka-uvedomleniy-s-servera-v-klientskoe-prilozhenie/
Планируется в версии 8.3.26

В различных бизнес-сценариях требуется отправлять уведомления с сервера в клиентское приложение: уведомление об окончании формирования отчета, запрошенного клиентом, окончание сложных расчетов на сервере и т.п.

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


На форуме разработчиков - https://partners.v8.1c.ru/forum/message/2252743#m_2252743 - как будто не все просто с этим менеджером уведомлений. Еще разбираться надо....
gzharkoj; triviumfan; +2 Ответить
13. dhurricane 31.01.26 22:18 Сейчас в теме
Спасибо за идею. В качестве ремарки хотелось бы отметить слишком ресурсоемкий способ подсчета количества строк. Я бы предложил немного доработать его следующим образом:
&НаСервере
Процедура ПосчитатьКоличествоСтрокНаСервере()
	
	СхемаКомпоновки = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
	НастройкиКомпоновки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
	МакетКомпоновки = КомпоновщикМакета.Выполнить(
		СхемаКомпоновки,
		НастройкиКомпоновки,,,
		Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	
	НаборДанных = МакетКомпоновки.НаборыДанных[0];
	
	СхемаЗапроса = Новый СхемаЗапроса();
	СхемаЗапроса.РежимКомпоновкиДанных = Истина;
	СхемаЗапроса.УстановитьТекстЗапроса(НаборДанных.Запрос);
	
	ОператорСхемы = СхемаЗапроса.ПакетЗапросов[0].Операторы[0];
	ОператорСхемы.ВыбираемыеПоля.Очистить();
	ОператорСхемы.ВыбираемыеПоля.Добавить("КОЛИЧЕСТВО(*)");
	
	Запрос = Новый Запрос();
	Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
	Для каждого Параметр Из МакетКомпоновки.ЗначенияПараметров Цикл
		Запрос.УстановитьПараметр(Параметр.Имя, Параметр.Значение);
	КонецЦикла;
	
	Выборка = Запрос.Выполнить().Выбрать();
	Выборка.Следующий();
	
	КоличествоСтрок = Выборка[0];
	
КонецПроцедуры
Показать
VyacheslavShilov; RustIG; krasnoshchekovpavel; +3 Ответить
14. krasnoshchekovpavel 264 01.02.26 02:34 Сейчас в теме
(13) да, тащить все данные только ради количества строк избыточно, спасибо за оптимальный вариант
15. Vit aka proger 107 15.05.26 09:37 Сейчас в теме
Добрый день, очень крутая фишка, например можно выводить динамический список в планировщик.
Когда увидел просто испытал интелектуальный оргазм. Спасибо!
но есть проблема, если в результате отборов список полностью очищается
СписокПриПолученииДанныхНаСервере не срабатывает
Прикрепленные файлы:
krasnoshchekovpavel; +1 Ответить
16. krasnoshchekovpavel 264 16.05.26 00:05 Сейчас в теме
(15) Спасибо за информацию. Хоть это и очевидно (теперь) смотря на название события, но я об этом не знал
Для отправки сообщения требуется регистрация/авторизация