Группа: Основатель
Сообщений: 13983
Из: Киев
Спасибо сказали: 4552 раз
Рейтинг: 3679.4
Из клиентской процедуры вызывается серверная, в которой выполняется запрос получения ссылок на элементы справочника, потом обходится результат выборки и эти элементы перезаписываются. Я не буду приводить здесь текст запроса, а просто приведу пример когда, на примере которого происходит то же самое. Итак, вызываем серверную процедуру, которая содержит:
ПрогрессБар = 0; МаксимальноеЗначение = 100000; Элементы.ПрогрессБар.МинимальноеЗначение = 0; Элементы.ПрогрессБар.МаксимальноеЗначение = МаксимальноеЗначение; Для а = 1 По МаксимальноеЗначение Цикл б = 2 * 2 / 2; ПрогрессБар = ПрогрессБар+1; // перезапись элементов КонецЦикла;
Как можно заметить по коду, на форме есть прогресс бар, который я хочу двигать. В данном случае (что и в случае с перезаписью элементов справочника будет) прогресс прыгает с 0 до максимума не плавно, а в один присест. Вопрос 1: как сделать, чтобы он всетаки двигался плавно? Понимаю, что на клиенте должно быть плавно, но не забываем про перезапись элементов (которые происходят в цикле).
Вопрос 2: так же хочу вставить ОбработкуПрерванияПользователя. Но это тоже только на клиенте фурычит.
Группа: Основатель
Сообщений: 13983
Из: Киев
Спасибо сказали: 4552 раз
Рейтинг: 3679.4
Вообще вопрос возник не из острой необходимости, а из того, что в обычных формах это делается просто, а сторонники управляемых говорят, что в управляемых всё то же самое делается тоже легко и просто.
Вариант 1 - сильный гемор. Вариант 2 - с запросом такой вариант не прокатит. Для наглядности, все же приведу текст серверной процедуры почти как есть (надо было сразу это сделать):
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 100 | Ссылка КАК Ссылка |ИЗ | Справочник.ХЗ |";
Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл
ПрогрессБар = ПрогрессБар+1;
Объект = Выборка.Ссылка.ПолучитьОбъект(); // меняем значение каких-то реквизитов Попытка Объект.Записать(); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки;
Группа: Местный
Сообщений: 1994
Из: Киева и окрестностей
Спасибо сказали: 406 раз
Рейтинг: 0
По-моему, с точки зрения клиент-серверной технологии прогрессбар серверной процедуры - безусловное зло Переходим от "бантиков" к спартанскому стилю: "Обрабатывается"/"Завершено".
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0
Зачем переходить куда-то? Прогресс-бар непользую, но Состояние() очень даже использую, понятно, что это как-то через ж, но и пользователю надо что-то отображать, и порционная обработка больших объемов проходит чуть быстрее, и не положит процесс однозначно. Суть работы такая: на клиенте создается структура-индикатор, которая содержит количество обрабатываемой информации (например кол-во циклов обработки), и дальше на клиенте, пока условие индикатора соблюдается - вызывается серверная процедура которая обрабатывает кусок информации согласно текущим параметрам индикатора, плюс в случае успешного выполнения серверной процедуры - в ней же меняем индикатор на следующий цикл.
Личные бесплатные консультации не даю, для этого есть форум!
Группа: Основатель
Сообщений: 13983
Из: Киев
Спасибо сказали: 4552 раз
Рейтинг: 3679.4
Цитата(Zaval @ 21.01.13, 21:12)
По-моему, с точки зрения клиент-серверной технологии прогрессбар серверной процедуры - безусловное зло
В контексте управляемых форм 1С это так, но, блин, нужная ж штука. Думал, что может есть всё-таки какое-то нормальное решение, т.к. повторюсь вещь вроде как не совсем бесполезная.
Цитата(Zaval @ 21.01.13, 21:12)
Переходим от "бантиков" к спартанскому стилю: "Обрабатывается"/"Завершено".
Так оно и будет скорей всего, т.к. в данном случае это разовая обработка, поэтому заморачиваться смысла нету. Вопрос возник для расширения кругозора, так сказать.
logist, я рассматривал такой вариант, но думал, что как-то проще это дело можно сделать. И потом, с объектами где код числовой можно поделить на порции и выбирать и обрабатывать частями (ГДЕ Код >= X И Код < Y). А если, например, код в справочнике вида УТ-ХЗ6УАН (да, представим, что код именно такого типа). Как тогда можно порционно выбирать данные? Конечно, можно выбрать сразу все записи, поместить их в какую-то коллекцию и там уже порционно обрабатывать. Но если там 1 000 000 записей - это ж гайки, это и памяти может не хватить. Другое какое-то решение есть?
Если рассматривать УФ как специализированный обозреватель, скажем интернет, (а так оно по сути и есть). То все странички, открываемые обозревателем, периодически бегают на сервер и спрашивают, а как там мой процесс? который я не давно загрузил (касательно длительных процессов, загрузка файла на сервер или обновления цен). Такой возможности у УФ пока нет. Так что или изобретать велосипед делением процесса (пример обмен УРИБ), ну или запускать фоновое задание и бегать проверять как оно там поживает...
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник. ЗиУП
В контексте управляемых форм 1С это так, но, блин, нужная ж штука. Думал, что может есть всё-таки какое-то нормальное решение, т.к. повторюсь вещь вроде как не совсем бесполезная.
я бы на сервере получил количество записей и его передал бы прогресс-бару. И примерно уже можно с долей погрешности знать когда примерно обработка завершится. Точность показаний не особо важна.
Цитата(alex040269 @ 22.01.13, 17:41)
Если рассматривать УФ как специализированный обозреватель, скажем интернет, (а так оно по сути и есть). То все странички, открываемые обозревателем, периодически бегают на сервер и спрашивают, а как там мой процесс? который я не давно загрузил (касательно длительных процессов, загрузка файла на сервер или обновления цен). Такой возможности у УФ пока нет.
эта технология называется ajax. Да, динамики в 1С нет. Думаю со временем сдерут.
Группа: Основатель
Сообщений: 13983
Из: Киев
Спасибо сказали: 4552 раз
Рейтинг: 3679.4
Цитата(Acid @ 28.01.13, 10:35)
я бы на сервере получил количество записей и его передал бы прогресс-бару. И примерно уже можно с долей погрешности знать когда примерно обработка завершится. Точность показаний не особо важна.
В таком случае нужно прыгать с клиента на сервер постоянно (для того, чтобы статус прогресс-бара менять). Не вариант. Я ж говорю, это уже вопрос академического характера. Вопрос, который побудил к созданию этой темы уже давно решен . Интересовало как такое вообще сделать элегантно можно.
Группа: Основатель
Сообщений: 13983
Из: Киев
Спасибо сказали: 4552 раз
Рейтинг: 3679.4
Цитата(Acid @ 28.01.13, 12:59)
я этот вариант предлагаю наоборот, чтоб не прыгать. 1 раз только выдать количество записей перед обработкой.
Так и что он даст? Во-первых надо будет хоть раз прыгнуть с сервера на клиент, чтобы показать количество, а во-вторых, эта ж цифра ничего пользователю не скажет . Например, напишет, мол надо обработать 100000 записей, пользователь сразу запаникует, хотя по факту это может занять 30 минут
Вы меня не поняли. Ну и еще один вариант - создать серверную функцию, кот. отслеживает сколько записей уже отработано. И из клиента обращаться к ней (с обработкой ожидания скажем 10сек), чтоб получить актуальное состояние.
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!