Правильная индикация прогресса цикла на клиенте
Разработка - Механизмы платформы 1С
// Получает структуру для индикации прогресса цикла.
//
// Параметры:
// КоличествоПроходов – Число - максимальное значение счетчика;
// ПредставлениеПроцесса – Строка, "Выполнено" – отображаемое название процесса;
// ВнутреннийСчетчик - Булево, *Истина - использовать внутренний счетчик с начальным значением 1,
// иначе нужно будет передавать значение счетчика при каждом вызове обновления индикатора;
// КоличествоОбновлений - Число, *100 - всего количество обновлений индикатора;
// ЛиВыводитьВремя - Булево, *Истина - выводить приблизительное время до окончания процесса;
// РазрешитьПрерывание - Булево, *Истина - разрешает пользователю прерывать процесс.
// МинимальныйПериодОбновления - Число, *1 - с, обновлять не чаще чем этот период, 0 - по количеству обновлений,
// эта реализация не поддерживает дробные значения;
//
// Возвращаемое значение:
// Структура - которую потом нужно будет передавать в метод ЛксОбработатьИндикатор.
//
Функция ЛксПолучитьИндикаторПроцесса(Знач КоличествоПроходов = 0, ПредставлениеПроцесса = "Выполнение", ВнутреннийСчетчик = Истина, Знач КоличествоОбновлений = 100, ЛиВыводитьВремя = Истина, РазрешитьПрерывание = Истина, МинимальныйПериодОбновления = 1) Экспорт
Индикатор = Новый Структура;
Если КоличествоПроходов = 0 Тогда
Состояние(ПредставлениеПроцесса + "...");
КоличествоПроходов = 1;
КонецЕсли;
Индикатор.Вставить("КоличествоПроходов", КоличествоПроходов);
Индикатор.Вставить("ПредставлениеПроцесса", ПредставлениеПроцесса);
Индикатор.Вставить("ЛиВыводитьВремя", ЛиВыводитьВремя);
Индикатор.Вставить("РазрешитьПрерывание", РазрешитьПрерывание);
Индикатор.Вставить("ДатаНачалаПроцесса", ТекущаяДата());
Индикатор.Вставить("МинимальныйПериодОбновления", МинимальныйПериодОбновления);
Индикатор.Вставить("ДатаСледующегоОбновления", Дата('00010101'));
Индикатор.Вставить("ВнутреннийСчетчик", ВнутреннийСчетчик);
Если КоличествоОбновлений > 0 Тогда
Шаг = КоличествоПроходов / КоличествоОбновлений;
Иначе
Шаг = 0;
КонецЕсли;
Индикатор.Вставить("Шаг", Шаг);
Индикатор.Вставить("СледующийСчетчик", 0);
Индикатор.Вставить("Счетчик", 0);
Возврат Индикатор;
КонецФункции
// Проверяет и обновляет индикатор. Нужно вызывать на каждом проходе индицируемого цикла.
//
// Параметры:
// Индикатор – Структура – индикатора, полученная методом ЛксПолучитьИндикаторПроцесса;
// Счетчик – Число – внешний счетчик цикла, используется при ВнутреннийСчетчик = Ложь.
//
Процедура ЛксОбработатьИндикатор(Индикатор, Счетчик = 0) Экспорт
Если Индикатор.ВнутреннийСчетчик Тогда
Счетчик = Индикатор.Счетчик + 1;
Индикатор.Счетчик = Счетчик;
КонецЕсли;
Если Индикатор.РазрешитьПрерывание Тогда
ОбработкаПрерыванияПользователя();
КонецЕсли;
ОбновитьИндикатор = Истина;
ТекущаяДата = ТекущаяДата();
Если Индикатор.МинимальныйПериодОбновления > 0 Тогда
Если ТекущаяДата < Индикатор.ДатаСледующегоОбновления Тогда
ОбновитьИндикатор = Ложь;
КонецЕсли;
КонецЕсли;
Если ОбновитьИндикатор Тогда
Если Индикатор.Шаг > 0 Тогда
Если Счетчик >= Индикатор.СледующийСчетчик Тогда
Индикатор.СледующийСчетчик = Цел(Счетчик + Индикатор.Шаг);
Иначе
ОбновитьИндикатор = Ложь;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ОбновитьИндикатор Тогда
Индикатор.СледующийСчетчик = Цел(Счетчик + Индикатор.Шаг);
Если Индикатор.ЛиВыводитьВремя Тогда
ПрошлоВремени = ТекущаяДата - Индикатор.ДатаНачалаПроцесса;
Осталось = ПрошлоВремени * (Индикатор.КоличествоПроходов / Счетчик - 1);
ОсталосьДней = Цел(Осталось / (24*60*60));
ТекстОсталось = ", Осталось: ";
Если ОсталосьДней > 0 Тогда
ТекстОсталось = ТекстОсталось + ОсталосьДней + "д";
КонецЕсли;
ТекстОсталось = ТекстОсталось + Формат(Дата(1,1,1) + Осталось, "ДЛФ=T");
ТекстОсталось = ТекстОсталось + ?(Индикатор.РазрешитьПрерывание, ". Прервать: Ctrl+Break", "");
Иначе
ТекстОсталось = "";
КонецЕсли;
ТекстСостояния = Индикатор.ПредставлениеПроцесса + " " + Формат(Счетчик / Индикатор.КоличествоПроходов * 100, "ЧЦ=3; ЧДЦ=0") + "% " + ТекстОсталось;
Состояние(ТекстСостояния);
КонецЕсли;
Если Счетчик = Индикатор.КоличествоПроходов Тогда
Состояние("");
КонецЕсли;
КонецПроцедуры
Ключевым моментом в ЛксОбработатьИндикатор() для обновления состояния является требование выполнения
в общем случае двух (любое можно отключить) условий:
- прошло минимальное время с момента последнего обновления
- не превысить заданное общее число обновлений
Вот пример их использования.
КоличествоДанных = 100000;
Индикатор = ЛксПолучитьИндикаторПроцесса(КоличествоДанных, "Проверка данных");
Для Счетчик = 1 По КоличествоДанных Цикл
ЛксОбработатьИндикатор(Индикатор, Счетчик);
КонецЦикла;
КоличествоДанных = 100000;
Индикатор = ЛксПолучитьИндикаторПроцесса(КоличествоДанных, "Проверка данных", Истина);
Для Счетчик = 1 По КоличествоДанных Цикл
ЛксОбработатьИндикатор(Индикатор);
КонецЦикла;
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Механизмы платформы 1С Разработчик Бесплатно (free)
Разберем 15 мифов о работе платформы «1С:Предприятие 8» – как распространенных, так и малоизвестных. Начнем с классики: «Код, написанный в одну строку, работает быстрее, чем многострочный». Так ли это на самом деле?
16.07.2025 45657 TitanLuchs 109
Работа с интерфейсом WEB-интеграция Механизмы платформы 1С Бесплатно (free)
Веб-интерфейсы повышают качество внешнего вида приложений 1С, предсказуемы с точки зрения верстки, позволяют организовать удобные и высокопроизводительные рабочие места для пользователей. Расскажем об особенностях разработки веб-интерфейсов на React внутри 1С, двустороннем взаимодействии 1С и JavaScript, а также сборке веб-приложения в одностраничный файл.
19.06.2025 18669 zeegin 15
Механизмы платформы 1С Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Про ООП в 1С и о том, как сделать свой код более кратким и выразительным при помощи использования текучего интерфейса (fluent interface).
03.02.2025 26023 bayselonarrend 127
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
В этой статье подробно рассматривается работа с JSON в XDTO в 1С:Предприятие. Вы узнаете, как сериализовать и десериализовать объекты XDTO в JSON, интегрировать 1С с веб-сервисами и API, а также корректно обрабатывать данные при обмене. Разбираются особенности работы с коллекциями, использование функций восстановления и частые ошибки при работе с JSON и XDTO.
30.01.2025 33270 user2122906 10
Механизмы платформы 1С Файловый обмен (TXT, XML, DBF), FTP Разработчик 1С:Предприятие 8 Бесплатно (free)
Этот материал познакомит вас с механизмом XDTO (XML Data Transfer Objects) в 1С и научит эффективно использовать его возможности. Мы разберёмся, как работать с XML-схемами, создавать модели данных, манипулировать объектами XDTO, а также сериализовать и десериализовать их в XML. Вы узнаете, как использовать XDTO для интеграции с внешними системами, избегать типичных ошибок и оптимизировать код. К концу вы будете уверенно применять XDTO для решения сложных задач обмена данными и автоматизации процессов.
17.01.2025 55733 user2122906 13
Механизмы платформы 1С WEB-интеграция Разработчик 1С:Предприятие 8 Бесплатно (free)
В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.
14.01.2025 46769 dsdred 110
Механизмы платформы 1С Разработчик 1С:Предприятие 8 Бесплатно (free)
Особенности "Знач" и разбор документации к нему.
10.01.2025 26440 VAAngelov 60
Механизмы платформы 1С Разработчик Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.
23.06.2024 40439 bayselonarrend 24
| Код |
|---|
Счетчик=0;
СледСчетчик=0;
ОдинПроцент=КвоЭлементов/100;
Пока ..... цикл
Счетчик=Счетчик+1;
Если Счетчик>СледСчетчик Тогда
СледСчетчик=Цел(Счетчик+ОдинПроцент);
Состояние("Выполнено "+Цел(Счетчик/ОдинПроцент)+"%");
КонецЕсли;
КонецЦикла;
Показать полностью |
А вообще, ИМХО, лучше считать не по 1%, а по 5%-10%. Или блоками по 50-10-5 записей (в зависимости от того сколько осталось). А то наблюдать проценты, бегущие по одному - тоже невесело.
| Код |
|---|
Счетчик=0;
СледСчетчик=0;
ОдинПроцент = КвоЭлементов * 0.01; // ---
Коэффициент = 100 / КвоЭлементов; // ---
Пока ..... цикл
Счетчик=Счетчик+1;
Если Счетчик>СледСчетчик Тогда
СледСчетчик=Цел(Счетчик+ОдинПроцент);
Состояние("Выполнено "+Цел(Счетчик * Коэффициент)+"%"); // ---
КонецЕсли;
КонецЦикла;
Показать полностью |
| Код |
|---|
Шаг = Количество / 100;
ТекШаг=Шаг;
К=1;
Процент=0;
Пока ... Цикл
К=К+1;
Если К>=ТекШаг Тогда
Процент=Процент+1;
ТекШаг=ТекШаг+Шаг;
Сообщить("Выполнено "+Процент+" % ...");
КонецЕсли;
...
КонецЦикла;
Показать полностью |
Основная идея публикации от тебя видимо ускользнула через призму (4) =)
На самом деле, оптимизнуть можно в СледСчетчик=Цел(Счетчик+ОдинПроцент) от Цел() избавившись. Т.к. Счетчик у нас итак целый, значит дробь м.б. только от ОдинПроцент. Потому мы спокойно можем сделать ему Цел() вне цикла.
(5) Что ж там неоптимально??? деление выполнется не более 100 раз, это много?
И выполняется оно исключительно в целях более точной индикации.
Ваш же код неверен - для примера, представьте индикацию, когда кол-во шагов будет меньше 100.
(9) А тут код действительно неоптимальный. Мы выполняем "%" (что есть эквивалент "/" ) на _каждом_ шаге - как раз то, от чего пытались уйти.
На мой взгляд лучше индикация раз в секунду:
там где проверка выводить индикацию проверяем сменилась ли секунда.
Сделал так когда столкнулся с необходимости выводить время прошедшее и оставшееся. Некрасиво получается когда процесс выполняется очень быстро меньше 5 секунд. Зато влияние индикации стало минимальным.
ПредставлениеПроцесса = "Обработка строк таблицы";
Счетчик = 0;// СледующийСчетчик = 0;
Шаг = Таблица.Количество() / 100;
Для Каждого Строка Из Таблица Цикл
ОбработкаПрерыванияПользователя();
Счетчик = Счетчик + 1;
//Если Счетчик > СледующийСчетчик Тогда
Если Счетчик % Шаг=0 Тогда
//СледующийСчетчик = Цел(Счетчик + Шаг);
Состояние(ПредставлениеПроцесса + " " + Формат(Счетчик / Шаг, "ЧЦ=3; ЧДЦ=0") + "%");
КонецЕсли;
КонецЦикла;
Процедура глОбработкаИндикатора(ТекСчетчик,ТекИндикатор,ЧастотаОбновления) Экспорт
// ТекСчетчик - перемнная счетчика цикла (в теле цикла увеличивать ее не надо)
// ТекИндикатор - Переменная связанная с элементом формы Индикатор
// ЧастотаОбновления - частота обновления индикатора в количестве раз обхода цикла
// Увеличим индикатор цикла
ТекСчетчик = ТекСчетчик + 1;
Если ТекСчетчик >= ЧастотаОбновления Тогда
ТекИндикатор = ТекИндикатор + ТекСчетчик;
ТекСчетчик = 0;
КонецЕсли;
КонецПроцедуры
В цикле вызывается эта процедура и индикатор изменяется столько сколько мне надо.
Например так
Сч = 0;
Индикатор = 0;
ЧастотаОбновления = ТЗ.Количество() * 0.1; // т.е. каждые 10% данных
Для каждого Стр из ТЗ Цикл
<что там надо нам сделать>
глОбработкаИндикатора(Сч,Индикатор,ЧастотаОбновления);
КонецЦикла;
Функция лксТекстИндикатора(Индикатор)
возврат Индикатор.ПредставлениеПроцесса + " "
+ Формат(Индикатор.Счетчик / Индикатор.КоличествоПроходов * 100, "ЧЦ=3; ЧДЦ=0") + "% ";
КонецФункции // лксТекстИндикатора()
тогда индикатор вложенного цикла будет
Индикатор = ЛксПолучитьИндикаторПроцесса(тзСсылок.Количество(), лксТекстИндикатора(ИндикаторОбщий) + " вложенный цикл:");
КолВо = 500000;
i = 0;
Индикатор = ЛксПолучитьИндикаторПроцесса(КолВо, "Прогресс", Истина, 100, Истина, Истина, 1);
Пока i < КолВо Цикл
ЛксОбработатьИндикатор(Индикатор);
i = i + 1;
КонецЦикла;
ПоказатьПри потере фокуса, и обратном переключении индикация не обновляется
но чуток поправил:
1. вместо:
Если КоличествоОбновлений > 0 Тогда
Шаг = КоличествоПроходов / КоличествоОбновлений;
Иначе
Шаг = 0;
КонецЕсли;
Индикатор.Вставить("Шаг", Шаг);упростил:
Индикатор.Вставить("Шаг", ?(КоличествоОбновлений > 0, КоличествоПроходов / КоличествоОбновлений, 0));2. вместо:
ТекстОсталось = "Осталось примерно: " + ОсталосьВремени;уточнил (а то не все в курсе особенно 7-ки, да и в любом случае полезно):
ТекстОсталось = "Осталось примерно: " + ОсталосьВремени + ?(Индикатор.РазрешитьПрерывание, " Прервать: Ctrl+Pause/Break", "");3. и добавил для визуализации в ЛксПолучитьИндикаторПроцесса переменную Прогресс, куда передаю элемент формы чтобы видеть ползунок если он есть на форме
Если Индикатор.Прогресс <> Неопределено Тогда
Индикатор.Прогресс.Значение = Счетчик;
КонецЕсли;
4. не совсем понял зачем ВнутреннийСчетчик, можно расшифровать?
5. совсем не понял зачем в конце ЛксОбработатьИндикатор() проверка
Если ТипЗнч(Индикатор) = Тип("СтрокаТаблицыЗначений") Тогдаведь в описании это Структура, и в начале процедуры к ней обращаются как к структуре и если передать строку то получим ошибку:
Если Индикатор.ВнутреннийСчетчик ТогдаЯ так понимаю что строку нужно либо передавать отдельным параметром (завести новый) либо вообще это отдельный случай (аппендикс походу :)
Я такое как-то делал но проверку на любую коллекцию Массив, Структура, и остальные
1. Действительно твой вариант будет несколько быстрее, но я не люблю экономить на копейках, снижая отлаживаемость кода.
2. Тоже пару раз хотел добавить, но пересиливал себя =)
- много лишнего текста будет отвлекать от главного
- текст справа от переменного фрагмента будет прыгать (смещаться) вправо-влево, что привлекает лишнее внимание
- усложнится многоуровневый индикатор (здесь не представлен)
3. У строки состояния перед формой весомое приемущество - ее практически не нужно очищать/убирать/закрывать в случае прерывания процесса исключением или пользователем.
4. Не понял вопроса, можешь пояснить?
5. Индикатор типа СтрокаТаблицыЗначений используется в многоуровневом индикаторе (здесь не представлен)
2.
- Ну кому как, мне так наоборот красивше, к тому же реально полезно, а не просто так
- Ну смещение то будет незначительное, только на 1 символ и только 9 раз, смотри:
Выполнено 1% Осталось: 00:01:00 Прервать: Ctrl+Pause/Break (от 1 до 9)
и
Выполнено 10% Осталось: 00:01:00 Прервать: Ctrl+Pause/Break ( а тут все остальное)
- вот насчет многоуровневого не в курсе, если его тут нет то что на него равнятся то?
3. Естественно, однако я часто запускаю процесс и ухожу еще куда-нибудь по делам, издалека хорошо видно статус, а вот текст в строке состояния, так что мне и подходить не нужно чтобы понять сколько выполнилось, а чтобы уточнить можно и приглядеться
4. Ну переменная у тебя есть такая
Это наверно когда делается несколько итераций прежде чем вызывается твоя функция? Но мне сложно представить такую потребность
5. Опять же - если его нет то зачем код от него тут? На него же тратится время и вообще он мусорный или как?
4. Приведи пример использования индикатора для этого вопроса. Похоже я все еще не понимаю.
Про многоуровневый индикатор я пишу потому, что у меня он есть и я не хочу держать по несколько версий одной функции. Вношу исправление в одну и сразу можно публиковать ее сюда без дополнительных телодвижений.
1) А зачем в процедуре дважды обновляется
ТекущаяДата = ТекущаяДата(); 2) Зачем задублена строка
Индикатор.СледующийСчетчик = Цел(Счетчик + Индикатор.Шаг);3) Зачем проверяется тип входящего параметра
Если ТипЗнч(Индикатор) = Тип("СтрокаТаблицыЗначений")4) Что за извращение?
Часов = Цел(Осталось / 3600);
Осталось = Осталось - (Часов * 3600);
Минут = Цел(Осталось / 60);
Секунд = Цел(Цел(Осталось - (Минут * 60)));
ОсталосьВремени = Формат(Часов, "ЧЦ=2; ЧН=00; ЧВН=") + ":" + Формат(Минут, "ЧЦ=2; ЧН=00; ЧВН=")
+ ":" + Формат(Секунд, "ЧЦ=2; ЧН=00; ЧВН="); ОсталосьВремени = Формат(Дата(1,1,1) + Осталось, "ДФ=HH:mm:ss")5) Зачем на последней итерации формировать строку для процедуры Состояние(), если потом все-равно проверяется
Если Счетчик = Индикатор.КоличествоПроходов Тогда
Состояние("");
КонецЕсли6) Зачем при 0ом количестве обновлений занулять шаг и проверять при каждой итерации > 0 или нет. Если достаточно при КоличествоОбновлений = 0 установить СледующийСчетчик = 100 и в итерациях проверять лишь что Счетчик >= Индикатор.СледующийСчетчик.
Не ожидал столько недодумок от столь уважаемого мною разработчика.
Вот оптимизированная (с моей точки зрения) версия этой же процедуры:
// Получает структуру для индикации прогресса цикла.
//
// Параметры:
// КоличествоПроходов – Число - максимальное значение счетчика;
// ПредставлениеПроцесса – Строка, "Выполнено" – отображаемое название процесса;
// ВнутреннийСчетчик - Булево, *Истина - использовать внутренний счетчик с начальным значением 1,
// иначе нужно будет передавать значение счетчика при каждом вызове обновления индикатора;
// КоличествоОбновлений - Число, *100 - всего количество обновлений индикатора;
// ЛиВыводитьВремя - Булево, *Истина - выводить приблизительное время до окончания процесса;
// РазрешитьПрерывание - Булево, *Истина - разрешает пользователю прерывать процесс.
// МинимальныйПериодОбновления - Число, *1 - с, обновлять не чаще чем этот период, 0 - по количеству обновлений,
// эта реализация не поддерживает дробные значения;
//
// Возвращаемое значение:
// Структура - которую потом нужно будет передавать в метод ЛксОбработатьИндикатор.
//
Функция ЛксПолучитьИндикаторПроцесса(Знач КоличествоПроходов = 0, ПредставлениеПроцесса = "Выполнение", ВнутреннийСчетчик = Истина, Знач КоличествоОбновлений = 100, ЛиВыводитьВремя = Истина, РазрешитьПрерывание = Истина, МинимальныйПериодОбновления = 1) Экспорт
Индикатор = Новый Структура;
Если КоличествоПроходов = 0 Тогда
Состояние(ПредставлениеПроцесса + "...");
КоличествоПроходов = 1;
КонецЕсли;
Индикатор.Вставить("КоличествоПроходов", КоличествоПроходов);
Индикатор.Вставить("ПредставлениеПроцесса", ПредставлениеПроцесса);
Индикатор.Вставить("ЛиВыводитьВремя", ЛиВыводитьВремя);
Индикатор.Вставить("РазрешитьПрерывание", РазрешитьПрерывание);
Индикатор.Вставить("ДатаНачалаПроцесса", ТекущаяДата());
Индикатор.Вставить("МинимальныйПериодОбновления", МинимальныйПериодОбновления);
Индикатор.Вставить("ДатаСледующегоОбновления", Дата('00010101'));
Индикатор.Вставить("ВнутреннийСчетчик", ВнутреннийСчетчик);
Если КоличествоОбновлений > 0 Тогда
Индикатор.Вставить("Шаг", КоличествоПроходов / КоличествоОбновлений); ;
Индикатор.Вставить("СледующийСчетчик", 0);
Иначе
Индикатор.Вставить("Шаг", 0);
Индикатор.Вставить("СледующийСчетчик", 100);
КонецЕсли;
Индикатор.Вставить("Счетчик", 0);
Возврат Индикатор;
КонецФункции // ЛксПолучитьИндикаторПроцесса()
// Проверяет и обновляет индикатор. Нужно вызывать на каждом проходе индицируемого цикла.
//
// Параметры:
// Индикатор – Структура – индикатора, полученная методом ЛксПолучитьИндикаторПроцесса;
// Счетчик – Число – внешний счетчик цикла, используется при ВнутреннийСчетчик = Ложь.
//
Процедура ЛксОбработатьИндикатор(Индикатор, Счетчик = 0) Экспорт
Если Индикатор.ВнутреннийСчетчик Тогда
Счетчик = Индикатор.Счетчик + 1;
Индикатор.Счетчик = Счетчик;
КонецЕсли;
Если Счетчик = Индикатор.КоличествоПроходов Тогда
Состояние();
Иначе
Если Индикатор.РазрешитьПрерывание Тогда
ОбработкаПрерыванияПользователя();
КонецЕсли;
Если Индикатор.МинимальныйПериодОбновления > 0 Тогда
ТекущаяДата = ТекущаяДата();
Если ТекущаяДата >= Индикатор.ДатаСледующегоОбновления Тогда
Индикатор.ДатаСледующегоОбновления = ТекущаяДата + Индикатор.МинимальныйПериодОбновления;
Если Счетчик >= Индикатор.СледующийСчетчик Тогда
Индикатор.СледующийСчетчик = Цел(Счетчик + Индикатор.Шаг);
Если Индикатор.ЛиВыводитьВремя Тогда
Осталось = (ТекущаяДата - Индикатор.ДатаНачалаПроцесса) * (Индикатор.КоличествоПроходов / Счетчик - 1);
ТекстОсталось = нСтр("ru='Осталось: ~'", "ru") + Формат(Дата(1,1,1) + Осталось, "ДФ=HH:mm:ss");
Иначе
ТекстОсталось = "";
КонецЕсли;
ТекстСостояния = Индикатор.ПредставлениеПроцесса + " "
+ Формат(Счетчик / Индикатор.КоличествоПроходов * 100, "ЧЦ=3; ЧДЦ=0") + "% " + ТекстОсталось;
// Этот блок для многоуровневой индикации.
//Если ТипЗнч(Индикатор) = Тип("СтрокаТаблицыЗначений") Тогда
// ТаблицаИндикаторов = Индикатор.Владелец();
// ИндексИндикатора = ТаблицаИндикаторов.Индекс(Индикатор);
// Если ИндексИндикатора > 0 Тогда
// ТекстСостояния = ТаблицаИндикаторов[ИндексИндикатора - 1].ТекстСостояния + " >> " + ТекстСостояния;
// КонецЕсли;
// Индикатор.ТекстСостояния = ТекстСостояния;
//КонецЕсли;
Состояние(ТекстСостояния);
КонецЕсли;
КонецЕсли;
КонецЕсли
КонецЕсли;
КонецПроцедуры // ЛксОбработатьИндикатор() ПоказатьСпасибо.
ЗЫ: Сергей, а правда, что отображение индикатора на текущей форме или общей форме хода выполнения заметно затратнее, чем состояние()?
Подскажите пожалуйста, проверил если выводить индикацию, то по времени получается раз в 10 дольше (прыгать клиент-сервер-клиент), если совсем не выводить (выполнять все на сервере)
Это из-за прыганья, т.е. выодить индикацию наверное не рекомендуется и тогда в каких случаях можно оправдать вывод индикации?
ОсталосьВыводится два раза, как вариант исправления:
Процедура ЛксОбработатьИндикатор(Индикатор, Счетчик = 0) Экспорт
...
ТекстОсталось = "Осталось: " + ТекстОсталось + ?(Индикатор.РазрешитьПрерывание, ". Прервать: Ctrl+Break", "");
...заменить на
ТекстОсталось = ТекстОсталось + ?(Индикатор.РазрешитьПрерывание, ". Прервать: Ctrl+Break", ""); Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 57223
Создание 08.08.08 19:02
Обновление 16.07.21 18:20
Просмотры 67964
Загрузки 0
Рейтинг
177
Комментарии 62
Код открыт Да
Рубрики Механизмы платформы 1С
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)