Обработка на сервере с индикатором (упр. приложение)

05.04.16

Разработка - Работа с интерфейсом

Обработка на сервере с отображением процесса загрузки и возможностью прерывания

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

Наименование Файл Версия Размер
ОбработкаНаСервереСИндикатором83.epf
.epf 7,84Kb
142
.epf 7,84Kb 142 Скачать
ОбработкаНаСервереСИндикатором.epf
.epf 7,26Kb
318
.epf 7,26Kb 318 Скачать

&НаСервере
Функция ИнициализацияОбработкиСервер()

   
Запрос = Новый Запрос;
   
Запрос.Текст =
   
"ВЫБРАТЬ
    |   Спр.Ссылка
    |ИЗ
    |   Справочник.Банки КАК Спр"
;

   
Данные      = Запрос.Выполнить().Выгрузить();
   
АдресДанных = ПоместитьВоВременноеХранилище(Данные, УникальныйИдентификатор);

 
  // Обработка
    // В справочнике ~ 4000 элементов

    Возврат Данные.Количество();

КонецФункции

&НаСервереБезКонтекста
Функция ОбработатьЭлемент(ДанныеЭлемента)

   
СпрОбъект = ДанныеЭлемента.Ссылка.ПолучитьОбъект();

   
// Обработка

   
СпрОбъект.ОбменДанными.Загрузка = Истина;
   
СпрОбъект.Записать();

КонецФункции

&НаСервереБезКонтекста
Функция ОбработатьПорциюНаСервере(Начало, Конец, АдресДанных)

   
Данные = ПолучитьИзВременногоХранилища(АдресДанных);

    Для
Счетчик = Начало - 1 По Конец - 1 Цикл

       
ОбработатьЭлемент(Данные[Счетчик]);

    КонецЦикла;

КонецФункции

&НаКлиенте
Процедура ВыполнитьОбработку(Команда)

   
Количество      = ИнициализацияОбработкиСервер();
   
РазмерШага      = 10;
   
КоличествоШагов = Цел(Количество / РазмерШага);
   
КоличествоЦел   = КоличествоШагов * РазмерШага;

    Если
КоличествоЦел < Количество Тогда
       
Элементы.Индикатор.МаксимальноеЗначение = КоличествоШагов + 1;
    Иначе
       
Элементы.Индикатор.МаксимальноеЗначение = КоличествоШагов;
    КонецЕсли;

    Для
Счетчик = 1 По КоличествоШагов Цикл

       
ОбработатьПорциюНаСервере(РазмерШага * (Счетчик - 1) + 1, РазмерШага * Счетчик, АдресДанных);
       
Индикатор = Счетчик;
       
ОбработкаПрерыванияПользователя();
       
ОбновитьОтображениеДанных();

    КонецЦикла;

    Если
КоличествоЦел < Количество Тогда

       
ОбработатьПорциюНаСервере(КоличествоШагов * РазмерШага + 1, Количество, АдресДанных);
       
Индикатор = Индикатор + 1;

    КонецЕсли;

КонецПроцедуры

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

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

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61797    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

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

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54403    16    21    

42

Управление дашбордами

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

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    16698    21    4    

35

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

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

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3665    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12080    1    5    

10

Условное оформление элементов форм в пользовательском режиме 1С (управление видимостью и доступностью элементов форм)

Работа с интерфейсом Платформа 1С v8.3 Платные (руб)

Подсистема условного оформления элементов форм (далее подсистема) предназначена для настройки оформления элементов форм (видимость, доступность, цвет фона, цвет текста и прочее) в пользовательском режиме 1С. Также подсистему возможно использовать для ограничения доступа к реквизитам формы для определенных пользователей (или групп пользователей).

6000 руб.

18.01.2022    8810    1    2    

6
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. acsent 1199 30.09.10 17:44 Сейчас в теме
Думал, что самая затратная прцедура будет
Данные = ПолучитьИзВременногоХранилища(АдресДанных);

а оказалось, вызов сервера куда более затратен
2. Evg-Lylyk 4559 01.10.10 17:18 Сейчас в теме
Приблизительно о том же писал здесь http://infostart.ru/public/71407/
3. acsent 1199 01.10.10 17:22 Сейчас в теме
Основная фишка в том, чтобы получить выборку данных на сервере и не передавать ее на клиент
4. Evg-Lylyk 4559 01.10.10 18:00 Сейчас в теме
(3) Согласен это важно. Разумно осуществлять индикацию раз в секунду тогда будет меньше вызовов сервера... упростится код
5. Mopo3 331 07.06.11 19:02 Сейчас в теме
Имх лучше из клиента вызывать обработчик ожидания каждую секунду, который читает из временного хранилища счетчик итераций обработки. Счетчик итераций во временном хранилище обновляет сам обработчик данных. Зная общее количество состояние вывести просто.
dj_serega; f.lex; Krio2; leonidol; yandextesting; ll13; +6 1 Ответить
9. KillerMann 178 12.02.14 12:14 Сейчас в теме
(5) Mopo3, идея у автора хорошая. А вот Вашу не поддерживаю. Каким образом отработает обработчик ожидания на клиенте если на серверной части будет крутиться процедура(функция) обработки результата запроса? Если знаете решение, то пример в студию, только заведомо рабочий. А пока минус за ответ, т.к. считаю ответ вводящий в заблуждение.
evseevoleg; +1 Ответить
10. acsent 1199 12.02.14 12:23 Сейчас в теме
(5) Чтоб подключить обработчик нужно запускать фоновое задание. А чтоб его запускать нужно изменять конфигурацию
11. KillerMann 178 12.02.14 12:49 Сейчас в теме
(10) на сколько я понял Mopo3 имел ввиду ПодключитьОбработчикОжидания() в модуле формы, а обработка ожидания не отработает пока не выполнится процедура(функция) на сервере. Или я чего-то не знаю? Речь та не шла за регламентные задания. Если есть решение для не типовой конфигурации и так чтобы можно было воспользоваться методом ПодключитьОбработчикОжидания(), то прошу поподробней описать, в жизни пригодится.
14. doom2good 136 10.11.15 11:55 Сейчас в теме
(5) Mopo3,
Не подскажете, как реализовать через ПодключитьОбработчикОжидания()?
в моем варианте
Процедура ВыполнитьОбработку(Команда)
	
	ПодготовитьДанныеСервер();
	МаксимальноеЗначение = КоличествоДанныхВХранилище();
	
	ПодключитьОбработчикОжидания("ОбновитьСтатус", 1);
	ПодключитьОбработчикОжидания("ОбработатьДокументы", 1, Истина);

КонецПроцедуры
Показать


&НаКлиенте
Процедура ОбновитьСтатус()

	ОстатокЭлементов = КоличествоДанныхВХранилище();
	ВсегоЭлементов = МаксимальноеЗначение;
	
	Состояние("Обработка документов", 100 - ОстатокЭлементов /(ВсегоЭлементов/100), "Документы обрабатываются...");
	
	Если ОстатокЭлементов = 0 Тогда
	
		ОтключитьОбработчикОжидания("ОбновитьСтатус");
		Предупреждение("Обработка завершена!");
	
	КонецЕсли;

КонецПроцедуры
Показать


&НаКлиенте
Процедура ОбработатьДокументы()

	ОбработатьДокументыСервер(АдресХранилищаДанных, АдресХранилищаКоличества);

КонецПроцедуры

&НаСервереБезКонтекста
Процедура ОбработатьДокументыСервер(АдресХранилищаДанных, АдресХранилищаКоличества)

	НепроведенныеДокументы = ПолучитьИзВременногоХранилища(АдресХранилищаДанных);
	
	ВсегоДокументов = НепроведенныеДокументы.Количество();
	
	Для Каждого цДокумент Из НепроведенныеДокументы Цикл
		
		обработатьДокумент(цДокумент);
		
		ВсегоДокументов = ВсегоДокументов - 1;
		ПоместитьВоВременноеХранилище(ВсегоДокументов, АдресХранилищаКоличества);
		
	КонецЦикла;

КонецПроцедуры
Показать


В этом случае у меня появляется индикатор, но выполнение уходит на сервер и после выполнения индикатор перескакивает с 0% сразу на 100%.
15. TreeDogNight 22 08.07.16 06:33 Сейчас в теме
(14) doom2good, Меня тоже интересует этот вопрос.Ещё не нашли решение?
6. Yury1001 1470 03.05.12 12:24 Сейчас в теме
Отлично работает с выборкой результата запроса – ничего не сбивается.
Вызов сервера действительно затратный по времени, если делить это тысячи раз, будет ощутимо, и потому можно реализовать возврат по таймеру, ну там раз в 3 секунды, например.
7. Den_D 54 06.06.12 10:13 Сейчас в теме
Мне кажется к данной проблеме нет однозначного подхода и универсального решения.
Однако какие-то решения в определенных условиях являются лучшими.
8. juntatalor 63 08.07.13 02:16 Сейчас в теме
Раньше реализовывал индикацию данных также, как у вас.

Плюсы: точность отображения, легкий вывод сообщений на сервере, общее удобство

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

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

И насчет Данные = ПолучитьИзВременногоХранилища(АдресДанных) - они скорее всего кешируются в памяти, поэтому и вызов быстрый.
12. E_x 25.03.14 10:49 Сейчас в теме
Благодарю пользователя, это то, что надо. Немного адаптировал под работу со стандартным методом Состояние() и вообще огонь. Еще раз спасибо!
13. Bor_ka 100 20.10.15 23:09 Сейчас в теме
Попробовал, отлично работает. Спасибо автору.
16. Rabin 50 08.03.21 11:11 Сейчас в теме
Подскажите пожалуйста, чем является АдресДанных? Глобальной переменной? Реквизитом формы?
17. acsent 1199 08.03.21 14:58 Сейчас в теме
Оставьте свое сообщение