8.х Вопрос по циклу?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем -=ak=-, 19 мар 2007.

  1. TopicStarter Overlay
    -=ak=-
    Offline

    -=ak=- Опытный в 1С

    Регистрация:
    13 фев 2006
    Сообщения:
    107
    Симпатии:
    0
    Баллы:
    26
    Есть цикл?
    Код:
    
    Поку <условие> Цикл
    
    ......
    ......
    
    таймаут (30 секунд)
    
    КонецЦикла;
    
    
    Как поставить таймаут на выполнение цикла, каждый проход с интервалом 30 секунд?
  2. Vladoff
    Offline

    Vladoff

    Регистрация:
    16 мар 2007
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Добрый день. Уточните, пожалуйста, саму задачу. Просто если это реализовывать подобными методами, то все 30 секунд у пользователь не сможет работать с программой. Возможно, корректнее будет использовать «ПодключитьОбработчикОжидания».
  3. TopicStarter Overlay
    -=ak=-
    Offline

    -=ak=- Опытный в 1С

    Регистрация:
    13 фев 2006
    Сообщения:
    107
    Симпатии:
    0
    Баллы:
    26
    Из 8.0 идет рассылка новостей контрагентам. Почтовый сервер разрешает отправить только 20 писем в минуту. Надо растянуть цикл по времени.
  4. Vladoff
    Offline

    Vladoff

    Регистрация:
    16 мар 2007
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    По-моему, всё же, для этой задачи лучше использовать технологию с «ПодключитьОбработчикОжидания». Я так понимаю, рассылкой занимается некий пользователь-робот. В случае использование этого метода, робот сможет выполнять и другие регламентные функции (возможно, они у вас со временем появятся). Синтаксис описанный в помощи платформы. Все просто ПодключитьОбработчикОжидания(<Тесктом исполняемая процедура>, <Интервал её исполнения в секундах>).
  5. TopicStarter Overlay
    -=ak=-
    Offline

    -=ak=- Опытный в 1С

    Регистрация:
    13 фев 2006
    Сообщения:
    107
    Симпатии:
    0
    Баллы:
    26
    Данный вариант для меня не подходит. Нужно внутри цикла.
  6. Vladoff
    Offline

    Vladoff

    Регистрация:
    16 мар 2007
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Не сочтите за наглость или недоверие, просто очень интересно, чем вызвана необходимость использовать задержку в цикле?
  7. TopicStarter Overlay
    -=ak=-
    Offline

    -=ak=- Опытный в 1С

    Регистрация:
    13 фев 2006
    Сообщения:
    107
    Симпатии:
    0
    Баллы:
    26
    Процедура написано таким образом, что пользоваться, о чем было сказано выше я не могу.
    Придется все переписывать.

    фрагмент процедуры:

    Код:
    Для Каждого Адрес Из Email Цикл
    
    ПочтовоеСообщение.Получатели.Добавить(Адрес.ПочтовыйАдрес);                            
    
    Попытка
    ИнтернетПочта.Послать(ПочтовоеСообщение);
    Сообщить("Почта отправлена: " + "(" +Адрес.Контрагент + "), " +Адрес.ПочтовыйАдрес);
    Контроль = Истина;
    Исключение
    Сообщить("Ошибка отправки сообщения",СтатусСообщения.Важное);
    //Отказ = Истина;
    Продолжить;
    КонецПопытки;
    
    ПочтовоеСообщение.Получатели.Очистить();
    
    //Нужен таймаут
    
    КонецЦикла;
    
  8. Vladoff
    Offline

    Vladoff

    Регистрация:
    16 мар 2007
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Хоть мне эта идея, все равно, не нравиться. И я бы всё же, лучше переписал процедуру под ожидание. Тем не менее, можно использовать модальную форму с таймаутом закрытия. Советую также, передавать туда текущего адресат, и обязательно кнопку прерывание рассылки. Пример (на скорую руку) прикрепляю к сообщению.

    Вложения:

  9. Vladoff
    Offline

    Vladoff

    Регистрация:
    16 мар 2007
    Сообщения:
    31
    Симпатии:
    0
    Баллы:
    1
    Ещё ответы с партнёрского форума.

    Код:
    Процедура Пауза(ТаймАут) Экспорт
    ТекВремя = ТекущаяДата();
    Пока ТекущаяДата() - ТекВремя  < ТаймАут Цикл
    #Если Клиент Тогда
    ОбработкаПрерыванияПользователя();
    #КонецЕсли
    КонецЦикла;
    КонецПроцедуры  
    
    Этот вариант нагружает процессор. Предлагают следующий вариант:
    Код:
      
    // [url="http://www.kuban.ru/forum_new/forum9/arhiv/253752.html"]http://www.kuban.ru/forum_new/forum9/arhiv/253752.html[/url]
    
    Wrapper = Новый COMОбъект("DynamicWrapper");
    Wrapper.Register( "KERNEL32.DLL","Sleep","I=h","f=s");
    Wrapper.Sleep(3000); 
    //Описание dynwrap на: [url="http://www.script-coding.info/dynwrap.html"]http://www.script-coding.info/dynwrap.html[/url]
    
    //нужна dll :(
    
    
    там же на WScript.Shell
    
    //нужно записывать файл
    
    
    Предупреждение("Ждем", 3);
    
    
    По-моему, как ни крути, а вариант с модальной формой самый удачный.
  10. Morris
    Offline

    Morris Новичок в 1С

    Регистрация:
    13 авг 2014
    Сообщения:
    22
    Симпатии:
    1
    Баллы:
    4
    Код:
    Процедура Спать(ВремяСекунд, Ключ = "", ЭтоФоновоеЗадание = Ложь) экспорт
     
        Если ЭтоФоновоеЗадание тогда
            Отбор = Новый Структура;
            Отбор.Вставить("Ключ", Ключ);
            мЗадания = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
            Попытка
                ФоновыеЗадания.ОжидатьЗавершения(мЗадания, ВремяСекунд);   // Ожидаем, сами себя
            Исключение
            КонецПопытки;
        Иначе
            пКлюч = Новый УникальныйИдентификатор;
            пИмяЗадания = "Спим " + ВремяСекунд + " (сек.)";
            мПараметры = Новый Массив;
            мПараметры.Добавить(ВремяСекунд);
            мПараметры.Добавить(пКлюч);
            мПараметры.Добавить(Истина);
            ФоновоеЗадание = ФоновыеЗадания.Выполнить("<ИмяМодуля>.Спать", мПараметры, пКлюч, пИмяЗадания);
            Попытка
                ФоновоеЗадание.ОжидатьЗавершения(ВремяСекунд);      // Или само закончится (по таймауту), или вылетит по таймауту
            Исключение
            КонецПопытки;
        КонецЕсли;
     
    КонецПроцедуры
    

Поделиться этой страницей