Как сделать прогресс бар 1с

Обновлено: 03.07.2024

Индикатор выполнения (отображение прогресса) длительных операций в тонком клиенте 1С:Предприятия 8.3, когда полностью весь код исполняется на сервере, а клиент просто ждёт завершения. Используются внешние средства (либо командное окно Windows, либо приложение Java).

Предисловие

Началось с того, что нужно было написать внешнюю обработку для загрузки документов в информационную базу на управляемых формах 1С 8.3. Конфигурация типовая без возможности изменения. Поскольку с запуском процедур из модуля внешней обработки в фоновом режиме не так всё просто, пришлось изобретать способ индикации пользователю процента выполнения операций.

Как это работает у меня

Реализовал два варианта.

Первый работает в командном окне Windows. По сути это командный файл, который в процессе работы добавляет строки в консоль. Не очень красиво. Зато просто и работает везде. В архиве это файл progress.cmd.

Второй вариант - это Java-приложение для Java 8 (JRE 1.8). Красивое маленькое окно с прогресс-баром. Нужно устанавливать виртуальную машину Java. В архиве это файл ProgressBar.jar.

Описание

В локальной сети имеем общую сетевую папку с правами на чтение и запись как со стороны Клиента, так и со стороны Сервера. Туда кладём нашу внешнюю программу индикации (progress.cmd или ProgressBar.jar, или оба варианта). Там же будут создаваться временные файлы. Сервер будет создавать файлы и писать в них. Программа с клиентской машины будет читать файлы и затем удалять их.

На клиенте, перед запуском длительной операции, генерируется уникальное имя файла для передачи его на Сервер и в нашу программку. После этого на Клиенте запускается внешнее приложение для индикации, куда в качестве параметра передаётся это имя файла. И уже после этого вызывается серверная процедура, с именем файла в параметрах.

Клиент 1С, скажем так, "подвисает", ожидая завершения операции. Но наша программулина работает и отображается поверх окна 1С.

Код на Клиенте:

ПутьКJava должен содержать что-то вроде "c:\Program Files\Java\jdk1.8.0_211\bin\javaw.exe". Это куда установлен JRE на клиентской машине.

ОбщаяСетеваяПапка - например: "\\FileServer\Public".

Код на Сервере

На Сервере создаётся временный файл в кодировке DOS (OEM).

Когда Сервер завершит все свои дела, во временный файл записываем служебное слово "stop". Это будет сигналом к закрытию программы индикации.

Что делает программа индикации. Она через каждые 5 секунд читает временный файл и выводит то, что содержится в первой строке. Вариант с Java при этом преобразовывает считанное в число и показывает прогресс-бар. Как только программа встречает "stop", удаляет временный файл и закрывается.

Надо добавить ещё вот что. Пользователь может раньше времени закрыть программу индикации. Тогда временный файл не будет удалён. Поэтому на Клиенте надо по завершении проверить, не осталось ли чего, и удалить мусор.

Рейтинг: 405

Внешняя обработка (Прогресс бар) легко встраивается в любую конфигурацию, есть возможность выводить комментарий текущего действия

Внутри архива файл для демострации возможностей

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

Подскажите, пожалуйста, начинающему.
Каким образом эту обработку встроить в конфигурацию, если это можно "на пальцах" описать.

прогресс бар штука конечно очень удобная. но есть один маленький нюанс:
что бы все работало красиво необходимо изначально знать значение ста процентов бара. а потом уже передавать текущее значение и получать процент выполнения чего либо. отчет или копирование файлов или еще к чему там прикрутите прогрессбар.

//***********************
// Функции для работы с прогресс бар
//__________________________________________________________ ­______________
Функция ОткрытьПрогресБар(Знач Ч_Число="", Знач Стр_Имя="Запрос")
Если ФС.СуществуетФайл(КаталогИБ()+"Классы\ПрогрессБар.ert")=1 Тогда
Об_СЗ=СоздатьОбъект("СписокЗначений");
Об_СЗ.ДобавитьЗначение(Ч_Число);
Об_СЗ.ДобавитьЗначение(Стр_Имя);
Попытка
ОткрытьФорму("Обработка",Об_СЗ.ВСтрокуСРазделителями(), КаталогИБ()+"Классы\ПрогрессБар.ert");
Исключение
Состояние(СокрЛП(Стр_Имя)+" "+Строка(Ч_Число)+"%");
КонецПопытки;
КонецЕсли;
КонецФункции //ОткрытьПрогресБар
//__________________________________________________________ ­______________
Функция ЗакрытьПрогресБар()
Попытка
ОткрытьФорму("Обработка","", КаталогИБ()+"Классы\ПрогрессБар.ert");
Исключение
КонецПопытки;
КонецФункции //ЗакрытьПрогресБар


