Почему зависает 1С при передаче большой таблицы с сервера на клиент и как это исправить?

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

Часто разработчики 1С сталкиваются с ситуацией, когда серверный код отрабатывает мгновенно, но при возврате управления на клиент интерфейс программы «замерзает» на 20-30 секунд. Разберем типичный сценарий: есть обработка с табличной частью, в которую запросом загружаются данные.


РезТЗ = Запрос.Выполнить().Выгрузить();
Объект.ТЗДанные.Загрузить(РезТЗ); // на сервере занимает 1-2 секунды

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

Основные причины зависания при возврате на клиент

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

  1. Сериализация тяжелых типов данных: При передаче таблицы платформа упаковывает данные на сервере и распаковывает на клиенте. Передача тяжелых ссылочных типов (например, СправочникСсылка или ДокументСсылка) требует отправки множества внутренних метаданных и представлений. Это существенно увеличивает объем пакета данных.
  2. Влияние условного оформления: Если в таблице настроено условное оформление (выделение цветом, изменение шрифтов), платформа начинает синхронно обходить все загруженные строки (например, 5000+ штук) для вычисления правил. Сложные правила заставляют интерфейс «намертво» виснуть.
  3. Раздувание контекста формы: Загружая огромный массив строк напрямую в реквизит формы, мы «минируем» дальнейшую работу. При каждом последующем контекстном вызове сервера вся коллекция ДанныеФормыКоллекция будет неявно летать с клиента на сервер и обратно.
  4. Рендеринг большого количества колонок: Создание элементов управления для огромной матрицы ячеек требует значительных ресурсов отрисовки на стороне клиента.
  5. Пересчет итогов: Если в табличной части включено отображение подвала и настроен автоматический расчет итогов, платформа синхронно пересчитает их для всех тысяч строк после загрузки.

Способы оптимизации и решения проблемы

Рассмотрим подробнее несколько подходов, которые помогут избежать зависаний и сделать работу пользователей комфортной.

1. Использование временного хранилища и пагинация

Если пользователю не нужны все 5000 строк единовременно, разберем по шагам логику частичной загрузки. Архитектурно правильнее держать основной массив данных в серверном кэше, а в интерфейс передавать только текущую страницу просмотра.

Посмотрим на пример использования ВременноеХранилище:


// На сервере сохраняем результат запроса в хранилище
АдресХранилища = ПоместитьВоВременноеХранилище(РезТЗ, УникальныйИдентификатор);

На клиенте мы можем забирать из хранилища только нужную порцию данных (например, по 100 строк), реализуя собственную пагинацию. Также, если необходимо делать контекстные вызовы на сервер, рекомендуется перед уходом на сервер очищать табличную часть, а по возвращении — снова заполнять её из кэша.

2. Оптимизация передаваемых типов данных

Посмотрим, как можно сократить объем передаваемой информации. Передавайте меньше «тяжелых» данных. Замените ссылки на их строковые представления, коды или УникальныйИдентификатор там, где не требуется интерактивный выбор.

Кодируйте значения. Например, если у вас есть колонка с перечислением, можно на сервере превратить Перечисление.ВидОперации.Покупка в простой символ "1" или число. Колонка типизируется строкой или числом, а на клиенте при необходимости расшифровывается. Это радикально ускоряет сериализацию.

3. Использование Динамического списка с Регистром сведений

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

Важно: Не забывайте очищать записи регистра после закрытия формы или завершения сеанса работы оператора.

4. Упрощение условного оформления и интерфейса

Оптимизируем визуальную часть. Перенесите логику раскраски в сам запрос. Пусть сервер вычисляет статус строки и возвращает простое число (индекс цвета). Упростите правила в самом условном оформлении формы.

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

Итоги

При работе с таблицами большого объема всегда избегайте прямой загрузки тысяч строк в контекст формы. Комбинируйте методы: переносите тяжелые расчеты условного оформления в запрос, избавляйтесь от лишних ссылочных типов, используйте временное хранилище и выдавайте данные пользователю порциями. Это обеспечит высокую отзывчивость интерфейса даже при работе с огромными массивами информации.

← На главную