При работе в клиент-серверном варианте 1С:Предприятие пользователи привыкли к плавной анимации ожидания (например, вращающемуся кольцу или индикатору), которая сообщает, что система выполняет сложную операцию. Однако в файловом варианте разработчики часто сталкиваются с проблемой: при запуске тяжелого алгоритма интерфейс программы полностью «замирает», и никакая анимация не отображается до завершения процесса. Разберем подробно, как обойти это ограничение и сделать работу пользователя комфортной даже в файловом режиме.
Для начала проанализируем ситуацию и выясним причину такого поведения. В файловой базе данных по умолчанию всё выполняется в одном потоке клиентского приложения. Если мы запускаем процедуру расчета непосредственно в коде формы, этот поток полностью поглощается вычислениями. В итоге у системы не остается ресурсов на отрисовку графических изменений, и пользователь видит статичное «зависшее» окно.
Чтобы реализовать анимацию, нам необходимо освободить основной поток интерфейса. Это достигается путем выноса вычислений в фоновое задание или использования асинхронных механизмов платформы.
Рассмотрим самый надежный и современный способ — использование подсистемы ДлительныеОперации из состава БСП. Этот механизм уже содержит все необходимые «костыли» для работы в файловом режиме. Проанализируем алгоритм его работы:
Посмотрим на пример программного кода для запуска такой операции:
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Обработка тяжелых данных";
РезультатЗапуска = ДлительныеОперации.ВыполнитьВФоне("МойОбщийМодуль.ВыполнитьРасчет", ПараметрыРасчета, ПараметрыВыполнения);
Если РезультатЗапуска.Статус = "Выполняется" Тогда
ПараметрыОжидания = ДлительныеОперации.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ТекстСообщения = "Пожалуйста, подождите, идет расчет...";
ДлительныеОперации.ПоказатьФормуОжидания(ЭтотОбъект, РезультатЗапуска.ИдентификаторЗадания, ПараметрыОжидания);
КонецЕсли;
Важно: В файловом режиме для корректной работы фоновых заданий необходимо, чтобы в базе был настроен интервал проверки заданий. При использовании БСП форма ожидания сама инициирует проверку, что позволяет анимации (например, картинке GIF) двигаться плавно.
Если стандартные декорации формы (картинки) всё же подтормаживают, разберем более гибкий метод — использование Поля HTML-документа. Современные платформы 1С отрисовывают HTML-контент в отдельном процессе браузера (особенно в веб-клиенте или при использовании WebKit).
Рассмотрим по шагам, как это реализовать:
Поле HTML-документа.SVG или CSS-spinner.Пример кода для инициализации анимации:
ТекстHTML =
"<html>
|<body style='overflow:hidden; background-color: #F0F0F0;'>
|<div class='loader'></div>
|<style>
| .loader { border: 8px solid #f3f3f3; border-top: 8px solid #3498db;
| border-radius: 50%; width: 50px; height: 50px; animation: spin 2s linear infinite; }
| @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
|</style>
|</body>
|</html>";
Элементы.ПолеИндикатор.УстановитьТекст(ТекстHTML);
Такая анимация часто продолжает двигаться даже в те моменты, когда основной поток 1С занят интенсивными дисковыми операциями, так как рендеринг HTML-поля частично вынесен за пределы основного цикла выполнения кода 1С.
Если по каким-то причинам вы не можете использовать фоновые задания, проанализируем ситуацию с разделением алгоритма. Вместо одного цикла на 10 000 итераций, мы можем выполнять по 100 итераций и возвращать управление системе.
Выясним, как это работает на практике:
ПодключитьОбработчикОжидания("ВыполнитьЭтапРасчета", 0.1, Истина).ВыполнитьЭтапРасчета выполним часть работы, обновим индикатор на форме и снова подключим обработчик для следующей порции данных.Этот подход позволяет интерфейсу «продышаться» между порциями вычислений. В эти короткие паузы платформа успевает перерисовать анимированную картинку (декорацию GIF), создавая иллюзию непрерывной работы.
Интересный нюанс: если ваша файловая база опубликована на веб-сервере (Apache или IIS), работа фоновых заданий ложится на плечи расширения веб-сервера. В этом случае клиентское приложение (браузер или тонкий клиент) работает максимально стабильно, так как оно полностью отделено от вычислительного движка «файловой» базы. В такой конфигурации анимация ожидания работает практически так же идеально, как в серверном варианте.
Для реализации качественной анимации в файловом варианте мы рекомендуем:
ДлительныеОперации), так как они автоматически учитывают специфику файлового и серверного режимов.Используя эти методы, мы обеспечим профессиональный вид нашего приложения и исключим пугающие пользователя сообщения «Программа не отвечает».