Как реализовать анимацию ожидания выполнения в файловом варианте информационной базы 1С

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

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

Причина «зависания» интерфейса в файловом режиме

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

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

Решение 1: Использование фоновых заданий и Библиотеки стандартных подсистем (БСП)

Рассмотрим самый надежный и современный способ — использование подсистемы ДлительныеОперации из состава БСП. Этот механизм уже содержит все необходимые «костыли» для работы в файловом режиме. Проанализируем алгоритм его работы:

  1. Программа запускает вычисления в фоновом задании.
  2. В файловом режиме 1С автоматически открывает дополнительный сеанс (поток) для выполнения этого задания.
  3. Основное окно открывает специальную форму ожидания с анимацией.
  4. Основной поток периодически «просыпается» (через обработчик ожидания), чтобы проверить, не завершилось ли задание.

Посмотрим на пример программного кода для запуска такой операции:


ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияПроцедуры(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = "Обработка тяжелых данных";

РезультатЗапуска = ДлительныеОперации.ВыполнитьВФоне("МойОбщийМодуль.ВыполнитьРасчет", ПараметрыРасчета, ПараметрыВыполнения);

Если РезультатЗапуска.Статус = "Выполняется" Тогда
    ПараметрыОжидания = ДлительныеОперации.ПараметрыОжидания(ЭтотОбъект);
    ПараметрыОжидания.ТекстСообщения = "Пожалуйста, подождите, идет расчет...";
    ДлительныеОперации.ПоказатьФормуОжидания(ЭтотОбъект, РезультатЗапуска.ИдентификаторЗадания, ПараметрыОжидания);
КонецЕсли;

Важно: В файловом режиме для корректной работы фоновых заданий необходимо, чтобы в базе был настроен интервал проверки заданий. При использовании БСП форма ожидания сама инициирует проверку, что позволяет анимации (например, картинке GIF) двигаться плавно.

Решение 2: Использование HTML-поля для анимации

Если стандартные декорации формы (картинки) всё же подтормаживают, разберем более гибкий метод — использование Поля HTML-документа. Современные платформы 1С отрисовывают HTML-контент в отдельном процессе браузера (особенно в веб-клиенте или при использовании WebKit).

Рассмотрим по шагам, как это реализовать:

  1. Разместим на форме элемент типа Поле HTML-документа.
  2. Подготовим строку с простым HTML-кодом, содержащим анимированный SVG или CSS-spinner.
  3. При начале длительной операции сделаем поле видимым и загрузим в него код.

Пример кода для инициализации анимации:


Текст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С.

Решение 3: Разрезание задачи на части через Обработчик Ожидания

Если по каким-то причинам вы не можете использовать фоновые задания, проанализируем ситуацию с разделением алгоритма. Вместо одного цикла на 10 000 итераций, мы можем выполнять по 100 итераций и возвращать управление системе.

Выясним, как это работает на практике:

  1. Создадим переменную модуля формы для хранения текущего прогресса.
  2. Используем метод ПодключитьОбработчикОжидания("ВыполнитьЭтапРасчета", 0.1, Истина).
  3. В процедуре ВыполнитьЭтапРасчета выполним часть работы, обновим индикатор на форме и снова подключим обработчик для следующей порции данных.

Этот подход позволяет интерфейсу «продышаться» между порциями вычислений. В эти короткие паузы платформа успевает перерисовать анимированную картинку (декорацию GIF), создавая иллюзию непрерывной работы.

Особенности файлового режима через веб-сервер

Интересный нюанс: если ваша файловая база опубликована на веб-сервере (Apache или IIS), работа фоновых заданий ложится на плечи расширения веб-сервера. В этом случае клиентское приложение (браузер или тонкий клиент) работает максимально стабильно, так как оно полностью отделено от вычислительного движка «файловой» базы. В такой конфигурации анимация ожидания работает практически так же идеально, как в серверном варианте.

Подведем итоги

Для реализации качественной анимации в файловом варианте мы рекомендуем:

Используя эти методы, мы обеспечим профессиональный вид нашего приложения и исключим пугающие пользователя сообщения «Программа не отвечает».

← На главную