Каким образом возможно реализовать правильную работу отображения состояния прогресса(индикации) при чтении из файла?

```1c
    &НаКлиенте
    Процедура Команда1(Команда)
    Перем Стр;
    Стр = ";

    //Открываем диалог выбора файла для чтения caller SMDR
    ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ВыборФайла.МножественныйВыбор = Ложь;
    ВыборФайла.Заголовок = НСтр("ru = 'Выбор файла'");
    ВыборФайла.Фильтр = НСтр("ru = 'Все файлы (*.txt)|*.txt'");
    Если ВыборФайла.Выбрать() Тогда
    ИмяФайлаCaller = ВыборФайла.ПолноеИмяФайла;
    Иначе
    Сообщить("Вы не выбрали имя фала, повторите попытку!");
    Отказ = Истина;
    Возврат;
    КонецЕсли;

    //читаем сначала номер строки с которой будем читать файл
    НомерСтрLog = Новый ЧтениеТекста;

    НомерСтрLog.Открыть(ПутьКLog());
    стрВномере = НомерСтрLog.ПрочитатьСтроку();
    НомерСтрLog.Закрыть();

    Если стрВномере = Неопределено тогда

    Сообщить("Внимание! Файл читается впервые ", СтатусСообщения.Важное);

    Текст = Новый ЧтениеТекста;
    Текст.Открыть(ИмяФайлаCaller);//(ПолноеИмяФайла); 41 строка

    Стр = Текст.ПрочитатьСтроку();
    Стр = Текст.ПрочитатьСтроку();

    //определяем количество строк в файле SMDR
    //Текст.КоличествоСтрок();

    н=0; //кол-во строк

    //Для Сч = 0 по Текст.КоличествоСтрок()-2 Цикл

    Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки
    Стр = Текст.ПрочитатьСтроку();
    Сообщить(Стр);
    Если Стр = Неопределено Тогда
    Продолжить;
    КонецЕсли;
    Сообщить(н);
    РазложитьСтроку2(стр," ");
    Состояние("Идет чтение SMDR файла, с последующим созданем документов !!!", н/100);
    н=н+1;
    КонецЦикла;
    Текст.Закрыть();
    //пишем номер последней строки
    ЗаписьНомераСтроки(н+2);
    //КонецЦикла;

    Иначе
    ЧислоСтрВномере = Число(стрВномере);

    Текст = Новый ЧтениеТекста;
    Текст.Открыть(ИмяФайлаCaller);

    СчетчикНовФайла = 0;
    Пока Текст.ПрочитатьСтроку() <> Неопределено Цикл
    ОбработкаПрерыванияПользователя();
    СчетчикНовФайла = СчетчикНовФайла + 1;
    КонецЦикла;
    Текст.Закрыть();
    //Сообщить("Строк "+Счетчик);

    Если СчетчикНовФайла < ЧислоСтрВномере Тогда
    Сообщить("Внимание! количество строк в новом выгруженном файле меньше, чем в предидущем. Переформируйте файл", СтатусСообщения.ОченьВажное);
    ИначеЕсли
    СчетчикНовФайла = ЧислоСтрВномере Тогда
    Сообщить("Внимание! Вы читаете тот же файл. Сделайте повторную выгрузку файла!! ", СтатусСообщения.Внимание);
    Иначе
    Сообщить("Чтение файла данных", СтатусСообщения.Важное);
    ПостЧтение(ЧислоСтрВномере,ИмяФайлаCaller);
    //Состояние("Идет чтение SMDR файла, с последующим созданем документов !!!", н/100);
    КонецЕсли;

    КонецЕсли;
    КонецПроцедуры

    &НаСервере
    Процедура ПостЧтение(СчетчикНовФайла,ИмяФайлаCaller);

    Текст = Новый ТекстовыйДокумент;
    // открытие файла
    Текст.Прочитать(ИмяФайлаCaller);
    // перебор строк текстового документа
    строчка = СчетчикНовФайла+1;
    н=0;
    Для НомерСтроки = строчка по Текст.КоличествоСтрок() Цикл
    // получить строку файла с указанным номером
    Стр = Текст.ПолучитьСтроку(НомерСтроки);
    // Стр = Текст.ПрочитатьСтроку();
    //Сообщить(Стр);
    Если Стр = Неопределено Тогда
    Продолжить;
    КонецЕсли;
    Сообщить(н);
    РазложитьСтроку2(стр," ");
    н=н+1;

    КонецЦикла;
    КонецПроцедуры
```

