Маленькая находка для организации задержки (того что делает функция sleep) в 1С
Некоторые наши обработки требуют нормализации нагрузки на дисковую подсистему и цп. Проще говоря хотелось бы иметь аналог функции sleep (старый добрый basic). Яркий пример - обработки для фонового перепроведения базы 1С. Обычно этот процесс достаточно тяжело нагружает дисковую подсистему и "съедает" ресурсы процессора. А это бесконечные транзакции у всех пользователей. Чтобы этого избежать хотелось бы иметь возможность периодически приостанавливать работу обработки. Но адекватно подходящего механизма в 1С 7.7 нет (как впрочем и в 1С 8). В статье речь о моей маленькой находке в этой области
28.01.2012 17:32 [29.01.2012 00:06] 8 [+] [−] Перейти к публикации
(5) Имеется ввиду не комп - "сервер", а режим. Т.е. если процедура с выводом предупреждения будет выполняться на стороне сервера, а не на клиенте
Ответили: (13)
(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(мсек);
(9) (10) (11) Все это имеет место быть, и я приводил подобный пример в статье. но мой способ мне понравился краткостью, в отличие от ваших
а процесс перепроведения вчера переделал и запустил под системной учеткой ( - так меня теперь полностью устраивает (теперь окошко предупреждения не переключает фокус на себя).
(15) Насчет этой функции вынужден огорчить, пробовал.... Замеры показали что нагрузка на ЦП во время выполнения этой функции колеблеться от 15% до 80%. Посему неприемлемо. Вызывает "висяки"...
---
А Предупреждение() дает нагрузку на ЦП почти нулевую...О чем и статья собственно. Не ожидал что Предупреждение() выгодно использовать
Тому кто поставил минус. Вам очевидно не попадались старые недосервера с высокой нагрузкой - где всю голову сломаешь пока не найдешь оптимальный способ задержки процесса 1с с минимальной загрузкой процессора. Если бы у вас была такая задача - поверьте вы бы тоже порадовались бы такой находке. Более того - замечу что я постарался дать легкий обзор всех существующих способов. Знаете - публикация может быть ценна не тонной оригинального кода, но и удачным обзором с выбором наиболее подходящего варианта решения! Я не вижу причины вашего минуса. Спасибо если прочитали.
---
P/S/ До сих пор периодически натыкаюсь на мелкие удачные находки в программировании на 1С 7.7. Это конечно копание в древности и вообще отстой выражаясь современным языком. Но я рад этому т.к. клиентов с изрядно переписанными конфами 7.7 которые не собираются переходить на 1С 8 - предостаточно пока
как вариант
| Код |
|---|
СписокКнопок = Новый СписокЗначений();
СписокКнопок.Добавить("Продолжить");
СписокКнопок.Добавить("ОтменитьВыполнениеОбработки", "Отменить выполнение обработки");
Ответ = Вопрос("Пауза...", СписокКнопок, 30);
Если Ответ="ОтменитьВыполнениеОбработки" Тогда
Сообщить("Прервано пользователем...");
Возврат;
КонецЕсли; |
Работает на клиенте, не грузит проц, добавляется возможность прерывания (опционально, не обязательно, можно и одну кнопку оставить)
8 [+] [−] Перейти к публикации
Старо, как сама 1С. Сами способы организации задержки
Ответили: (4) (7) (20)