Разработка и Конфигурация · 10 мин
Как вывести строку состояния в 1С
Как вывести строку состояния в 1С: метод Состояние(), ПрогрессорИндикатора, примеры кода для обычных и управляемых форм, типичные ошибки и FAQ.
Строка состояния в 1С — это текстовое сообщение в нижней части окна программы, которое показывает пользователю, какая операция выполняется и на каком она этапе. Механизм особенно полезен в длительных обработках: загрузке данных из файлов, групповом перепроведении документов, формировании тяжёлых отчётов. Без индикации хода работы пользователь видит «зависшее» окно и часто прерывает процесс принудительно, что может привести к неполной загрузке данных или необходимости восстанавливать работу заново.
Для вывода строки состояния во встроенном языке 1С используется глобальный метод Состояние(). Он доступен на толстом и тонком клиенте и работает как в обычных, так и в управляемых формах. Метод принимает текст сообщения, необязательный процент выполнения и пояснение. Дополнительно существует объект ПрогрессорИндикатора и метод Индикатор, которые применяются в специфических сценариях.
Важно понимать ограничение: строка состояния обновляется только в клиентском контексте. Если длительный цикл выполняется в серверной процедуре, вызов Состояние() там недоступен, и индикацию нужно организовывать иначе — через разбиение работы на порции, фоновые задания с передачей промежуточных сообщений или обработчики ожидания.
Метод Состояние(): синтаксис и параметры
Базовый синтаксис метода выглядит так: Состояние(ТекстСообщения, Прогресс, Пояснение). Первый параметр — строка, которая отображается в строке состояния. Второй — число от 0 до 100, задающее процент выполнения; он влияет на индикатор прогресса рядом с текстом. Третий параметр — дополнительное пояснение, которое показывается вместе с сообщением.
Все параметры необязательны. Вызов Состояние("Загрузка данных...") просто выведет текст без индикатора. Вызов Состояние() без параметров очищает строку состояния — это обязательный завершающий шаг, иначе после окончания обработки на экране останется «висеть» последнее сообщение и вводить пользователя в заблуждение.
Метод не блокирует интерфейс и не прерывает выполнение кода — это чисто визуальная индикация. Ошибок при неверных параметрах он обычно не вызывает, поэтому проверять результат нужно глазами: запустить обработку и убедиться, что текст и процент меняются по мере работы.
Пример: индикация прогресса в цикле
Типовой сценарий — обход таблицы значений или результата запроса с показом процента выполнения. Процент вычисляется как отношение номера текущей итерации к общему количеству элементов, умноженное на 100.
&НаКлиенте
Процедура ЗагрузитьДанные(Команда)
ВсегоСтрок = ТаблицаДанных.Количество();
НомерСтроки = 0;
Для Каждого СтрокаТаблицы Из ТаблицаДанных Цикл
НомерСтроки = НомерСтроки + 1;
Процент = Окр(НомерСтроки / ВсегоСтрок * 100, 0);
Состояние("Обработка данных", Процент, "Строка " + НомерСтроки + " из " + ВсегоСтрок);
ОбработатьСтроку(СтрокаТаблицы);
КонецЦикла;
Состояние();
КонецПроцедуры
Обратите внимание на деление: чтобы результат был дробным, а не целочисленным с отбрасыванием, числитель и знаменатель должны давать дробное значение — в примере это обеспечивается порядком операций (сначала деление, потом умножение на 100). Функция Окр() округляет процент до целого.
Если коллекция пустая, деление на ноль вызовет ошибку. Перед циклом добавьте проверку Если ВсегоСтрок = 0 Тогда Возврат; КонецЕсли; — это частая причина падения обработок на пустых выборках.
- 1Определите общее количество итераций до начала цикла
- 2Внутри цикла вычисляйте процент: НомерСтроки / ВсегоСтрок * 100
- 3Вызовите Состояние() с текстом, процентом и пояснением
- 4После цикла вызовите Состояние() без параметров для очистки
- 5Запустите обработку и визуально проверьте обновление строки
Состояние в обычных и управляемых формах
В обычных формах (толстый клиент) метод Состояние() доступен в любом клиентском коде модуля формы и модуля объекта. Дополнительно в обычном приложении распространён объект Индикатор, получаемый функцией ПолучитьИндикаторПроцесса() — он выводит отдельный элемент прогресс-бара, который можно разместить на форме.
В управляемых формах метод работает только в процедурах с директивой &НаКлиенте. Если длительная операция выполняется в серверной процедуре &НаСервере, вызов Состояние() там приведёт к ошибке «Процедура или функция с указанным именем не определена», потому что на сервере этого метода нет.
Практический выход для управляемых форм — разбить обработку на порции: клиентская процедура в цикле вызывает серверную для небольшой части данных и после каждого вызова обновляет строку состояния. Либо использовать механизм длительных операций БСП, о котором ниже.
Длительные операции на сервере: прогресс через фоновые задания
Когда обработка тяжёлая и должна идти на сервере (проведение тысяч документов, обмен данными), правильный подход — фоновое задание. В конфигурациях на Библиотеке стандартных подсистем есть готовый механизм: процедура ДлительныеОперации.ВыполнитьВФоне() запускает операцию, а из серверного кода прогресс передаётся вызовом ДлительныеОперации.СообщитьПрогресс(Процент, Текст).
Клиентская часть БСП сама отображает форму ожидания с процентом и текстом — писать вызовы Состояние() вручную не требуется. Это предпочтительный вариант для типовых конфигураций: пользователь видит модальное окно прогресса и может дождаться завершения или прервать операцию штатной кнопкой.
Если БСП в конфигурации нет, можно запустить фоновое задание через ФоновыеЗадания.Выполнить(), а на клиенте через ПодключитьОбработчикОжидания() периодически опрашивать состояние задания и обновлять строку состояния по данным, которые задание сохраняет, например, во временном хранилище.
Сравнение вариантов
Подходит для быстрых обработок на клиенте. Ограничение: не работает на сервере и блокирует интерфейс на время цикла.
Штатный вариант для тяжёлых серверных операций в типовых конфигурациях. Требует наличия БСП.
Универсально без БСП, но требует самостоятельной передачи прогресса через хранилище и обработчика ожидания.
Типичные ошибки и ограничения
Самая распространённая ошибка — вызов Состояние() в серверной процедуре управляемой формы. Вторая по частоте — отсутствие очистки строки после завершения: пользователь видит «Обработано 100%» спустя часы и не понимает, идёт ли ещё какой-то процесс.
Третья проблема — слишком частое обновление в очень быстром цикле. На большинстве конфигураций это не критично, но при миллионах итераций имеет смысл обновлять строку не на каждой итерации, а, например, раз в сто или тысячу записей: Если НомерСтроки % 100 = 0 Тогда Состояние(...); КонецЕсли;.
Также помните, что строка состояния — не журнал. Если нужно зафиксировать ход обработки с деталями по каждой ошибке, используйте Сообщить() для вывода в панель сообщений или запись в журнал регистрации, а строку состояния оставьте для общего прогресса.
Проверка результата и отладка
Проверяется механизм визуально: запустите обработку на тестовой базе с реальным объёмом данных и наблюдайте за нижней частью окна. Текст должен меняться, процент — равномерно расти от 0 до 100, а после завершения строка должна очиститься.
Если процент скачет или замирает на одном значении — проверьте формулу вычисления и убедитесь, что деление даёт дробный результат. Если строка вообще не появляется, убедитесь, что код выполняется в клиентском контексте: поставьте точку останова и посмотрите в отладчике, в какой процедуре происходит вызов.
Для фоновых заданий дополнительно проверьте через консоль заданий или функцию ФоновыеЗадания.ПолучитьФоновыеЗадания(), что задание действительно выполняется и не падает с ошибкой — в этом случае прогресс просто перестанет обновляться.
Как проверить результат
Меняется по мере выполнения, отражает текущий этап
Статичен или отсутствует при работающей обработке
Равномерно растёт от 0 до 100
Скачет, замирает или превышает 100
Строка очищена, окно в обычном состоянии
Старое сообщение остаётся на экране
Когда строка состояния не подходит: альтернативы
Для коротких операций (доли секунды) строка состояния бессмысленна — пользователь её просто не заметит. Для интерактивных сценариев, где нужен отклик «нажал — увидел», лучше подходят ПоказатьОповещениеПользователя() для уведомления о завершении и ПоказатьПредупреждение() для критичных ситуаций.
Если требуется наглядный прогресс-бар прямо на форме, в управляемых формах используют элемент формы «Поле индикатора», связанный с числовым реквизитом, и обновляют его значение в процессе обработки. Это заметнее, чем строка внизу окна, и уместно в обработках, с которыми пользователь работает продолжительное время.
Что важно запомнить
Строка состояния выводится методом Состояние(Текст, Процент, Пояснение) только в клиентском коде. Всегда очищайте её вызовом без параметров. Для серверных длительных операций используйте фоновые задания и ДлительныеОперации.СообщитьПрогресс().
Частые вопросы
Почему Состояние() выдаёт ошибку «метод не определён»?
Метод доступен только в клиентском контексте. Ошибка возникает при вызове из процедуры с директивой &НаСервере, из серверного общего модуля или из фонового задания. Перенесите вызов в клиентскую процедуру либо передавайте прогресс с сервера через механизм длительных операций.
Как убрать строку состояния после завершения обработки?
Вызовите Состояние() без параметров в конце процедуры. Рекомендуется делать это и в ветке обработки исключений, чтобы строка очистилась даже при ошибке в середине цикла.
Работает ли строка состояния в веб-клиенте?
Метод Состояние() ориентирован на толстый и тонкий клиент. В веб-клиенте его поведение ограничено, поэтому для веб-доступа надёжнее использовать оповещения пользователя или поле индикатора на форме.
Чем отличается Состояние() от Сообщить()?
Состояние() показывает одно текущее сообщение, которое заменяется следующим вызовом и исчезает после очистки. Сообщить() выводит текст в панель сообщений, где накапливается история — она сохраняется и после завершения обработки.
Как показать прогресс при загрузке файла неизвестного размера?
Если общее количество итераций заранее неизвестно, выводите только текст с пояснением без процента: Состояние("Загрузка данных", , "Обработано записей: " + Счётчик). Процент можно добавить после подсчёта строк, если файл позволяет быстро определить их количество до основной обработки.
Можно ли вывести строку состояния из внешней обработки?
Да, в модуле формы внешней обработки метод Состояние() работает так же, как и в конфигурации, — при условии, что вызов идёт из клиентской процедуры. Никакой дополнительной настройки не требуется.