Как вобще рассчитать размер индикатора и соответственно шаг??
---
А, ты через Состояние(), сорь, не доглядел (думал, что на форму прогрессбар выносишь). Тогда у тебя должно быть следующее:
Состояние("ТвойТекстПояснения", 100*н/Текст.КоличествоСтрок()).
Пояснение: второй параметр-число от 0 до 100; так как переменная "н" у тебя отвечает за номер строки, то н/Текст.КоличествоСтрок() не может быть больше 1, следовательно, просто домножаем на 100. Главное не забудь довести до 100 прогресс, когда считываешь последнюю строку после цикла. Единственное, точно не помню, параметр <Прогресс> - число от 0 или от 1... Если от 1, то начальное значение для "н" поставь 1. Главное не сбиться с этим счетчиком "н") Пишу в дороге, 1Ски под рукой нет)
---
Manticor, надо ответить себе на следующий вопрос: что есть для вас шаг прогресса? Как пример - считывание одной строки, тогда шаг будет равен 1, а предельное значение индикатора - общее количество строк, которое необходимо считать. Тогда задаем переменную, которая будет отвечать за номер загруженной строки и, соответственно, за прогресс полосы индикатора. Если нужно загружать несколько файлов - можно и 2 индикатора впихнуть: один отвечает за общий прогресс (шаг - 1, предельное значение - количество файлов), а другой - за прогресс чтения строк/символов; при этом, после загрузки файла целиком - обнуляем значение у индикатора, отвечающего за текущий прогресс. Как подытог: шаг можно брать за 1, а максимальное значение - количество чего-нибудь (символов, строк, файлов). Дальше уже дело техники и воображения)
---
RocKeR_13, Состояние("Идет чтение SMDR файла, с последующим созданем документов !!!", н/100);
как в состоянии предельное значение определить? н/100 это шаг
---
Manticor, сначала у текстового документа определи КоличествоСтрок(), а потом читай файл ЧтениемТекста и увеличивай на 1 индикактор.
---
А, ты через Состояние(), сорь, не доглядел (думал, что на форму прогрессбар выносишь). Тогда у тебя должно быть следующее:
Состояние("ТвойТекстПояснения", 100*н/Текст.КоличествоСтрок()).
Пояснение: второй параметр-число от 0 до 100; так как переменная "н" у тебя отвечает за номер строки, то н/Текст.КоличествоСтрок() не может быть больше 1, следовательно, просто домножаем на 100. Главное не забудь довести до 100 прогресс, когда считываешь последнюю строку после цикла. Единственное, точно не помню, параметр <Прогресс> - число от 0 или от 1... Если от 1, то начальное значение для "н" поставь 1. Главное не сбиться с этим счетчиком "н") Пишу в дороге, 1Ски под рукой нет)
---
RocKeR_13, просто у меня ентот счетчик на сервере в процедуре считается, неужели придется процедуру на функцию переделывать и передавать значение на клиент для Состояние()??
---
Manticor, А зачем Вы на сервере читаете файл?
---
KonstB, потому как используется ТаблицаЗначений - Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
---
Manticor, Видимо я ослеп... где вы ТЗ используете?
---
KonstB, в РазложитьСтроку2, а вообще сделал по формуле 100*н/Текст.КоличествоСтрок() - вроде грамотно выводит прогресс. А можно ли сделать, чтобы еще выводилось оставщееся примерное время? или это уже совсем неточный факт?
---
к сожалению, отображение прогресса на клиенте при выполнении действий на сервере куда более нетривиальная задача, чем кажется. Либо делите файл на части, и частями передавайте на сервер, либо поищите на инфостарте, были подходы к решению.

Упд, просмотрел, вы и так по частям отправляете.
---
это абзац
---
Вы имеете ввиду, что затруднительно отобразит mhtfkmysq ход процесса, если он выполняется на сервере
а вызов идет с клиента, например

```1c
    н=0;
    Для НомерСтроки = строчка по Текст.КоличествоСтрок() Цикл
    // получить строку файла с указанным номером
    Стр = Текст.ПолучитьСтроку(НомерСтроки);
    // Стр = Текст.ПрочитатьСтроку();
    //Сообщить(Стр);
    Если Стр = Неопределено Тогда
    Продолжить;
    КонецЕсли;
    Сообщить(н);
    РазложитьСтроку2(стр," ");//на сервере
    н=н+1; //после выполнения функции увеличиваем значение и сосотояние
    Состояние("ТвойТекстПояснения", 100*н/Текст.КоличествоСтрок());
```
---
Посмотрите эту статью - http://infostart.ru/public/157706/. Может поможет.