ОткрытьПрогресБар(ЗначениеСтаПроцентов); //Здесь надо передать стопроцентное значение при открытии как раз прогрессбар и будет понимать сколько оно есть стопроцентов
ОткрытьПрогресБар(0);

Сч=1;
Пока Запрос.Группировка(1) = 1 Цикл
ОткрытьПрогресБар(Сч,Запрос.ЗначениеУпорядочивания(*,*)); // теперь в цикле открываем прогресс и передаем текущее значение прогресса. на самом деле прогресс бар будет "Переоткрываться" -( но мы то знаем, что открытие уже было и прогрессбар еще пока помнит значение ста процентов. ну и есс-но стопроцентов /100 * на текущее значение аккурат вычислит текущий прогресс в процентах)

Доброго времени! Примеры данной публикации помогут всем, кто хочет использовать индикатор на управляемых формах. В публикации я предлагаю простое рабочее решение по отслеживанию процесса выполнения обработок на управляемых формах.

В данной задаче я рассмотрю 2 примера - это "проведение документов" и "загрузка на сервер с обработкой внешнего Excel файла".

Итак, первый пример:


Мы получаем список документов стандартным методом кнопкой "Обновить период" с отбором по организации, затем нажимаем кнопку "Начать проведение" - запускаем данный процесс - индикатор начинает работать.

По достижению 100% - документы проведены. Так же, я разместил "статус бар", который показывает какой документ обрабатывается в текущий момент.

Вторая задача. Здесь, мы должны загрузить Excel (xlsx) файл на сервер и отследить статус его обработки:


Достаточно выбрать Excel файл (читается методом самой платформы), затем, нажимаем кнопку "Загрузить файл". По ходу выполнения обработки - идет индикатор, указывается статус, и в реквизите формы "табличная часть" заполняется колонка "торговая точка" по мере обработки строки.

Для решения данных примеров я использовал Платформу 8.3.13.1865 и Конфигурацию УТ 11.3 (в принципе может быть любой другой, но на УФ).

Дополнительных условий не требуется.

"Основная" клиентская функция данных обработок вот такая:

Буду рад, если данные примеры помогут вам. Так же хочу сказать спасибо автору вот этой публикации, которая сподвигла меня написать эту маленькую шпаргалку - памятку.

--- РАЗРАБОТКА 1С от 900 час. ---

Тут есть предложения по распаралеливанию, по использованию регламентных заданий. но это все очень громоздко!

При загрузке больших объемов данных через управляемый интерфейс я пользуюсь индикацией текущего состояния заливки основанную на другом принципе.

Принцип основан на возможности в процедуре "на сервере" сохранить текстовый файл и существования мета - тега, который заставляет html страничку автоматически обновляться с определенной частотой. Главное, чтобы клиент имел доступ к html файлу.

- Записать информацию, которую хотим вывести пользователю, в текстовый файл с расширением html

- Инициировать запуск браузера с нашей сформированной html страничкой

- Заставить ее обновляться с определенной частотой

Все это можно сделать очень просто :

Выжный момент! Записывать в файл текущее состояния нужно порциями, а не каждую итерацию, ибо это достаточно медленная операция, вот пример текста работающей обработки :

Специальные предложения

Electronic Software Distribution

Интеграция 1С с системой Меркурий

Алкогольная декларация

Готовые переносы данных

54-ФЗ

Управление проектом на Инфостарте

Траектория обучения 1С-разработчика

