Имя: Пароль:
1C
1С v8
Как в 1С кошерно реализовать задержку (delay, sleep и т. д.)?
0 PR
 
01.11.13
12:04
1. Пустой цикл некошерен, я знаю кошерное решение... 60% (6)
2. Пустой цикл вполне кошерен 30% (3)
3. Пустой цикл некошерен, я не знаю кошерного решения 10% (1)
Всего мнений: 10

Из вариантов я знаю пустой цикл, но тут многие предлагают за тако расстреливать, как за GOTO.
А что в нем некошерного, кстати?
И какие есть кошерные решения? Или их нет? :))
1 vhl
 
01.11.13
12:06
wsh
2 PR
 
01.11.13
12:06
(1) 70
3 mikecool
 
01.11.13
12:07
сходи в КЗ чтоле
4 vhl
 
01.11.13
12:08
Процедура Пауза(ИнтервалОжидания=1000) Экспорт
    #Если Клиент Тогда
    Скрипт=Новый ТекстовыйДокумент;
    Скрипт.УстановитьТекст
    (
    "if (WScript.Arguments.Count()==0)
    |    WScript.Quit();
    |else
    |    if (isNaN(parseInt(WScript.Arguments(0))))
    |        WScript.Quit();
    |WScript.Sleep(WScript.Arguments(0));"
    );
    Скрипт.Записать(КаталогВременныхФайлов()+"sleep.js",КодировкаТекста.ANSI);
    WshShell=Новый COMОбъект("wscript.shell");
    WshShell.Run("wscript.exe """+КаталогВременныхФайлов()+"sleep.js"" "+Формат(ИнтервалОжидания,"ЧГ=0"),0,-1);
    УдалитьФайлы(КаталогВременныхФайлов()+"sleep.js");
    #КонецЕсли
конецпроцедуры

Не помню у кого украл
5 PR
 
01.11.13
12:09
(3) Там есть кошерное решение или ты так просто сказал? :))
6 0xFFFFFF
 
01.11.13
12:09
Цикл тогда уж с запросом. Так надежнее.
7 H A D G E H O G s
 
01.11.13
12:09
Функция Sleep/SleepEx библиотеки Kernel32.dll

Остальное - хрень.
8 Lama12
 
01.11.13
12:09
Остальные варианты привязаны к ОС сервера приложений.

Пустой цикл вполне кошерен
9 PR
 
01.11.13
12:10
(4) Это кошернее пустого цикла?
10 Lama12
 
01.11.13
12:10
(7) И как это будет работать на линуксе?
В 8.3 и клиент может работать в линуксе.
11 vhl
 
01.11.13
12:11
(9) Ты вообще понимаешь в чем разница между пусты циклом и командой sleep?
12 H A D G E H O G s
 
01.11.13
12:11
(10) Линукс? Не, не слышал.
13 1dvd
 
01.11.13
12:12
(10) Извращенцев в расчет не берём
14 МихаилМ
 
01.11.13
12:12
для серверного варианта
через ОжидатьЗавершения реализуется. но с точностью до 2 сек
15 йети
 
01.11.13
12:13
прыгай от ТекущаяУниверсальнаяДатаВМиллисекундах()
16 PR
 
01.11.13
12:13
(11) Понимаю.
В данном случае 1С будет ждать окончания работы скрипта?
17 Lama12
 
01.11.13
12:13
(15) О! Кстати вариант.
18 Зойч
 
01.11.13
12:14
кошерно не реализовывать задержку, а делать на событиях
19 vhl
 
01.11.13
12:15
(16) Билин, а нафига эта функция по твоему нужна?!!!
20 PR
 
01.11.13
12:17
(18) Как ты это собираешься делать в общем случае?
21 PR
 
01.11.13
12:17
(19) Тогда задам вопрос по-другому.
Чем она кошернее пустого цикла? :))
22 vhl
 
01.11.13
12:18
(21) DAFAQ? Пустой цикл тебе загрузит процессор на 100%, а sleep на 0. Еще вопросы?
23 SoulPower
 
01.11.13
12:19
Предыстория создания ветки:
Необходимо реализовать задержку после загрузки страницы в ИЕ.
Подождать пока загрузиться страничка.

Я сделал:
While IE.ReadyState < 4 Do EndDo;

Роман говорит - не кошерно, нужен обработчик ожидания.

Конкретно для этой задачи.

Пустой цикл вполне кошерен
24 mikeA
 
01.11.13
12:20
(0) ну так чисто чтоб поржать:

    cmdLine= "ping -n " + Формат(ЧислоСекунд + 1, "ЧГ=0") + " 127.0.0.1";
    WshShell = Новый COMОбъект("WScript.Shell");
    WshShell.Run(cmdLine, 0, -1);

