Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Как показать процесс выполнения чего-то происходящего на сервере          
Vofka Подменю пользователя
сообщение 21.01.13, 14:46
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

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

    ПрогрессБар = 0;
    МаксимальноеЗначение = 100000;
    Элементы.ПрогрессБар.МинимальноеЗначение = 0;
    Элементы.ПрогрессБар.МаксимальноеЗначение = МаксимальноеЗначение;
    Для а = 1 По МаксимальноеЗначение Цикл
        б = 2 * 2 / 2;
        ПрогрессБар = ПрогрессБар+1;
        // перезапись элементов
    КонецЦикла;


Как можно заметить по коду, на форме есть прогресс бар, который я хочу двигать. В данном случае (что и в случае с перезаписью элементов справочника будет) прогресс прыгает с 0 до максимума не плавно, а в один присест. Вопрос 1: как сделать, чтобы он всетаки двигался плавно? Понимаю, что на клиенте должно быть плавно, но не забываем про перезапись элементов (которые происходят в цикле).

Вопрос 2: так же хочу вставить ОбработкуПрерванияПользователя. Но это тоже только на клиенте фурычит.

Как быть?

alex040269 Подменю пользователя
сообщение 21.01.13, 15:15
Сообщение #2

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

1) запустить обработку фоновым процессом, обработка пишет куда-то в базу о своем состоянии
2) клиент считывает состояние

и менее фантастический вариант

на клиенте 
Для а = 1 По 100 Цикл
  ВызовСервера(а)
КонецЦикла


на сервере
Функция ВызовСервера(б)
//выполнит 0,01 часть нужных дел
КонецФцнкции


Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

Vofka Подменю пользователя
сообщение 21.01.13, 15:25
Сообщение #3

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

Вообще вопрос возник не из острой необходимости, а из того, что в обычных формах это делается просто, а сторонники управляемых говорят, что в управляемых всё то же самое делается тоже легко и просто.

Вариант 1 - сильный гемор.
Вариант 2 - с запросом такой вариант не прокатит. Для наглядности, все же приведу текст серверной процедуры почти как есть (надо было сразу это сделать):

        ПрогрессБар = 0;
        Элементы.ПрогрессБар.МинимальноеЗначение = 0;
        Элементы.ПрогрессБар.МаксимальноеЗначение = КоличествоЗаданий;
        
        Запрос = Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ ПЕРВЫЕ 100
        |    Ссылка КАК Ссылка
        |ИЗ
        |    Справочник.ХЗ
        |";
        
        Выборка = Запрос.Выполнить().Выбрать();
        Пока Выборка.Следующий() Цикл
            
            ПрогрессБар = ПрогрессБар+1;
            
            Объект = Выборка.Ссылка.ПолучитьОбъект();
            // меняем значение каких-то реквизитов
            Попытка
                Объект.Записать();
            Исключение
                Сообщить(ОписаниеОшибки());
            КонецПопытки;
            
            //ОбработкаПрерыванияПользователя();
        КонецЦикла;

Zaval Подменю пользователя
сообщение 21.01.13, 21:12
Сообщение #4

Крутой
Иконка группы
Группа: Местный
Сообщений: 1994
Из: Киева и окрестностей
Спасибо сказали: 406 раз
Рейтинг: 0

По-моему, с точки зрения клиент-серверной технологии прогрессбар серверной процедуры - безусловное зло smile.gif
Переходим от "бантиков" к спартанскому стилю: "Обрабатывается"/"Завершено".

Сообщение отредактировал Zaval - 21.01.13, 21:15

logist Подменю пользователя
сообщение 22.01.13, 9:05
Сообщение #5

Про1С-ник
Иконка группы
Квалифицированный бухгалтерГений телепатии и социального моделированияЗа заслуги на форуме в 2010 годуМодератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0

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


Signature
Личные бесплатные консультации не даю, для этого есть форум!

Vofka Подменю пользователя
сообщение 22.01.13, 9:20
Сообщение #6

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

Цитата(Zaval @ 21.01.13, 21:12) *
По-моему, с точки зрения клиент-серверной технологии прогрессбар серверной процедуры - безусловное зло smile.gif

В контексте управляемых форм 1С это так, но, блин, нужная ж штука. Думал, что может есть всё-таки какое-то нормальное решение, т.к. повторюсь вещь вроде как не совсем бесполезная.

Цитата(Zaval @ 21.01.13, 21:12) *
Переходим от "бантиков" к спартанскому стилю: "Обрабатывается"/"Завершено".

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

logist, я рассматривал такой вариант, но думал, что как-то проще это дело можно сделать. И потом, с объектами где код числовой можно поделить на порции и выбирать и обрабатывать частями (ГДЕ Код >= X И Код < Y). А если, например, код в справочнике вида УТ-ХЗ6УАН (да, представим, что код именно такого типа). Как тогда можно порционно выбирать данные? Конечно, можно выбрать сразу все записи, поместить их в какую-то коллекцию и там уже порционно обрабатывать. Но если там 1 000 000 записей - это ж гайки, это и памяти может не хватить. Другое какое-то решение есть?