И файл, собственно, тоже на сервере.
Идея интересная, но, к сожалению, запись в файл не добавляет быстродействия((

Вероятнее всего, автор не сталкивался в работе с компаниями в которых онлайн в базе больше 250 человек. Запись в файл плохое решение, при высокой нагрузке серверов клиентов переводят на тонкий клиент (веб-сервер), а доступ к серверной службе 1С и серверам закрывают.

(4) pbazeliuk, 250 человек из экселя грузить ничего не будут. и да - я написал, что нужно иметь доступ к этому файлу, а так это не панацея.

Интересно, думали ли Вы, как этот код будет работать в клиент-серверном варианте? И где должен будет открыться браузер.

(7) spec8s, в клиент-серверном варианте можно не использовать ЗапуститьПриложение(ПутьHTML); а открывать его самостоятельно, из предварительно расширенной папки. Лично я так и делал. Вообще делано для себя, для того, чтобы мог понимать масштабы временных затрат

ну что за ерунда.
учитесь пользоваться 1С а не изобретать костыли!

Тут есть предложения по распаралеливанию, по использованию регламентных заданий. но это все очень громоздко!

Deslime; AneJIbcuH; SkyJack; for_sale; gradi; Shkalar; e.a.afanasyev; Aleks_Antonuk; 2man; Puk2; zqzq; PrinzOfMunchen; CSiER; delete; biz-intel; MrUnnamed; Yashazz; JesteR; dj_serega; + 19 – Ответить

(10) dj_serega, и это плохо?
пример моего использования


Получается что он (флаг истина) очистит накопленные прочитанные в процессе выполнения. Какие не успели прочитать в процессе будут в массиве.

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

Платформу не хаял, потому как понятно для чего так сделано, за обвинение в некомпетентности особое спасибо ) хамите, батенька

(17) dj_serega, сорри, я имел ввиду не работает как нам надо, цитирую комментарий из http://infostart.ru/public/159607/
"В файловом варианте задания всегда выполняются последовательно одно за другим, в отличие от клиент-серверного варианта, где несколько заданий могут выполняться параллельно в одном и том же рабочем процессе или в разных рабочих процессах и даже на разных компьютерах. Поэтому, выделенного клиента, занимающегося обработкой заданий, не рекомендуется использовать для других целей, т.к. это может негативно повлиять на производительность выполнения заданий.

Клиенты в файловом варианте не имеют прямой связи с планировщиком заданий и взаимодействуют с ним через файл обмена, который находится в каталоге информационной базы (в клиент-серверном варианте клиенты соединены с планировщиком по TCP/IP, что позволяет избежать задержек при назначении заданий на выполнение). Поэтому при обработке заданий возможны небольшие задержки, связанные с тем, что планировщик читает файл обмена и получает очередную порцию заданий на выполнение только после того, как завершит выполнение полученных ранее заданий.

(13) fishca, отлично будет работать, если имя файла будет к примеру "smb:\\192.168. \\share\indicator.html" ;)

Как вариант можно еще хранилище настроек использовать.
Клиент запускает длительную процедуру в виде фонового задания, фоновое задание периодически пишет статус в хранилище настроек, а клиент в обработчике ожидания читает и отображает результат.
Из плюсов - передавать можно любые типы данных, а не только строки.
Из минусов - статус пишется в СУБД. Но всего одна строка, и в таблицу, которая есть во всех базах 1С независимо от конфигурации.
Через временное хранилище также можно обмениваться любыми данными с фоновыми заданиями, но там значение передается в родительский сеанс только по завершению процедуры.

Вроде работает неплохо :).

кстати, исходя из этого, нивелируется огрехи в сторону записи информации для вывода в файл. Получается в файловом варианте мой метод будет быстрее. т.к. и пишу я меньше в файл, и часть ресурса переносим на браузер для отображения информации. Если я правильно все понимаю.

1. Имя файла для каждого задания должно генерироваться, т.к. запускаться может несколько процессов и у нескольких пользователей, а позволять себе такое в рабочей многопользовательской базе - бред.

2. Даже если папка будет сетевой то еще необходимо вывести шару наружу, что зачастую запрещено.

P.S. Писать на "c:\\" не комильфо, т.к. обычно доступ программе урезается по самое немогу.

Вот так в очередной раз мы сталкиваемся с недоработкой или явным косяком 1С, после чего начинается изобретение обходных костылей разной степени извратности, а годика через два 1С снисходит к нашим нуждам и, вуаля, однажды наступает щастье. Я это к чему - к тому, что и способ, предлагаемой самой 1С, процитированный выше, он тоже работает криво, а иногда и вовсе не. Как показывают эксперименты, на 8.2 вообще всё с этим криво, на 8.3 чуть лучше.

(22) dj_serega, значит, вы просто не сталкивались. На 8.2. это просто шоу, фильм ужасов. Проверено, увы, неоднократно.

(25) Она просто закрывает hta-окно, а так можно что угодно сделать, например создать файл-флаг, и в 1с проверять его наличие и прерывать работу

Читайте также: