Маленькая находка для организации задержки (того что делает функция sleep) в 1С

Маленькая находка для организации задержки (того что делает функция sleep) в 1С

Некоторые наши обработки требуют нормализации нагрузки на дисковую подсистему и цп. Проще говоря хотелось бы иметь аналог функции sleep (старый добрый basic). Яркий пример - обработки для фонового перепроведения базы 1С. Обычно этот процесс достаточно тяжело нагружает дисковую подсистему и "съедает" ресурсы процессора. А это бесконечные транзакции у всех пользователей. Чтобы этого избежать хотелось бы иметь возможность периодически приостанавливать работу обработки. Но адекватно подходящего механизма в 1С 7.7 нет (как впрочем и в 1С 8). В статье речь о моей маленькой находке в этой области


28.01.2012 17:32 [29.01.2012 00:06] (seakuban) Сергей Белоус 8 [+] [−] Перейти к публикации

Страницы: 1
1.
Поручик 29.01.12 3:05 URL

Старо, как сама 1С. Сами способы организации задержки находятся в гугле за несколько секунд

Ответили: (4) (7) (20)

2.
lukoyanovas 29.01.12 10:15 URL

"Предупреждение" на сервере недоступно

Ответили: (5)

3.
DrAku1a 29.01.12 13:27 URL

На клиенте, когда отрабатывается с задержкой в 1С - не возможно параллельно работать т.к. сообщения постоянно переключают фокус на окно выполняющейся программы.

Ответили: (6)

4.
seakuban 29.01.12 15:26 URL

(1) Ну извините я в инете не искал. Действительно все что я написал люди уже знали. Но я рад что до всего этого я дошел сам

5.
seakuban 29.01.12 15:26 URL

(2) в каком смысле? у меня эта процедура на сервере запущена

Ответили: (8)

6.
seakuban 29.01.12 15:28 URL

(3) это верно. но можно запустить под системной учеткой (http://infostart.ru/public/101168/). и все будет шоколадно

7.
seakuban 29.01.12 15:37 URL

(1) буду теперь прежде чем постить что то - проверять на аналоги в инете. спасибо что натолкнул на мысль. Извиняйте товарищи кому публикация показалась старьем((

8.
lukoyanovas 29.01.12 16:00 URL

(5) Имеется ввиду не комп - "сервер", а режим. Т.е. если процедура с выводом предупреждения будет выполняться на стороне сервера, а не на клиенте

Ответили: (13)

9.
vladal 29.01.12 16:10 URL

(0) Вот 2 варианта:

Процедура Спать(Время)
Если Время = 0 Тогда
Возврат
КонецЕсли;
Сигнатура = Формат(ТекущаяДата(), "ДФ=yyyyMMddhhmmss");
ПутьСкрипта = КаталогВременныхФайлов()+"SleepScript"+Сигнатура+".vbs";
СкриптФайл = Новый ТекстовыйДокумент;
СкриптФайл.ДобавитьСтроку("WScript.Sleep("+Формат(Время*1000, "ЧГ=0")+")");
СкриптФайл.Записать(ПутьСкрипта, КодировкаТекста.OEM);
WSHShell = Новый COMОбъект("WScript.Shell");
WSHShell.Run("wscript.exe """+ПутьСкрипта+"""", 0, Истина);
УдалитьФайлы(ПутьСкрипта);
КонецПроцедуры

или так:

Wrapper=Новый ComОбъект("DynamicWrapper");
Wrapper.Register("KERNEL32.DLL","Sleep","i=l","f=s");
Wrapper.Sleep(мсек);

Ответили: (14) (27)

12.
BalVlad 29.01.12 16:17 URL

Очень хорошая подборка (некоторые использую сам) есть на http://wiki.oszone.net/index.php/%D0%9F%D0%B0%D1%83%D0%B7%D0%B0_%D0%B2_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BD%D0%BE%D0%BC_%D1%84%D0%B0%D0%B9%D0%BB%D0%B5

13.
seakuban 29.01.12 16:24 URL

(8) согласен. но в первую очередь речь шла в публикации о 7.7 как более бедной возможностями

Ответили: (15)

14.
seakuban 29.01.12 16:27 URL

(9) (10) (11) Все это имеет место быть, и я приводил подобный пример в статье. но мой способ мне понравился краткостью, в отличие от ваших
а процесс перепроведения вчера переделал и запустил под системной учеткой (http://infostart.ru/public/101168/) - так меня теперь полностью устраивает (теперь окошко предупреждения не переключает фокус на себя).

15.
vladal 29.01.12 16:35 URL

(13) Тогда для 7.7 пользуй недокументированную функцию:

Функция sleep(Задержка)
Старт = _getPerformanceCounter();
Пока (Старт + Задержка > _getPerformanceCounter()) Цикл
КонецЦикла;
КонецФункции

getPerformanceCounter часто в игрушках вызывают.

Ответили: (16)

16.
seakuban 29.01.12 16:47 URL

(15) Насчет этой функции вынужден огорчить, пробовал.... Замеры показали что нагрузка на ЦП во время выполнения этой функции колеблеться от 15% до 80%. Посему неприемлемо. Вызывает "висяки"...
---
А Предупреждение() дает нагрузку на ЦП почти нулевую...О чем и статья собственно. Не ожидал что Предупреждение() выгодно использовать

17.
seakuban 29.01.12 16:49 URL

Предупреждение() дает нагрузку на ЦП почти нулевую...О чем и статья собственно. Не ожидал что Предупреждение() выгодно использовать
Подчеркиваю - об этом и статья. Я не знаю другого более элегантного способа вызвать задержку с мин. загрузкой процессора

Ответили: (18)

18.
hasp_x 29.01.12 17:03 URL

(17) а нельзя окно предупреждения как-то вообще убрать?

Ответили: (19)

19.
seakuban 29.01.12 17:06 URL

(18) я пользуюсь способом изложенным (http://infostart.ru/public/101168/). Для этого нужно запустить 1с под системной учетной записью, которая не показывает никаких интерактивных признаков жизни.

20.
hogik 29.01.12 22:08 URL

(0)
Мне понравился литературный прием: "покурил..."(с) :-)
А сам способ задержки - нет. Т.к. частенько (для 7.7) возникает ситуация, когда этот диалог переходит в "вечное" ожидание. И требуется нажатие "кнопки" пользователем...
P.S. Согласен с (1) сообщением.

21.
happyden 29.01.12 23:02 URL

:) 1С - это как изобретение машины, только без тормозов... ведь какой русский не любит быстрой езды

Изменено: happyden - 29.01.12 23:03
22.
Арчибальд 30.01.12 8:35 Модератор URL

Мне время от времени требуется задержка этак миллисекунд на 30-40 (время надежного срабатывания COM-порта). Все описанное не подходит, к сожалению...

Ответили: (24) (27)

23.
pumbaE 30.01.12 12:07 URL

Усложняем задачу: linux, задержка на сервере, кто как реализовывает?

24.
seakuban 30.01.12 15:12 URL

(22) Арчибальд, почему не подходит если не секрет?

Ответили: (26)

25.
seakuban 30.01.12 15:20 URL

Тому кто поставил минус. Вам очевидно не попадались старые недосервера с высокой нагрузкой - где всю голову сломаешь пока не найдешь оптимальный способ задержки процесса 1с с минимальной загрузкой процессора. Если бы у вас была такая задача - поверьте вы бы тоже порадовались бы такой находке. Более того - замечу что я постарался дать легкий обзор всех существующих способов. Знаете - публикация может быть ценна не тонной оригинального кода, но и удачным обзором с выбором наиболее подходящего варианта решения! Я не вижу причины вашего минуса. Спасибо если прочитали.
---
P/S/ До сих пор периодически натыкаюсь на мелкие удачные находки в программировании на 1С 7.7. Это конечно копание в древности и вообще отстой выражаясь современным языком. Но я рад этому т.к. клиентов с изрядно переписанными конфами 7.7 которые не собираются переходить на 1С 8 - предостаточно пока

Изменено: seakuban - 30.01.12 15:23 (дополнил аргументами)
26.
Арчибальд 31.01.12 8:15 Модератор URL

(24) Потому, что нужны миллисекунды, а не секунды.

27.
vladal 31.01.12 13:47 URL

(22) Ух ты! Низкоуровневый доступ на порт из 1С?
Тогда в (9) загляни - в одной функции убрать множитель 1000, во второй параметр сразу в миллисекундах указывается.

28.
Serj1C 01.02.12 8:01 URL

как вариант

Код
   СписокКнопок = Новый СписокЗначений();
   СписокКнопок.Добавить("Продолжить");
   СписокКнопок.Добавить("ОтменитьВыполнениеОбработки", "Отменить выполнение обработки");
   Ответ = Вопрос("Пауза...", СписокКнопок, 30);
   Если Ответ="ОтменитьВыполнениеОбработки" Тогда
      Сообщить("Прервано пользователем...");
      Возврат;
   КонецЕсли;

Работает на клиенте, не грузит проц, добавляется возможность прерывания (опционально, не обязательно, можно и одну кнопку оставить)

29.
ShEvOvIcH 02.02.12 20:29 URL

Зачет. Когда увидел название статьи сразу подумал о Предупреждении(), когда зашел, увидел что угадал. Просто и без излишеств.
А так я бы советовал пересмотреть модуль проведения и возможно сделать частичное перепроведение.

Страницы: 1

8 [+] [−] Перейти к публикации