8.х Индикатор в тонком клиенте

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем OXED, 1 сен 2014.

  1. TopicStarter Overlay
    OXED
    Offline

    OXED Опытный в 1С

    Регистрация:
    10 апр 2012
    Сообщения:
    256
    Симпатии:
    0
    Баллы:
    26
    Добрый день. Подскажите пожалуйста как реализовать вот такую задумку:

    Есть внешняя обработка, которая запускается в тонком клиенте.
    В обработке есть кнопка, которая вызывает процедуру "Сформировать".
    Из нее вызывается процедура на сервере (!!!) "СформироватьНаСервере", внутри которой обрабатывается 2000+строк. На форме обработки есть индикатор, в который необходимо передавать состояние обработки этих строк. Проблема в том, что запустить обработку строк на клиенте не могу, а при заполнении индикатора на сервере он визуально отображается только после обработки всех 2000 строк и окончания работы серверной процедуры. Т.е. сначала состояние 0%, потом при клике по кнопке обрабатывается все 2000 строк, и состояние становится 100%. Можно ли как-то в процессе работы серверной процедуры передавать значение в индикатор, чтобы он визуально обновлял информацию и полз к 100% постепенно?

    Код:
    &НаКлиенте
    Процедура Сформировать(Команда)
       
        Состояние("Формируется список контрагентов...");
        СформироватьНаСервере();
        Состояние("Список контрагентов сформирован!");
           
    КонецПроцедуры
    
    &НаСервере
    Процедура СформироватьНаСервере()
       
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ 
            |    Контрагенты.Ссылка,
            |    Контрагенты.ИНН,
            |    Контрагенты.КПП
            |ИЗ
            |    Справочник.Контрагенты КАК Контрагенты";
        Результат = Запрос.Выполнить().Выгрузить();
    
        Объект.Список.Очистить();    //Очищаем табличную часть,чтобы не дублировать строки
        Для Каждого Строка Из Результат Цикл
            НоваяСтрока = Объект.Список.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока,Строка);
            НоваяСтрока.Синхронизировать = ПроверитьНеобходимостьСинхронизации(Строка);
            Индикатор = Индикатор + 1;
        КонецЦикла;
       
    КонецПроцедуры
    
  2. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.987
    Симпатии:
    398
    Баллы:
    104
    Ну разве что функция, которая будет возвращать число индикатора. В принципе возможно. Или например в глобальную переменную все записывать.
  3. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.439
    Симпатии:
    374
    Баллы:
    104
    ?
    Код:
    Глобальный контекст.Состояние (Global context.Status)
    Глобальный контекст (Global context)
    Состояние (Status)
    Синтаксис:
    
    Состояние(<ТекстСообщения>, <Прогресс>, <Пояснение>, <Картинка>)
    Параметры:
    
    <ТекстСообщения> (необязательный)
    
    Тип: Строка. 
    Строка, предназначенная для вывода в панель состояния. Если параметр не указан, возобновляется вывод системного текста в панель состояния.
    <Прогресс> (необязательный)
    
    Тип: Число. 
    Значение индикатора прогресса (от 1 до 100). 
    Если не задан, индикатор прогресса не отображается.
    <Пояснение> (необязательный)
    
    Тип: Строка. 
    Текст пояснения.
    <Картинка> (необязательный)
    
    Тип: Картинка. 
    Картинка.
    Описание:
    
    Выводит текст в панель состояния.
    Доступность:
    
    Тонкий клиент, веб-клиент, толстый клиент.
    Примечание:
    
    Для режима запуска ОбычноеПриложение используется только параметр <ТекстСообщения>, а вывод текста осуществляется в панель состояния.
    Пример:
    
    Состояние("Выполняется обновление информационной базы");
      Методическая информация
    
    
  4. saha25
    Offline

    saha25 Опытный в 1С

    Регистрация:
    30 окт 2007
    Сообщения:
    95
    Симпатии:
    3
    Баллы:
    29
    в данном случае задачу нужно разбить на 2, сама обработка и вывод
    Сначала запросом получаете данные, записываете их в хранилище. Возвращаетесь на клиента. Получаете кол-во записей, инициируете свой индикатор ну и прочие сообщения, если таковые есть
    Далее цикл типа


    Код:
    Пока Выполнять Цикл
          Выполнять=СделатьЧтотоНаСервере()
          ОбновитьМойИндикатор();
    КонецЦикла;
    Код:
    &НаСервере
    Функция СделатьЧтотоНаСервере(Прерываться=Истина)
            НачалоРаботы=ТекущаяДата();
            Выборка=ПолучитьИзВременногоХранилища(Адрес)
            Пока Выборка.Следующий() Цикл
            ... тут что-нибудь полезное
        
        
                 Если Прерываться Тогда
                     Если НачалоРаботы<>ТекущаяДата() Тогда
                        Возврат Истина;
                     КонецЕсли;
                 КонецЕсли;
          КонецЦикла;
          Возврат Ложь;
    КонецФункции
    Как-то так, в результате индикатор будет обновляться раз в секунду

Поделиться этой страницей