Индикатор выполнения длительных операций на сервере 1С 8.3 (управляемые формы)

03.06.19

Разработка - Инструментарий разработчика

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

Скачать файлы

Наименование Файл Версия Размер
Индикатор выполнения длительных операций на сервере 1С 8.3 управляемые формы:
.zip 10,03Kb
4
.zip 1.0 10,03Kb 4 Скачать

Предисловие

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

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

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

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

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

Описание

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

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

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

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

Если ПоказыватьПроцентВыполнения И ЗначениеЗаполнено(ОбщаяСетеваяПапка) Тогда
	
	Если СпособИндикации = 0 Тогда
		
		ПрограммаИндикации = ОбщаяСетеваяПапка + ?(Прав(ОбщаяСетеваяПапка, 1) = "\", "", "\") + "progress.cmd";
		
		ФайлПрограммы = Новый Файл(ПрограммаИндикации);
		Если ФайлПрограммы.Существует() Тогда
			
			УникальноеИмяФайла = Формат(ТекущаяДата(), "ДФ=yyyyMMddHHmmss") + "_" + Строка(Новый УникальныйИдентификатор) + ".txt";
			ИмяФайлаИндикации = ОбщаяСетеваяПапка + ?(Прав(ОбщаяСетеваяПапка, 1) = "\", "", "\") + УникальноеИмяФайла;
			СтруктураПараметров.Вставить("ИмяФайлаИндикации", ИмяФайлаИндикации);
			
			ЗапуститьПриложение(ПрограммаИндикации + " " + ИмяФайлаИндикации);
			
		КонецЕсли;
		
		ФайлПрограммы = Неопределено;
		
	Иначе
		
		ПрограммаИндикации = ОбщаяСетеваяПапка + ?(Прав(ОбщаяСетеваяПапка, 1) = "\", "", "\") + "ProgressBar.jar";
		
		ФайлJava      = Новый Файл(ПутьКJava);
		ФайлПрограммы = Новый Файл(ПрограммаИндикации);
		
		Если ФайлJava.Существует() И ФайлПрограммы.Существует() Тогда
			
			УникальноеИмяФайла = Формат(ТекущаяДата(), "ДФ=yyyyMMddHHmmss") + "_" + Строка(Новый УникальныйИдентификатор) + ".txt";
			ИмяФайлаИндикации = ОбщаяСетеваяПапка + ?(Прав(ОбщаяСетеваяПапка, 1) = "\", "", "\") + УникальноеИмяФайла;
			СтруктураПараметров.Вставить("ИмяФайлаИндикации", ИмяФайлаИндикации);
			
			ЗапуститьПриложение(ПутьКJava + " -jar " + ПрограммаИндикации + " " + ИмяФайлаИндикации);
			
		КонецЕсли;
		
		ФайлJava      = Неопределено;
		ФайлПрограммы = Неопределено;
		
	КонецЕсли;
	
КонецЕсли;

ЗагрузитьДокументыСервер(СтруктураПараметров);

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

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

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

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

Если ЗначениеЗаполнено(СтруктураПараметров.ИмяФайлаИндикации) Тогда
	ТекстДок = Новый ТекстовыйДокумент;
	ТекстДок.ДобавитьСтроку("Начало чтения файлов");
	Попытка
		ТекстДок.Записать(СтруктураПараметров.ИмяФайлаИндикации, КодировкаТекста.OEM);
	Исключение
	КонецПопытки;
КонецЕсли;

По мере работы процедуры в ПЕРВУЮ строку файла будем писать текущий процент выполнения в виде: 25,0%. Здесь важно поставить знак процента после числа, а перед числом ничего не должно быть, т.е. оно стоит вначале строки. Также можно записывать некоторые короткие информационные сообщения в одну строку.

Индикатор = Индикатор + 1;
Если Индикатор > 0 И Индикатор % 100 = 0 Тогда
	ТекстДок.Очистить();
	ТекстДок.ДобавитьСтроку(?(ВсегоСтрок = 0, "ожидайте", Формат(Индикатор * 100 / ВсегоСтрок, "ЧДЦ=1; ЧГ=0") + "%"));
	Попытка
		ТекстДок.Записать(ПараметрыСервер.ИмяФайлаИндикации, КодировкаТекста.OEM);
	Исключение
	КонецПопытки;
КонецЕсли;

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

ТекстДок.Очистить();
ТекстДок.ДобавитьСтроку("stop");
Попытка
	ТекстДок.Записать(СтруктураПараметров.ИмяФайлаИндикации, КодировкаТекста.OEM);
Исключение
КонецПопытки;
ТекстДок = Неопределено;

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

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

P.S. Для скачивания выкладываю только внешние приложения *.cmd и *.jar. Код для 1С весь приведён в описании, поэтому оформлять в тестовую обработку не стал. Всё равно его вставлять кусками в разные места.

индикация прогресс процент выполнение длительный клиент сервер java

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 руб.

02.09.2020    119910    656    389    

701

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

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

18000 руб.

06.10.2023    7007    20    6    

37

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

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

10000 руб.

10.11.2023    3244    10    1    

31

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177341    1070    0    

846

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99203    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    17910    6    8    

38

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    27945    3    10    

14

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23488    15    15    

31
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. VmvLer 03.06.19 11:22 Сейчас в теме
слишком сложно, слишком много если и слишком дорого.

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

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

посему колесико и котик из БСП лично меня устраивает больше чем масса сомнительно кода с вагоном требований и ограничений.
Wdivine; 127.0.0.0; vvp117; Evg-Lylyk; JohnConnor; wowik; IvanBoychuk123; zeegin; shalimski; +9 Ответить
2. D.B.Sokolov 68 03.06.19 12:20 Сейчас в теме
(1) У меня как раз пользователи этим занимаются. Это применяется в обработке, которая загружает в базу кучу документов из другой программы.Колесо и котик как раз не работают. т.к. процедуры обработки запускаются не в фоне. Колесо не крутится, кот не шевелится.
5. Xershi 1473 03.06.19 15:59 Сейчас в теме
(2) переписать на внешнюю обработку. Там и котик и прогресс есть и доп текст тоже! На ИС уже появилась толковая статья, проверял у себя все работает с БСП 2.3.
7. D.B.Sokolov 68 03.06.19 16:13 Сейчас в теме
(5)
На ИС уже появилась толковая статья

Ссылочку бы на статью...
8. Xershi 1473 03.06.19 16:15 Сейчас в теме
(7) добавил в избранное, ловите
https://infostart.ru/public/1058914/
D.B.Sokolov; +1 Ответить
10. D.B.Sokolov 68 03.06.19 16:33 Сейчас в теме
3. D.B.Sokolov 68 03.06.19 15:13 Сейчас в теме
4. Serj1C 483 03.06.19 15:47 Сейчас в теме
Спасибо за идею. Реализовал в своем проекте (на базе cmd)
D.B.Sokolov; +1 Ответить
6. Serj1C 483 03.06.19 16:12 Сейчас в теме
(4) пришлось изрядно повозиться, чтобы победить проблему кодировок
9. D.B.Sokolov 68 03.06.19 16:22 Сейчас в теме
(6) Если писать в КодировкаТекста.OEM, то и проблем, вроде, не должно быть.
11. lazarenko 238 05.06.19 07:59 Сейчас в теме
Система оповещения решает эту задачу
12. D.B.Sokolov 68 05.06.19 11:54 Сейчас в теме
(11) В смысле, "Система взаимодействия" или что-то другое имеете в виду?
13. lazarenko 238 06.06.19 14:32 Сейчас в теме
14. herfis 496 06.06.19 14:38 Сейчас в теме
Или я чего-то не понял, или задача решается без лишних приблуд.
Еще 5 лет назад рисовал: https://infostart.ru/public/274721/
15. D.B.Sokolov 68 06.06.19 18:27 Сейчас в теме
(14) Сначала показалось, что это большие дебри. Вместо того, чтобы влезать в них, решил, что проще писать в TXT и читать оттуда. К тому же БСП постоянно меняется (неожиданно), и зависеть от неё не хотелось.
Потом подумал, что прикольно будет написать на Java. Родилась вот такая идея.
Ещё видел у кого-то вариант, писать в HTML-файл с параметром автообновления страницы. Но запускать целый браузер ради индикации, не очень как-то.
Но теперь всё-таки решил, что надо будет разобраться в стандартных механизмах. Наверное, оно того стоит.
20. herfis 496 07.06.19 09:00 Сейчас в теме
(15)
К тому же БСП постоянно меняется (неожиданно), и зависеть от неё не хотелось.

Поэтому обжегшись пару раз, я постарался свести зависимости к разумному минимуму.
К сожалению, полностью универсально сделать невозможно, так как для запуска в фоне процедуры внешней обработки необходима как минимум функция общего модуля, умеющая запускать произвольный код. В БСП она хоть стандартная.
Но тащить внешние зависимости и жертвовать переносимостью ради прогресс-бара - это эребор для продуктового решения.
В качестве задачки для самообучения с уклоном в смежные технологии - понять могу.
D.B.Sokolov; +1 Ответить
17. D.B.Sokolov 68 06.06.19 19:24 Сейчас в теме
18. independ 1515 06.06.19 20:39 Сейчас в теме
(17) да кстати, пробовал, работает
19. independ 1515 07.06.19 04:41 Сейчас в теме
Оставьте свое сообщение