1С Прогресс-бар "на сервере" для управляемого приложения в 9 строк кода
Разработка - Инструментарий разработчика
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Кто пытался определить - как долго будет отрабатывать процедура "на сервере" и "что вообще там происходит" - знает, что 1С не позволяет выводить сообщения, индикаторы, состояния во время выполнения процедуры. Все вываливается только после завершения процедуры.
Тут есть предложения по распаралеливанию, по использованию регламентных заданий. но это все очень громоздко!
При загрузке больших объемов данных через управляемый интерфейс я пользуюсь индикацией текущего состояния заливки основанную на другом принципе.
Принцип основан на возможности в процедуре "на сервере" сохранить текстовый файл и существования мета - тега, который заставляет html страничку автоматически обновляться с определенной частотой. Главное, чтобы клиент имел доступ к html файлу.
Итак, нам надо :
- Записать информацию, которую хотим вывести пользователю, в текстовый файл с расширением html
- Инициировать запуск браузера с нашей сформированной html страничкой
- Заставить ее обновляться с определенной частотой
Все это можно сделать очень просто :
ПутьHTML = "c:\idicator.html";
ОбновлениеСекунд = 1;
Текст = Новый ТекстовыйДокумент;
Текст.ДобавитьСтроку("<meta http-equiv=""refresh"" content="""+ОбновлениеСекунд+""">");
Текст.ДобавитьСтроку("Начало цикла");
Попытка
Текст.Записать(ПутьHTML);
ЗапуститьПриложение(ПутьHTML);
Исключение КонецПопытки;
Выжный момент! Записывать в файл текущее состояния нужно порциями, а не каждую итерацию, ибо это достаточно медленная операция, вот пример текста работающей обработки :
&НаСервере
Процедура ОповеститьПользователя(ТекстСообщения,ОбновлятьСообщение,ОбновлениеСекунд,ОткрытьHTML = Ложь)
ПутьHTML = "c:\idicator.html";
Текст = Новый ТекстовыйДокумент;
Если ОбновлятьСообщение Тогда
Текст.ДобавитьСтроку("<meta http-equiv=""refresh"" content="""+ОбновлениеСекунд+""">");
КонецЕсли;
Текст.ДобавитьСтроку(ТекстСообщения);
Попытка
// может не быть доступа к файлу на запись
// что-бы не вылетать по исключению использую попытку
Текст.Записать(ПутьHTML);
Исключение КонецПопытки;
Если ОткрытьHTML Тогда
ЗапуститьПриложение(ПутьHTML);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура НачатьДлительнуюПроцедуруНаСервереНаСервере()
ВремяНачала = ТекущаяДата();
КвоВПорции = 1000;// через сколько итераций сохранять текущее состояние в файл
Счетчик = 0;
ОбновлениеСекунд = 1;
КоличествоИтераций = 600000;
ОповеститьПользователя("Начало цикла", Истина, ОбновлениеСекунд, Истина);
Для Итератор = 1 По КоличествоИтераций Цикл
Счетчик = Счетчик + 1;
Если Счетчик >= КвоВПорции Тогда
Счетчик = 0;
ОповеститьПользователя("Обработано "+СокрЛП(Итератор)+" из "+СокрЛП(КоличествоИтераций),Истина,ОбновлениеСекунд);
КонецЕсли;
КонецЦикла;
ОповеститьПользователя("Обработка завершена за "+СокрЛП(ТекущаяДата()-ВремяНачала)+" секунд!",Ложь,ОбновлениеСекунд);
КонецПроцедуры
&НаКлиенте
Процедура НачатьДлительнуюПроцедуруНаСервере(Команда)
НачатьДлительнуюПроцедуруНаСервереНаСервере();
КонецПроцедуры
Вступайте в нашу телеграмм-группу Инфостарт