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

05.04.16

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

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

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
ОбработкаНаСервереСИндикатором83.epf
.epf 7,84Kb
154 2 500 руб. Купить
ОбработкаНаСервереСИндикатором.epf
.epf 7,26Kb
320 2 500 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

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

Оформить подписку и скачать решение со скидкой

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

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

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

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

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

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

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

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

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

   
// Обработка

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

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

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

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

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

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

    КонецЦикла;

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

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

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

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

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

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

    КонецЦикла;

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

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

    КонецЕсли;

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

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Работа с интерфейсом Анализ учета Мониторинг 1С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!

31720 руб.

27.03.2025    86938    62    42    

73

Работа с интерфейсом Программист 1С:Предприятие 8 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

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

5246 руб.

29.06.2020    25260    34    6    

53

Консолидация данных Работа с интерфейсом Программист Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)

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

6088 руб.

17.10.2025    2514    3    0    

2

Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)

Разработка "Дизайнер форм 1С" реализована в виде расширения 1С и является универсальным инструментом для разработки прототипа форм с целью демонстраций, технических заданий и т.д. Без участия разработчика с возможностью экспорта в файл внешней обработки и генерации формы используя искусственный интеллект.

36600 руб.

28.08.2025    8549    2    2    

6

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    61389    dimanich70    86    

176

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    26384    YA_418728146    8    

175

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

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

2 стартмани

22.08.2023    9392    118    progmaster    23    

6

Работа с интерфейсом Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

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

1 стартмани

05.07.2022    14640    kalyaka    8    

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

а оказалось, вызов сервера куда более затратен
2. Evg-Lylyk 5463 01.10.10 17:18 Сейчас в теме
Приблизительно о том же писал здесь http://infostart.ru/public/71407/
3. acsent 1207 01.10.10 17:22 Сейчас в теме
Основная фишка в том, чтобы получить выборку данных на сервере и не передавать ее на клиент
4. Evg-Lylyk 5463 01.10.10 18:00 Сейчас в теме
(3) Согласен это важно. Разумно осуществлять индикацию раз в секунду тогда будет меньше вызовов сервера... упростится код
5. Mopo3 336 07.06.11 19:02 Сейчас в теме
Имх лучше из клиента вызывать обработчик ожидания каждую секунду, который читает из временного хранилища счетчик итераций обработки. Счетчик итераций во временном хранилище обновляет сам обработчик данных. Зная общее количество состояние вывести просто.
dj_serega; f.lex; tulakin_s; leonidol; yandextesting; ll13; +6 1 Ответить
9. KillerMann 189 12.02.14 12:14 Сейчас в теме
(5) Mopo3, идея у автора хорошая. А вот Вашу не поддерживаю. Каким образом отработает обработчик ожидания на клиенте если на серверной части будет крутиться процедура(функция) обработки результата запроса? Если знаете решение, то пример в студию, только заведомо рабочий. А пока минус за ответ, т.к. считаю ответ вводящий в заблуждение.
evseevoleg; +1 Ответить
10. acsent 1207 12.02.14 12:23 Сейчас в теме
(5) Чтоб подключить обработчик нужно запускать фоновое задание. А чтоб его запускать нужно изменять конфигурацию
11. KillerMann 189 12.02.14 12:49 Сейчас в теме
(10) на сколько я понял Mopo3 имел ввиду ПодключитьОбработчикОжидания() в модуле формы, а обработка ожидания не отработает пока не выполнится процедура(функция) на сервере. Или я чего-то не знаю? Речь та не шла за регламентные задания. Если есть решение для не типовой конфигурации и так чтобы можно было воспользоваться методом ПодключитьОбработчикОжидания(), то прошу поподробней описать, в жизни пригодится.
14. doom2good 155 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 1477 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 103 20.10.15 23:09 Сейчас в теме
Попробовал, отлично работает. Спасибо автору.
16. Rabin 53 08.03.21 11:11 Сейчас в теме
Подскажите пожалуйста, чем является АдресДанных? Глобальной переменной? Реквизитом формы?
17. acsent 1207 08.03.21 14:58 Сейчас в теме
Для отправки сообщения требуется регистрация/авторизация