Пустой цикл некошерен, я знаю кошерное решение...
25 Зойч
 
01.11.13
12:20
(20) зачем нужны общие случаи???
26 Зойч
 
01.11.13
12:22
(23) у хтмл документа есть событие - документ сформирован
27 SoulPower
 
01.11.13
12:22
В голосовалке явно нужен пункт - 4. Своё мнение.
28 vhl
 
01.11.13
12:27
(18) На самом деле верно. Последний раз заморачивался паузами лет 6 назад когда был новчиком. Сейчас почему-то все стандартными механизмами получается - вроде (26).
29 SoulPower
 
01.11.13
12:28
(26) Как мне юзать это событие для Com объекта IE ?
30 Ksandr
 
01.11.13
12:33
вот пятничное решение:
Берем плату stm32 к ней цепляем реле, провод из розетки через реле к человеку-таймеру

void main()
{

// Не забудь инициализировать GPIO здесь.

// Инициализация таймера
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

TIM_TimeBaseInitTypeDef timer_base;
TIM_TimeBaseStructInit(&timer_base);
timer_base.TIM_Prescaler = 15;
timer_base.TIM_Period = #Задержка в мкс#
TIM_TimeBaseInit(TIM3, &timer_base);

TIM_Cmd(TIM3, ENABLE);

NVIC_EnableIRQ(TIM3_IRQn);

}

void TIM3_IRQHandler(void)
{
тут подаем 5В на реле
}

Пустой цикл некошерен, я знаю кошерное решение...
31 Fragster
 
модератор
01.11.13
12:36
зависит от контекста. на клиенте - обработчик ожидания, на сервере -

Процедура Пауза(Сек = 1) Экспорт
    Инфо = Новый СистемнаяИнформация();
    Если
        Инфо.ТипПлатформы = ТипПлатформы.Windows_x86 ИЛИ
        Инфо.ТипПлатформы = ТипПлатформы.Windows_x86_64
    Тогда
        ЗапуститьПриложение("ping -n " + Формат(1 + Сек, "ЧДЦ=0; ЧГ=") + " 127.0.0.1", , Истина); // windows
    Иначе
        ЗапуститьПриложение("ping -c " + Формат(1 + Сек, "ЧДЦ=0; ЧГ=") + " 127.0.0.1", , Истина); // linux
    КонецЕсли;
КонецПроцедуры
33 PR
 
01.11.13
12:39
(25) Ну как. Хочу процедуру, которая у меня вернет все обратно через x секунд :))
34 H A D G E H O G s
 
01.11.13
12:40
(30) А ты опасный парень
35 PR
 
01.11.13
12:41
(32) Конечно нет. Если говорить про общий случай.
37 PR
 
01.11.13
12:45
(36) Общий случай — это когда есть код из 100 000 000 000 000 000... строк кода и его принципиально нельзя и неправильно расхреначивать в разные процедуры, до и после обработчика ожидания.
То есть просто хотелось бы в нужных местах написать что-то типа ПодождемНемного(5) и все :))
38 User_Agronom
 
01.11.13
12:47
По сабжу. Точно да. Никогда не сталкивался. Когда-то что-то ваял на Delphi как-то хорошо обходилось. А сейчас таких задач не возникало.
Написал, чтобы почитать потом к какому выводу пришли.
(13) Не извращенцев. Просвященных :)

Пустой цикл некошерен, я не знаю кошерного решения
40 PR
 
01.11.13
12:48
(39) За шкафом :))
41 DJ Anthon
 
01.11.13
12:49
(39) создать видимость работы.
42 SoulPower
 
01.11.13
12:51
(39) - > (23)
43 Зойч
 
01.11.13
12:53
(41) клиент просто не заплатил, нужно немного затормозить работу его 1ски ))
45 Зойч
 
01.11.13
12:54
(44) в 8.3 не будет работать ))
47 SoulPower
 
01.11.13
12:56
(44) ты смешной.)
48 eklmn
 
гуру
01.11.13
12:57
Отойдите все от компьютера!
49 oleg_km
 
01.11.13
12:57
(43) В таком случае действительно лучше пустой цикл. Или чикл с вычислением синуса, чтобы и цифровой сопроцессор загрузить
51 WickeD
 
01.11.13
12:58
53 H A D G E H O G s
 
01.11.13
13:00
(51) Хрень.
54 toypaul
 
гуру
01.11.13
13:00
"Из вариантов я знаю пустой цикл, но тут многие предлагают за тако расстреливать, как за GOTO.
А что в нем некошерного, кстати?"

