При разработке сложных отчетов или интерактивных обработок в среде 1С:Предприятие 8.3 на управляемых формах программисты часто сталкиваются с проблемой «замирания» интерфейса. Когда мы запускаем длительный цикл заполнения объекта ТабличныйДокумент, пользователь видит пустой экран или песочные часы до самого момента завершения процедуры. В этой статье мы подробно разберем, как обойти ограничение однопоточности графического интерфейса и заставить 1С отображать результат работы «на лету».
Прежде всего, проанализируем ситуацию с точки зрения платформы. В управляемом приложении выполнение программного кода на языке 1С и отрисовка элементов формы происходят в одном и том же потоке. Когда запускается процедура, управление передается интерпретатору кода, и пока процедура не завершится (достигнув КонецПроцедуры), платформа не может вернуться к задачам перерисовки графических элементов. Именно поэтому любые изменения свойств ТабличныйДокумент внутри обычного цикла Для ... Цикл становятся видимыми только в финале.
Многие разработчики пытаются использовать метод ОбновитьОтображениеДанных(), но важно понимать: этот метод лишь выставляет флаг необходимости перерисовки, а сама перерисовка физически произойдет только тогда, когда управление будет возвращено операционной системе.
Самый эффективный и штатный способ добиться «оживления» интерфейса — это использование метода ПодключитьОбработчикОжидания. Идея заключается в том, чтобы разбить процесс заполнения табличного документа на маленькие порции и вызывать их последовательно, давая платформе короткие паузы для обновления экрана.
Рассмотрим по шагам, как это реализовать. Нам понадобятся переменные модуля формы для хранения состояния процесса (счетчика итераций и данных).
&НаКлиенте
Перем чСчетчик; // Хранит текущий шаг выполнения
Перем мсРезультат; // Массив или структура с данными для вывода
&НаКлиенте
Процедура ВыполнитьВыводДанныхПоэтапно()
// Инициализируем начальные значения
мсРезультат = Новый Массив(); // Здесь могут быть ваши данные
чСчетчик = 1;
// Подключаем обработчик.
// Интервал 0.1 секунды — минимально допустимый для плавности.
ПодключитьОбработчикОжидания("ОбработчикВыводаСледующейПорции", 0.1);
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикВыводаСледующейПорции()
// Логика вывода одной порции данных
Если чСчетчик <= 10 Тогда
ВывестиЧастьТабДока(чСчетчик); // Вызов серверной или клиентской функции отрисовки
чСчетчик = чСчетчик + 1;
Иначе
// Обязательно отключаем обработчик, когда работа завершена
ОтключитьОбработчикОжидания("ОбработчикВыводаСледующейПорции");
Сообщить("Вывод данных завершен успешно!");
КонецЕсли;
КонецПроцедуры
В этом примере 1С после вывода каждой «порции» данных на 0.1 секунды возвращает управление системе, интерфейс успевает перерисовать ТабличныйДокумент, и пользователь видит прогресс заполнения в реальном времени. Это создает тот самый «ВАУ-эффект» анимации или живого отчета.
Если ваша задача — не просто заполнить таблицу данными, а создать графическую анимацию (линии, графики, точки), то использование ТабличныйДокумент может быть избыточным и медленным. Платформа 1С, начиная с версии 8.3.15, отлично поддерживает формат SVG (Scalable Vector Graphics).
Проанализируем ситуацию: отрисовка сотен ячеек в таблице заставляет систему каждый раз пересчитывать сетку документа. SVG же работает как обычная картинка, описание которой состоит из текстовых координат. Разберем алгоритм работы с SVG:
line, circle, rect).Строка.Поле картинки.ПодключитьОбработчикОжидания, каждый раз обновляя текст SVG-строки.Этот метод работает значительно быстрее, так как платформа оптимизирована под рендеринг векторной графики в полях картинок.
Чтобы анимация или поэтапный вывод в ТабличныйДокумент не тормозили, следует придерживаться нескольких правил:
АвтоВысотаСтроки, платформа при каждом добавлении данных будет пересчитывать геометрию всего документа. Установите фиксированную высоту.ЦветФона) в цикле, заранее подготовьте макет с нужным оформлением. Используйте метод ПолучитьОбласть() и Вывести().&НаСервере.Для действительно больших объемов данных (когда формирование одной порции занимает более 1-2 секунд) рекомендуется использовать механизм длительных операций. Схема работы выглядит следующим образом:
Рассмотрим ситуацию, когда сервер готовит тяжелый отчет. Мы запускаем фоновое задание, которое записывает промежуточные результаты во временное хранилище или в специальный регистр сведений. Клиентское приложение по обработчику ожидания «опрашивает» сервер: «Есть ли новые строки?». Если есть — забирает их и добавляет в ТабличныйДокумент на форме методом Вывести(). Это позволяет пользователю работать с уже загруженной частью отчета, пока остальные данные еще обрабатываются на сервере.
Таким образом, мы выяснили, что «на лету» отображать данные в 1С можно только через разрыв линейного выполнения кода. Использование ПодключитьОбработчикОжидания в сочетании с грамотной оптимизацией свойств ТабличныйДокумент позволяет создавать интерактивные и визуально приятные интерфейсы, которые повышают лояльность пользователей к программному продукту.