Кто пытался определить - как долго будет отрабатывать процедура "на сервере" и "что вообще там происходит" - знает, что 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;
ОповеститьПользователя("Обработано "+СокрЛП(Итератор)+" из "+СокрЛП(КоличествоИтераций),Истина,ОбновлениеСекунд);
КонецЕсли;
КонецЦикла;
ОповеститьПользователя("Обработка завершена за "+СокрЛП(ТекущаяДата()-ВремяНачала)+" секунд!",Ложь,ОбновлениеСекунд);
КонецПроцедуры
&НаКлиенте
Процедура НачатьДлительнуюПроцедуруНаСервере(Команда)
НачатьДлительнуюПроцедуруНаСервереНаСервере();
КонецПроцедуры