придется ополовинить 22
55 PR
 
01.11.13
13:02
(50) А как его можно не юзать, когда нужно что-то грузануть с нета, при этом весьма изощренно авторизоваться на сайте, попереходить по разным закладкам и прочее?
56 toypaul
 
гуру
01.11.13
13:03
(55) еще урезать половину от половины 22
58 PR
 
01.11.13
13:05
(54) Ну отрежь немного от полуметра, разрешаю :))
60 capitanjack1
 
01.11.13
13:09
Всё что предлагают в качестве "решений" тут полная туфта. Возьму конфу "Нетленка" оттуда внешнюю компоненту, в ней есть возможность паузы делать.
61 Повелитель
 
01.11.13
13:11
(57) Норм, сейчас встрою ))
62 User_Agronom
 
01.11.13
13:11
(31) Вариант ещё некошернее.
Конечно, похвастаться знанием работы с мультиплатформеностью здорово, но лучше всё- таки решать в пределах одной системы.
Например, так:

Процедура ДелАй(Сек = 1)
    СтартДата = ТекущаяДата();
    ТекДата = СтартДата;
    Пока ТекДата <= (СтартДата + Сек) цикл
        ТекДата = ТекущаяДата();
    КонецЦикла;
КонецПроцедуры

Этот способ тоже плох, но гораздо лучше 31-го.
63 Зойч
 
01.11.13
13:11
(59) если с помощью аякса страничка формируется, то не так просто ее получить будет обычными способами
64 VladZ
 
01.11.13
13:12
(0) Зачем?
65 User_Agronom
 
01.11.13
13:12
(57) Функция должна чего-то возвращать. Процедура наверное
66 le_
 
01.11.13
13:13
(0) Вот здесь расписано:
http://kb.mista.ru/article.php?id=98

А пустой цикл - это зло, которое процессор на 100% может загрузить.

Пустой цикл некошерен, я знаю кошерное решение...
67 Повелитель
 
01.11.13
13:13
(65) Необязательно
68 PR
 
01.11.13
13:15
(59) Да ХЗ.
Сначала не разобрались с обработкой ReadyState, а потом уж не стали переделывать.
69 PR
 
01.11.13
13:15
+(68) Опять же, могут быть проблемы со всякими FetElementByID возможно
70 МихаилМ
 
01.11.13
13:17
с точностью до секунд (+-5%)

можно использовать HTTPСоединение


Процедура КнопкаСформироватьНажатие(Кнопка)
    ввв();
КонецПроцедуры


Процедура ввв()
    Перем имяВыходногоФайла;
    
    
    имяВыходногоФайла = ПолучитьимяВременногоФайла("xml");
    ssl = Новый ЗащищенноеСоединениеOpenSSL();
    ыыы = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Соединение = Новый HTTPСоединение("http://www.rambler.ru",25 , , , ,10,ssl);     
    Попытка
        Соединение.Получить("getUsers.php?owner_id=263544&amp;count=100", имяВыходногоФайла);
    Исключение    
        ффф = ТекущаяУниверсальнаяДатаВМиллисекундах();
    Конецпопытки;    
    сообщить(ффф - ыыы);
    
КонецПроцедуры
72 Fragster
 
модератор
01.11.13
13:23
(62) ну, когда у тебя 100 юзеров крутят код из (31) - все работает, а когда (62) - не очень...
73 SoulPower
 
01.11.13
13:24
(50) В чем прикол юзать IE? Зачем?
Подробный MSDN. И нужно создавать десяток объектов для ускорения работы.

(59) И чем HTTPСоединение не устраивает, что можно сделать в IE чего нельзя через HTTPСоединение?
Как юзать хттп соединение для парсинга сайта?
74 SoulPower
 
01.11.13
13:26
(71) через хттп соединение кстати была проблема с программной авторизацией. В итоге остановились на банальной записи в узлы логин / пароль и методе клик().
75 dmpl
 
01.11.13
13:27
(0) 1С работает достаточно медленно, чтобы никогда не потребовалось дополнительная задержка.
76 User_Agronom
 
01.11.13
13:37
(72) ping localhost лучше, чем прочитать системное время?
Может и так, но аргументов мало. Неубедительно.
79 PR
 
01.11.13
13:48
(77) POST-запрос нужно еще разобраться как сделать, а тут Click и все.
И потом, в IE есть DOM-модель, а в HTTPСоединении она есть?
80 SoulPower
 
01.11.13
13:58
(77) Это понятно, что быстрей и правильней. Только вот разбираться с этим не стали, так как dom модель очевидней.
А так бы да - посылать запросы и парсить ответы в 100 раз быстрей. Но переделывать, думаю, слишком затратно будет.
83 SoulPower
 
