Рассмотрим распространенную ситуативную проблему: запрос к базе данных выполняется практически мгновенно (менее одной секунды), однако вывод полученного результата в интерфейсе управляемого приложения (например, в консоли запросов или в таблице формы) занимает 15 секунд и более. Проанализируем причины такого поведения платформы 1С и разберем практические способы ускорения отображения больших объемов данных.
Выясним, почему в обычном приложении или при прямом выполнении SQL-запроса данные отображаются быстро, а в тонком клиенте управляемого приложения возникают задержки при обработке сотен тысяч строк:
Ссылка), тонкий клиент должен отобразить понятное пользователю текстовое представление элемента. Если эти представления отсутствуют в локальном кэше клиента, платформа вынуждена выполнять множественные дополнительные обращения к серверу для получения текста каждой ссылки. В результате выборка из 100 000 элементов может спровоцировать сотни тысяч сервисных запросов.ДанныеФормыКоллекция. При выгрузке таблицы значений на форму весь массив данных полностью сериализуется на сервере, передается по сети и десериализуется на стороне клиента.Рассмотрим основные методы, которые позволяют избавиться от задержек при выводе больших массивов информации.
Если данные выводятся в таблицу формы или консоль только для чтения и анализа, не следует выбирать поля ссылочного типа. Заменяем выборку ссылки на выборку реквизитов примитивных типов (Наименование, Код) или явно применяем функцию ПРЕДСТАВЛЕНИЕ().
Сравним два варианта запроса:
// Неоптимальный вариант (вызывает кэширование и дозапросы представлений):
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
// Оптимальный вариант (выбираются только примитивные типы):
ВЫБРАТЬ
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
Для интерактивного просмотра больших списков в управляемых формах следует использовать объект ДинамическийСписок. В отличие от элемента управления, связанного с реквизитом ТаблицаЗначений, динамический список считывает из базы данных и отрисовывает на клиенте только ту порцию записей, которая видна на экране (порциями по 20–45 строк), и подгружает следующие данные по мере прокрутки.
Если результат запроса формируется для просмотра или печати, целесообразно выводить данные в ТабличныйДокумент. Отрисовка ячеек табличного документа платформой 1С оптимизирована значительно лучше, чем генерация интерактивных строк таблицы формы.
Если таблица значений требуется для проведения расчетов или групповой обработки, переносим всю работу с массивом на сервер. Данные не должны передаваться на клиентский процесс. Для этого используем серверные процедуры, предпочтительно с директивой &НаСервереБезКонтекста, а пользователю возвращаем только итоговое сообщение или результат выполнения операции.