ЗЫ. Управляемые формы такие управляемые... faceoff.gif

alex040269 Подменю пользователя
сообщение 22.01.13, 17:41
Сообщение #7

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

Если рассматривать УФ как специализированный обозреватель, скажем интернет, (а так оно по сути и есть). То все странички, открываемые обозревателем, периодически бегают на сервер и спрашивают, а как там мой процесс? который я не давно загрузил (касательно длительных процессов, загрузка файла на сервер или обновления цен). Такой возможности у УФ пока нет.
Так что или изобретать велосипед делением процесса (пример обмен УРИБ), ну или запускать фоновое задание и бегать проверять как оно там поживает...


Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

svinuk Подменю пользователя
сообщение 27.01.13, 22:39
Сообщение #8

Общительный
**
Группа: Пользователи
Сообщений: 29
Спасибо сказали: 9 раз
Рейтинг: 0

А нельзя в серверную процедуру в качестве аргумента передать по значению реквизит формы который отвечает за текущий процент прогресса?
Что-то типа

на сервере
Процедура НашаПроцедура(Процент)
   ДляКаждого х Из у Цикл
      Процент = Процент + 1;
   КонецЦикла;
КонецПроцедуры


ну и вызов

НашаПроцедура(Знач ФормаПрогресса.ТекущийПроцент);



П.С: не пинайте сильно, с УФ на Вы.


Signature
Не доверяйте лошади с фиолетовыми бровями

Vofka Подменю пользователя
сообщение 28.01.13, 8:58
Сообщение #9

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

svinuk, не, так не прокатит. Я то же самое в первом посте писал.

Acid Подменю пользователя
сообщение 28.01.13, 10:35
Сообщение #10

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

Цитата(Vofka @ 22.01.13, 9:20) *
В контексте управляемых форм 1С это так, но, блин, нужная ж штука. Думал, что может есть всё-таки какое-то нормальное решение, т.к. повторюсь вещь вроде как не совсем бесполезная.

я бы на сервере получил количество записей и его передал бы прогресс-бару. И примерно уже можно с долей погрешности знать когда примерно обработка завершится. Точность показаний не особо важна.
Цитата(alex040269 @ 22.01.13, 17:41) *
Если рассматривать УФ как специализированный обозреватель, скажем интернет, (а так оно по сути и есть). То все странички, открываемые обозревателем, периодически бегают на сервер и спрашивают, а как там мой процесс? который я не давно загрузил (касательно длительных процессов, загрузка файла на сервер или обновления цен). Такой возможности у УФ пока нет.

эта технология называется ajax. Да, динамики в 1С нет. Думаю со временем сдерут.

Vofka Подменю пользователя
сообщение 28.01.13, 10:42
Сообщение #11

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

Цитата(Acid @ 28.01.13, 10:35) *
я бы на сервере получил количество записей и его передал бы прогресс-бару. И примерно уже можно с долей погрешности знать когда примерно обработка завершится. Точность показаний не особо важна.

В таком случае нужно прыгать с клиента на сервер постоянно (для того, чтобы статус прогресс-бара менять). Не вариант. Я ж говорю, это уже вопрос академического характера. Вопрос, который побудил к созданию этой темы уже давно решен smile.gif . Интересовало как такое вообще сделать элегантно можно.

Acid Подменю пользователя
сообщение 28.01.13, 12:59
Сообщение #12

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

Цитата(Vofka @ 28.01.13, 10:42) *
В таком случае нужно прыгать с клиента на сервер постоянно (для того, чтобы статус прогресс-бара менять)

я этот вариант предлагаю наоборот, чтоб не прыгать. 1 раз только выдать количество записей перед обработкой.


Signature

Документируйте Код! мать вашу...


Vofka Подменю пользователя
сообщение 28.01.13, 13:03
Сообщение #13

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4520 раз
Рейтинг: 3642.8

Цитата(Acid @ 28.01.13, 12:59) *
я этот вариант предлагаю наоборот, чтоб не прыгать. 1 раз только выдать количество записей перед обработкой.

Так и что он даст? smile.gif Во-первых надо будет хоть раз прыгнуть с сервера на клиент, чтобы показать количество, а во-вторых, эта ж цифра ничего пользователю не скажет smile.gif . Например, напишет, мол надо обработать 100000 записей, пользователь сразу запаникует, хотя по факту это может занять 30 минут smile.gif

Acid Подменю пользователя
сообщение 28.01.13, 14:02
Сообщение #14

Про1С-ник
Иконка группы
За заслуги на форуме в 2010 году
Группа: Местный
Сообщений: 2104
Из: Занзибар
Спасибо сказали: 377 раз
Рейтинг: 260.7

Вы меня не поняли.
Ну и еще один вариант - создать серверную функцию, кот. отслеживает сколько записей уже отработано. И из клиента обращаться к ней (с обработкой ожидания скажем 10сек), чтоб получить актуальное состояние.

Сообщение отредактировал Acid - 28.01.13, 14:03

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 12.05.24, 11:19
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!