01.11.13
14:14
(82) Думаю, дойдёт дело до того, что сделаем всё по уму. А пока так работает, но медленно.
84 Fragster
 
модератор
01.11.13
14:26
(76) ну запусти свой код и посмотри в загрузку проца. а потом - мой...
85 vhl
 
01.11.13
14:52
(74) Решили бы сразу правильно - не пришлось бы подпирать теперь.
86 vhl
 
01.11.13
14:53
(84) Это еще в (22) объяснено. Но людям пофиг, зачем читать тему...
87 vhl
 
01.11.13
14:56
(83) +работало бы быстрее +не пришлось бы переделывать в итоге :)))
88 User_Agronom
 
01.11.13
15:01
(84) Если клиент-серверная (а 100 юзеров только так), то пофиг: проц то будет грузиться на клиенте.

Синтаксис:

ТекущаяДата()
Возвращаемое значение:

Тип: Дата.
Текущая (системная) дата.
Описание:

Определяет текущую (системную) дату на компьютере.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
89 Fragster
 
модератор
01.11.13
15:10
(88) т.е. ты не в курсе про то, что код может выполняться на сервере, что пользователи (несмотря на клиент-серверную архитектуру 1с) могут быть все в одном месте (ну например в терминале), что есть фоновые задания и т.д. и т.п.

И да, если код таки выполняется на клиенте, то вместо того, чтобы отправлять пользователя курить загружая его комп - лучше сделать через обработчик ожидания, о чем я в (32) и написал
90 skunk
 
01.11.13
15:16
ping 127.0.0.1 -m
91 skunk
 
01.11.13
15:17
ой ... ping 127.0.0.1 -w
92 skunk
 
01.11.13
15:17
как-то так

Пустой цикл некошерен, я знаю кошерное решение...
93 oleg_km
 
01.11.13
15:39
Мне только не понятно, как может управлять задержкой
ping 127.0.0.1 -w 1000 -n 1

Ведь таймаут в 1 сек, например, сработает, только если от хоста нет ответа, но 127.0.0.1 всегда отдаст ответ и как правило менее милисекунды. Чтобы ping висел весь таймаут, пингуемый хост не должен пинговаться должен, например:

В сети 192.168.0.0
ping 1.0.0.1 -w 1000 -n 1
будет гарантированно висеть 1 секунду, т.к. хост 1.0.0.1 отсутствует в исходной подсети, но и не маршрутизируется
94 dmpl
 
01.11.13
15:51
Вот, кстати, вариант, как параллельно дисциплинировать пользователей:


    СписокКнопок = Новый СписокЗначений;
    СписокКнопок.Добавить("Не нажимать!");
    Пока (Вопрос("Ждем-с...", СписокКнопок, ВремяЗадержки) <> КодВозвратаДиалога.Таймаут) Цикл
    КонецЦикла;
95 Fragster
 
модератор
01.11.13
15:52
(93) пуск - выполнить - cmd - ping 127.0.0.1 -n 2
96 Fragster
 
модератор
01.11.13
15:53
(94) не работает на сервере
97 dmpl
 
01.11.13
15:57
(95) Заданная сеть недоступна.
Заданная сеть недоступна.

Firewall лишние пинги режет.

(96) А на сервере задержка и не нужна вообще никогда...
98 oleg_km
 
01.11.13
15:59
(95) На какое время задерживает твой пример:

пуск - выполнить - cmd - ping 127.0.0.1 -n 2?

Сколько милисекунд?
99 mikecool
 
01.11.13
16:00
(5) там кошерное решение + я добавлял часть для работы под линухом с подачи Fragster-а
100 dmpl
 
01.11.13
16:01
(98) Он намекает на паузу в 1 секунду между пингами.
101 dmpl
 
01.11.13
16:03
+(100) Только когда сеть недоступна - этой паузы нет.
102 oleg_km
 
01.11.13
16:03
(100) А где написано, что между пингами будет пауза 1 секунда?

P:\>ping /?

Использование: ping [-t] [-a] [-n число] [-l размер] [-f] [-i TTL] [-v TOS]
               [-r число] [-s число] [[-j списокУзлов] | [-k списокУзлов]]
               [-w таймаут] конечноеИмя

