Почему медленно отображаются данные в управляемом приложении 1С и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Анализ проблемы: почему вывод данных занимает много времени

Выясним, почему в обычном приложении или при прямом выполнении SQL-запроса данные отображаются быстро, а в тонком клиенте управляемого приложения возникают задержки при обработке сотен тысяч строк:

  1. Получение представлений ссылочных типов. Когда запрос возвращает поле ссылочного типа (например, Ссылка), тонкий клиент должен отобразить понятное пользователю текстовое представление элемента. Если эти представления отсутствуют в локальном кэше клиента, платформа вынуждена выполнять множественные дополнительные обращения к серверу для получения текста каждой ссылки. В результате выборка из 100 000 элементов может спровоцировать сотни тысяч сервисных запросов.
  2. Сериализация и передача контекста. В управляемом приложении элементы таблицы формы хранятся в объекте ДанныеФормыКоллекция. При выгрузке таблицы значений на форму весь массив данных полностью сериализуется на сервере, передается по сети и десериализуется на стороне клиента.
  3. Нагрузка на графический движок клиента. Тонкий клиент тратит основной объем времени не на выполнение запроса в СУБД, а на генерацию ячеек интерфейса, вычисление высоты строк и стилей для всех переданных записей одновременно.

Способы оптимизации отображения данных

Рассмотрим основные методы, которые позволяют избавиться от задержек при выводе больших массивов информации.

1. Выборка примитивных типов в запросе

Если данные выводятся в таблицу формы или консоль только для чтения и анализа, не следует выбирать поля ссылочного типа. Заменяем выборку ссылки на выборку реквизитов примитивных типов (Наименование, Код) или явно применяем функцию ПРЕДСТАВЛЕНИЕ().

Сравним два варианта запроса:


// Неоптимальный вариант (вызывает кэширование и дозапросы представлений):
ВЫБРАТЬ
	Номенклатура.Ссылка КАК Ссылка
ИЗ
	Справочник.Номенклатура КАК Номенклатура

// Оптимальный вариант (выбираются только примитивные типы):
ВЫБРАТЬ
	Номенклатура.Код КАК Код,
	Номенклатура.Наименование КАК Наименование
ИЗ
	Справочник.Номенклатура КАК Номенклатура

2. Использование объекта «Динамический список»

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

3. Вывод результатов в табличный документ

Если результат запроса формируется для просмотра или печати, целесообразно выводить данные в ТабличныйДокумент. Отрисовка ячеек табличного документа платформой 1С оптимизирована значительно лучше, чем генерация интерактивных строк таблицы формы.

4. Обработка данных на стороне сервера

Если таблица значений требуется для проведения расчетов или групповой обработки, переносим всю работу с массивом на сервер. Данные не должны передаваться на клиентский процесс. Для этого используем серверные процедуры, предпочтительно с директивой &НаСервереБезКонтекста, а пользователю возвращаем только итоговое сообщение или результат выполнения операции.

← На главную