Параметры:
    -t               Отправка пакетов на указанный узел до команды прерывания.
                     Для вывода статистики и продолжения нажмите
                     <Ctrl>+<Break>, для прекращения - <Ctrl>+<C>.
    -a               Определение адресов по именам узлов.
    -n число         Число отправляемых запросов.
    -l размер        Размер буфера отправки.
    -f               Установка флага, запрещающего фрагментацию пакета.
    -i TTL           Задание срока жизни пакета (поле "Time To Live").
    -v TOS           Задание типа службы (поле "Type Of Service").
    -r число         Запись маршрута для указанного числа переходов.
    -s число         Штамп времени для указанного числа переходов.
    -j списокУзлов   Свободный выбор маршрута по списку узлов.
    -k списокУзлов   Жесткий выбор маршрута по списку узлов.
    -w таймаут       Таймаут каждого ответа в миллисекундах.
103 dmpl
 
01.11.13
16:04
(102) Нигде, так что это равноценно использованию недокументированной особенности.
104 Fragster
 
модератор
01.11.13
16:06
(97) мне один раз понадобилась. раз в несколько секунд в фоне опрос. чтобы не дрючить сервак стартом и стопом фоновых заданий (чтобы не выполнять всякие модули сеанса по многу раз) сделал такую паузу (пингом)
105 Cube
 
01.11.13
16:06
Последнее время делаю так:

ВремяНачала = ТекущаяУниверсальнаяДатаВМиллисекундах();
Пока ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала < 5000 Цикл КонецЦикла;

Пустой цикл вполне кошерен
106 Kvestin
 
01.11.13
16:12
<code>
Процедура Sleep(ВремяСекунд) Экспорт
    ЗапуститьПриложение("timeout /t " + ВремяСекунд, , Истина);
    // Для ТекСекунда = 1 По ВремяСекунд Цикл
    //    ПолучитьCOMОбъект("winmgmts:").ExecNotificationQuery("Select * from __instancemodificationevent where TargetInstance isa 'Win32_UTCTime'").NextEvent();
    //КонецЦикла;    
КонецПроцедуры
</code>

Пустой цикл некошерен, я знаю кошерное решение...
107 mikecool
 
01.11.13
16:12
(105) это аналог getperfomancecounter из 7.7? с той же загрузкой проца?
108 dmpl
 
01.11.13
16:13
(104) Ну а зачем опрашивать-то понадобилось? Именно на сервере?
109 Fragster
 
модератор
01.11.13
16:14
(108) сбор статистики. в фоновом задании как раз для того, чтобы сеанс юзерский не нужен для этого был
110 Fragster
 
модератор
01.11.13
16:19
еще можно фоновое формирование движений также провернуть - если нечему формировать движения - то делаем паузу вместо запроса в цикле
111 MadHead
 
01.11.13
16:24
предупреждение, вопрос могут зависать и естественно не работают под сервером. В пинге нужно угадать с ип адресом, что особенно сложно когда много узлов РИБ или віпускается тиражируемое решение.
На мой взгляд самое правильное решение - это native api ВК

Пустой цикл некошерен, я знаю кошерное решение...
112 oleg_km
 
01.11.13
16:36
(103) Ничего не понимаю, откуда взялась эта недокументированная особенность, что между пингами именно 1 секунда? И почему все-таки не пользовать документированную опцию -w. Почему гланды нужно рвать через задний проход?
113 dmpl
 
01.11.13
16:49
(112) Взялась из практики, а ключ -w поможет только если указать несуществующий адрес. Но все адреса IPv4 заняты, так что найти такой адрес может быть проблематично. Кроме того, в случае недоступности той сети -w также не сработает.
114 Fragster
 
модератор
01.11.13
16:56
(112) из линуксового пинга, там есть опция на указание интервала и указано дефолтное значение типа секунда.
115 Fragster
 
модератор
01.11.13
16:57
-i interval
    Wait interval seconds between sending each packet. The default is to _wait for one second between each packet_ normally, or not to wait in flood mode. Only super-user may set interval to values less 0.2 seconds.
116 oleg_km
 
01.11.13
17:09
(114) Мда, т.е. тоже некроссплатформенно. Ну да ладно, теперь все стало понятно
117 Ахиллес
 
01.11.13
17:12
Не, ну, я понял на клюшках народ извращался, но почему в снеговике ПодключитьОбработчикОжидания использовать не хотите?
118 Ахиллес
 
01.11.13
17:20
4. Вы все видать уже успели нажраться в честь Пятницы.
119 oleg_km
 
01.11.13
17:27
(117) Не всегда есть возможность раздербанить код на события. Кроме того, пауза зачастую нужна на сервере. Например у меня на сервере идет обмен с ком-портом. Без паузы модем не успевает отдать ответ на команду
120 Ахиллес
 
01.11.13
17:35
(119) Дануна? Просто переписать код по человечески.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.