1с имитировать задержку при вызовах сервера что это
Добрый вечер. Может кто-нибудь сталкивался с такой проблемой. Кидаю кнопку на форму документа в которой происходит вызов процедуры на сервере. Процедура на сервере НИЧЕГО не делает. Текущий вызов 1, время отработки 0,01, отправлено и принято до 100 Байт. Но возврат на форму осуществляется с задержкой на пару секунд. На форме Дерево и пару полей. Если кто-нибудь сталкивался с этим, отпишите на что обратить внимание.
Вваш вариант с режимом выделения строки не пройдет?
Нет. Другая тема. Здесь форма документа. Документ имеет 3 табличные части с кол-вом строк около 2500, 250, 100 соответственно. На прямую они не отображаются. Отображается некая выборка из ТЧ в виде дерева и таблицы значений. Если в настройках объекта формы для табличных частей отключить свойство "Использовать всегда", то тормоза исчезают. Я считал, что с клиента на сервер и обратно гоняются только измененные данные (а в моем случае ничего реально не меняется) и размер ТЧ в данном случае влиять не должен. Но это не так. Как обойти этот момент? В регистрах что ли хранить информацию или есть другие методы обойти эту ситуацию оставив табличные части?
Без контекста тоже не подходит?
Мне нужно менять данные в табличных частях. Как без контекста?
Строку в структуру - ее передавайте на сервер, обрабатывайте и возвращайте - а потом заполняйте строку ТЧ
возможно и строку можно прямиком передать на сервер
Вы не поняли. Наличие "весомой" табличной части или таблицы значений, ДАЖЕ ЕСЛИ К НЕЙ НЕ ОБРАЩАТЬСЯ И ДАЖЕ ЕСЛИ ЕЕ НЕ ОТОБРАЖАТЬ В ФОРМЕ, при переходе на сервер и возврате на клиента уже гарантирует задержку. И задержка прямо-пропорционально зависит от количество строк в таблице. При 50 строчках в ТЧ задержки нет. При 2500 строчках - около 3х секунд даже при пустом обращении к серверу.
И если с Клиента на СерверБезКонтекста обращаться - тоже задержка.
Платформа очень старая, я бы начал с ее обновления
Без контекста задержки нет. Попробовал на 1С8.3.5.1248. Те же тормоза.
Без контекста вариант рабочий, я так думаю, и самый оптимальный
Как без контекста редактировать табличную часть документа? Каким образом на нее ссылаться?
Даже если преобразовывать данные формы в значение все равно на сервер с контекстом перейти нужно
Вы параметром функции передавайте на сервер, зачем контекст формы всей?
Очень заморочисто получится. Решил самую большую таблицу заменить на регистр сведений. Посмотрю как пойдет.
Ну, что сказать. Избавился от табличной части. Заменил ее на регистр + отображение в динамическом списке = ТУ 134. Летает форма. Кто-бы мог подумать. Ведь в отладчике при ТЧ был почти нулевой трафик приема/передачи данных между сервером и клиентом. От чего тогда тормоза были?
Отладка — это неотъемлемая этап разработки прикладного решения. Умение эффективно использовать имеющиеся инструменты существенно снижает временные затраты на разработку и повышает ее качество. В этой статье я попробую рассказать о том, какие инструменты для отладки предоставляет нам система «1С:Предприятие».
Кроме этого отмечу, что эта статья входит в небольшую серию статей об отладке в 1С:
Имеющиеся в наличии инструменты отладки собраны в меню — «Отладка» можно вызвать соответствующими горячими клавишами или из меню «Отладка».
Точки останова
Точка останова — это некая точка в программном модуле, на которой выполнение модуля приостанавливается и управление перехватывает отладчик. Точку останова можно установить с любой строке модуля и в любой момент работы с отладчиком. Место установки точки останова отмечается соответствующим знаком, для разных видов точек останова используются разные обозначения:
Виды точек останова
Работе с точками останова посвящена секция меню «Отладка»:
- Точка останова (F9) — устанавливает/удаляет точку останова в строке на которой стоит курсор;
- Точка останова с условием — устанавливает точку останова и открывает окно для ввода условия — логического выражения, повторное использование команды в этой же строке откроет окно для редактирования условия. Останов в указанной точке будет выполнен только если условие истинно;
- Включить/отключить точку останова (Ctrl+Shift+F9) — включает/отключает точку останова;
- Удалить все точки останова — удаляет все точки останова во всех модулях;
- Отключить все точки останова — отключает все точки останова во всех модулях;
- Список точек останова (Alt+F9) — открывает окно для просмотра и управления точками останова, о нем ниже.
Кроме этого пункт меню «Отладка» — «Остановка по ошибке…» также можно отнести к работе с точками останова, так как эта команда позволяет останавливать выполнение кода при возникновении ошибки и переходит к строке которая вызвала ошибку.
Команда «Список точек останова» (Alt+F9) открывает окно для просмотра и управления точками останова:
Окно «Точки останова»
В окне показаны все точки останова во всех модулях, их расположение (модуль и номер строки) и условие (если есть). Имеется возможность включить/отключить/удалить точки останова, перейти к месту установки точек останова, сохранить и загрузить список точек останова.
Пошаговое выполнение
После того как сработает какая-либо точка останова и управление перейдет к отладчику обычно следует пошаговое выполнение кода модуля. Для пошагового выполнения в меню «Отладка» (и на панели отладки) имеется соответствующая группа команд — они появляются в момент подключения первого из предметов отладки.
Команды пошагового выполнения
В режиме пошаговой отладки исполнение кода приостанавливается после каждой команды и ждет инструкций от отладчика. А инструкции бывают следующими:
- Шагнуть в (F11) — если следующая команда это процедура/функция, то начинается пошаговая отладка этой функции, иначе отладчик просто переходит к следующей команде;
- Шагнуть через (F10) — если следующая команда это процедура/функция, то она полностью выполняется (не пошагово) и отладчик переходит к следующей команде;
- Шагнуть из (Shift+F11) — прерывает пошаговое выполнение процедуры/функции и останавливается на первом операторе после выхода из нее;
- Идти до курсора (Shift+F10) — выполняются все операторы до строки на которой стоит курсор;
- Текущая строка — перемещает курсор в ту строку, на которой остановился отладчик;
- Продолжить отладку (F5) — прерывает пошаговую отладку и продолжает свободное исполнение модуля.
Управление отладкой
Управление отладкой осуществляется при помощи соответствующих команд меню «Отладка»:
- Перезапустить (Ctrl+Shift+F5) — прекращает выполнение конфигурации и производить повторный запуск в режиме «1С:Предприятия»;
- Завершить (Shift+F5) — прекращает выполнение модуля и завершает работу текущего предмета отладки;
- Остановить — останавливает выполнение модуля на текущем операторе и позволяет начать отладку со следующей исполняемой строки.
- Остановка по ошибке — открывает окно настройки остановки по ошибке:
Окна, табло и стек вызова
Далее рассмотрим команды которые открывают окно «Выражение», «Локальные переменные», «Табло» и «Стек вызова»:
Окна, табло и стек вызова
Окно «Выражение» (Shift+F9)
Окно «Выражение»
Позволяет рассчитать выражение на встроенном языке. Следует отметить, что выражения выполняются в реальной системе и об этом нельзя забывать, если, к примеру, рассчитываемое выражение создает некий объект данных, то этот объект будет создан в реальной системе.
Табло (Ctrl+Alt+W)
Специальное окно, которое состоит из четырех страниц (переключение из контекстного меню) и отображает результаты вычисления переменных, арифметических выражений и выражений с использованием встроенного языка.
Окно «Локальные переменные»
Окно «Локальные переменные»
Специальное окно, которое во время отладки показывает список локальных переменных текущего метода. Редактировать таблицу переменных нельзя.
Изменение значения переменной
Изменение значения переменной
Когда управление находится у отладчика имеется возможность изменять значения переменных и свойства объектов (доступные для записи). Доступ к этой функции можно получить из окна выражений (подчеркнутая кнопка на рисунке выше), а также из контекстного меню в окне локальных переменных и в табло (такой же значок как и в окне выражений).
Откроется специальное окно (как на рисунке выше). В верхней части можно ввести новое значение для переменной — константное значение любого типа или выражение, корректное с точки зрения встроенного языка.
Пользоваться функцией нужно с осторожностью — необдуманное изменение значений переменных может привести к записи в базу данных совершенно неправильных значений.
Стек вызова
Показывает последовательность вызовов процедур и функций, которая привела к отлаживаемой в данный момент строке кода. Колонки таблицы содержат название метода, номер строки модуля и предмет отладки.
Замер производительности
Замер производительности позволяет оценить скорость работы всей конфигурации или ее части. Измеряется скорость выполнения и частота использования конкретных участков кода, а также прочая дополнительная информация о которой ниже.
Полученная информация позволяет, например, выбрать наиболее оптимальный (по быстродействию) вариант решения какой-либо задачи или отыскать «узкие», в плане быстродействия, места конфигурации. При этом нужно учитывать, что какие-либо сравнения скорости выполнения нужно проводить в одинаковых условиях.
Включить режим замера производительности можно соответствующей командой из меню «Отладка»:
Команда «Замер производительности»
Включить режим замера производительности можно как до запуска отладки, так и во время. Повторный использование команды прекратит замер и выведет окно с результатами. Включение и выключение замера производительности действует на все подключенные ко отладчику предметы отладки.
Результаты замера
Результаты замера производительности отображаются в виде таблицы со следующими столбцами:
- Модуль — название модуля;
- Номер строки — номер строки;
- Строка — участок кода;
- Кол. — количество вызовов данного участка кода за все время замера;
- Врем. — суммарное время выполнения (в секундах) данного участка кода за все время замера;
- %(Врем.) — процент суммарного времени выполнения данного участка кода к общему времени замера (общее время замера — это суммарное время выполнения кода конфигурации);
- Клиент — отметка участков кода выполняющихся на клиенте;
- Сервер — отметка участков кода выполняющихся на сервере;
- Обр. сервер — отметка участков кода в которых происходит вызов сервера.
Таблица с результатами замера производительности может выглядеть, например, так:
Результаты замера производительности
Если в строке вызывается процедура/функция то система может показывать время выполнения строки как с учетом времени выполнения вызываемой процедуры/функции и без учета этого времени. Флажок «Для вызова процедур и функций включать время выполнения» служит для выбора способа подсчета времени выполнения строки.
Результаты можно отсортировать по любой из колонок. Если выделить несколько строк, то сумма квантитативных данных (Кол., Врем., %(Врем.)) отобразится в нижней части окна. Кроме этого результаты можно сохранить в файл с расширением *.pff (этот файл, в последствии, можно открыть в любом конфигураторе).
Имитация задержек при вызове сервера
Механизм имитации задержек при вызове сервера позволяет имитировать работу прикладного решения в условиях существенных временных задержек при взаимодействии с сервером — при вызове сервера, а также при отправке данных на сервер и получении данных с сервера.
Включить механизм можно в конфигураторе (меню «Сервис»->»Параметры», вкладка «Запуск 1С:Предприятия»), специальным ключом командной строки, а также в режиме 1С:Предприятие (меню «Сервис»->»Параметры»):
Включение механизма имитации задержек
На этом все, надеюсь, что эта статья была Вам полезна. Также напомню про другие статьи серии об отладке в 1С, ссылки на них можно найти в начале этой статьи.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
(оценок: 3, средняя оценка: 5,00 из 5)
При обработке данных мне необходимо программно делать паузы через определенное количество обработанных данных на определенное количество секунд.
Пришло в голову два варианта:
Вариант 1. Используем _getPerformanceCounter():
Для НомерСотрудника = 1 По КолвоСотрудников Цикл
Если (НомерСотрудника>1) И (НомерСотрудника%20 = 1) Тогда
СчетчикВремени1 = _getPerformanceCounter();
Пока 1=1 Цикл
СчетчикВремени2 = _getPerformanceCounter();
ПаузаСекунд = (СчетчикВремени2-СчетчикВремени1)/1000;
Если ПаузаСекунд > 5 Тогда
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Вариант 2. Используем Предупреждение():
Для НомерСотрудника = 1 По КолвоСотрудников Цикл
Если (НомерСотрудника>1) И (НомерСотрудника%20 = 1) Тогда
Предупреждение("Ожидание оправки пакета "+Цел(НомерСотрудника/20)+". Пожалуйста, не нажимайте кнопку ""ОК"".", 5);
КонецЦикла;
Плюсы: Не нагружает процессор.
Минусы: на каждое предупреждение отображается табличка и пикает сигнал спикера.
Вопрос: Есть ли вариант решения, при котором не нагружался бы процессор, и не отображались окна, и не пикал спикер?
Есть внешняя компонента (кажется, здесь где-то видел), называется TerminalSleep. Она как раз и делает системный вызов sleep(кол-во миллисекунд) не нагружая процессор.
(10)
Addin Romix'а делает паузу на указанное число мс
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ()+"vk_sleep_1C.dll")=1 Тогда
vk_sleep=СоздатьОбъект("Addin.vk_sleep_1C");
vk_sleep.sleep(5000);
КонецЕсли;
(1) если все это выглядит сложно, то просто делайте цикл с бесполезными действиями, так раньше делали разного рода специалисты из франчайзинга.
scr = СоздатьОбъект("WScript.Shell");
scr.Run("ping 127.0.0.1 -n "+СокрЛП(Число(ЗадержкаСекунд)),0,1);
Не нагружает процессор и не пикает спикером.
Скрипт=Новый ТекстовыйДокумент();
Скрипт.УстановитьТекст
(
"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");
scr = СоздатьОбъект("WScript.Shell");
scr.Run("ping 127.0.0.1 -n "+СокрЛП(Число(ЗадержкаСекунд)),0,1);
Не нагружает процессор и не пикает спикером.
Есть еще в семерке стандартный вариант:
ОбработкаОжидания(,)
Синтаксис:
ОбработкаОжидания(,)
Назначение:
Инициирует периодический вызов процедуры глобального модуля с заданным интервалом времени.
Возвращает имя процедуры глобального модуля, которая назначена для периодического запуска (на момент до исполнения процедуры).
Параметры:
- необязательный параметр. Строковое выражение - имя процедуры глобального модуля, которая будет вызываться периодически с временным интервалом . Тело процедуры должно быть написано разработчиком конфигурации в глобальном программном модуле. Если в качестве параметра передается 'пустая строка', то ранее запущенный процесс прекращается.
- необязательный параметр. Числовое выражение - интервал времени в секундах, с которым периодически будет вызываться процедура глобального модуля . Если в качестве параметра передается 0 (ноль), то ранее запущенный процесс прекращается.
(6) ArCtic,
Это немножко не то. Используя функцию ОбработкаОжидания() можно сделать таймер, а мне нужна была пауза при исполнении кода.
Ребят, зачем такие костыли делать? Есть простой способ используя встроенные методы, ничего не нагружает, не заметно для пользователя, работает как на дбф так и на скуле:
Процедура Пауза ( Время )
чЧас = 0 ; чМин = 0 ; чСек = 0 ;
ТекущееВремя( чЧас , чМин , чСек );
чТекВремя = чЧас * 3600 + чМин * 60 + чСек ;
чВремяЗавершения = чТекВремя + Время ;
Пока чТекВремя < чВремяЗавершения Цикл
ТекущееВремя( чЧас , чМин , чСек );
чТекВремя = чЧас * 3600 + чМин * 60+ чСек ;
КонецЦикла;
КонецПроцедуры;
В переменную "время" передаете числовое значение секунды необходимое для паузы (60 - минута, 3600 = час - это садизм :))) ), работает с любыми числами, универсально
(13) В 7.7 как то не замечалось, что бы цикл не грузил процессор. В терминале подобные решения могут привести к проблемам с быстродействием базы в целом.
(13) madvovik, Предложенное Вами решение аналогично предложенному мною в самом начале первому варианту и грузит одно ядро процессора на 100 %. Вы проверяли предложенное решение?
Процедура ПродолжениеОбработки
ОбработкаОжидания("ПродолжениеОбработки",0);
//Продолжаем обработку
А=В;
Процедура НачалоОбработки
В=С;
//Тут начало
//Запускаем паузу
ПаузаСек=3;
ОбработкаОжидания("ПродолжениеОбработки",ПаузаСек);
Единственная проблема с модальностью форм обработка ожидания при модальных формах и не модальных рвботает по разному (честно не помню как)
процедура ТвояПроц - в этой же обработке, а не в ГМ
ОбработкаОжидания(,)
Синтаксис:
ОбработкаОжидания(,)
Назначение:
Инициирует периодический вызов процедуры глобального модуля с заданным интервалом времени.
Возвращает имя процедуры глобального модуля , которая назначена для периодического запуска (на момент до исполнения процедуры).
Параметры:
- необязательный параметр. Строковое выражение - имя процедуры глобального модуля , которая будет вызываться периодически с временным интервалом . Тело процедуры должно быть написано разработчиком конфигурации в глобальном программном модуле . Если в качестве параметра передается 'пустая строка', то ранее запущенный процесс прекращается.
- необязательный параметр. Числовое выражение - интервал времени в секундах, с которым периодически будет вызываться процедура глобального модуля . Если в качестве параметра передается 0 (ноль), то ранее запущенный процесс прекращается.
Я думаю в в описании достаточно часто, указывается на ГМ?
(20)
в (19) - недокументированная возможность
ОбработкуОжидания() можно использовать с локальной процедурой
"То что нет типовых механизмов, явно указывает на то что производится попытка "неправильного" использования программного продукта.
Судя по тексту
"
Предупреждение("Ожидание оправки пакета "+Цел(НомерСотрудника/20)+". Пожалуйста, не нажимайте кнопку ""ОК"".", 5);
"
видимо, Вы хотите производщить задержку при обмене данными.
Если это так, то ожидание, не "красивый" способ и не лучший с точки зрения реализации обмена.
Я бы переписал механизм обмена следующим образом:
1. С помощью плана обмена фиксировать изменения в необходимом типе объектов (по изменению которого вы понимаете что нужно обмениваться)
2. Реализовать регламентное задание:
2.1 Получаете все измененные объекты.
2.2 Осуществляете обмен.
2.3 Если обмен прошел успешно то удаляете изменения в плане обмена.
При такой реализации, обмен будет "невидим" для пользователей и обмен из за этого будет работать более стабильно. Расписание регламентного задания можно настроить хоть каждую секунду, но я бы рекомендовал посоветоваться с Заказчиком и сделать раз в 5 минут. Еще одним плюсом является то что регламентное зададание будет работать на сервере и не зависеть от работы клиентов."
Прошу прощения, не обратил внимание на то что эта тема по 7.7 и решение написал для 8.х, но возможно в 7.7 есть аналогичные механизмы.
Решил проверить все найденные варианты паузы для 1С. В результате получилась обработка для тестирования и небольшая статья с итогом.
(1) Сравнил с (7). Работает, у меня пауза была не в секундах, а в миллисекундах, поэтому я решил, что не работает.
Кроме очевидного - задержки, не нагружая системные ресурсы - этот метод даёт пользователю возможность прервать длительный процесс, а нам - корректно отработать это прерывание и сделать всё красиво.
Ах, да, и самое, наверное, важное: этот метод работает с любым клиентом в любой операционной системе. В отличие от.
Irwin; user1334089; viktor3d; independ; Merkalov; hydro2588_2015; user1058740; SV6; adhocprog; seperblunt2; DarkUser; y.dyachenko; TreeDogNight; necropunk; jif; Yakud3a; Gluk_1C; mickey.1cx; vano-ekt; forseil; NeviD; WizaXxX; + 22 – Ответить
(4) +1, какой-то набор вредных советов в статье :) Если только нужно именно на сервере пауза, в очень редких случаях.
Найдено в недрах БСП:
Платформо-независимо, работает на сервере, не нагружает процессор.
Вызов из БСП:
user1114234; Orlando Skibraves; Egovigor; Tangram; alenakrr; Samson-lim; Vovhik; ybatiaev; kyrasol; Irwin; Jeka44; fuser; Andrei_Ivanov; FuJluH; user1188623; Smallrat; Anosov_EP; wolder; sodrk; KirinaAS; Aleskey_K; Invodev; KostyaLavr; Merkalov; axsebur; serg1c; vita8383; beardlyhich; Mi4man; hydro2588_2015; KilloN; davdykin; user990914; Anything; batusai_00; Alex_Prodigy; aezdakov; QZet; json; dreamerr7; adhocprog; Vampeg; leonidt84; boogie; noon; uno-c; + 46 – Ответить
Найдено в недрах БСП:
Платформо-независимо, работает на сервере, не загружает процессор.
Вызов из БСП (пример):
Samson-lim; oneworker; user1525588; Irwin; suepifanov; beardlyhich; MrBukas; Anything; Емельянов Алексей; user774630; Alogy; Vampeg; + 12 – Ответить
(4)
То, что Вы предлагаете, принципиально не годится, именно из-за асинхронности. Нужна ПАУЗА! А у Вас не будет никакой паузы. Висящий вопрос в асинхронном режиме - это не пауза, т.к. программа уже пошла вовсю дальше работать.
То, что Вы предлагаете, принципиально не годится, именно из-за асинхронности. Нужна ПАУЗА! А у Вас не будет никакой паузы. Висящий вопрос в асинхронном режиме - это не пауза, т.к. программа уже пошла вовсю дальше работать.
То есть, как делать формы для работы в асинхронном режиме, Вы не умеете. Но это - недостаток Вас как специалиста, а не моего ответа как алгоритма.
Подскажу для тех, кто в танке: код в методе ПриОткрытииЗавершение() выполнится только после завершения ожидания.
Переносите в него всё, что должно было отработать после паузы, и всё!
(17)
То есть, смысл моего замечания Вы не поняли. Но это - недостаток Вас как специалиста, а не моего замечания :).
Уж конечно, я понимаю, что "код в методе ПриОткрытииЗавершение() выполнится только после завершения ожидания". Но вот то, что ПОСЛЕ ПоказатьВопрос - выполнится сразу. И вот этот "гениальный" подход : "Переносите в него всё, что должно было отработать после паузы, и всё" - применим не всегда. Или для этого нужно извратиться так, как рвать гланды через Ж. Статья вообще не об этом, а о паузе. А это не ПАУЗА ( впрочем, что-то я повторяюсь, а зачем ? )
Статья не настолько полезна, насколько вредна.
Если нужна пауза в клиентском коде, то есть ПодключитьОбработчикОжидания() и не нужно изобретать велосипед.
Если нужна пауза в серверном коде, то что-то не так с логикой приложения.
Вы считаете, что обработкам, выполняющимся на сервере, совсем никогда не нужна задержка выполнения?
Реальный пример кода, где обработка ждет, когда все задания отправятся на принтер. Кстати, применен один из методов паузы, описанный автором статьи:
Не соглашусь с автором - вариант SleepJs прекрасно работает.
Будет платформенонезависимо, будет работать на клиенте. Но опять-таки, не работает в безопасном режиме (хотя на сервере профиль безопасности можно настроить, чтобы работало - для КОРП лицензии сервера).
Если очень хочется ждать на сервере, то на мой взгляд наименее костыльный способ - это ожидание фоновым заданием самого себя.
json; adhocprog; uno-c; KEV_SZK; JohnyDeath; Evil Beaver; Krio2; Darklight; nixel; azubar; Labotamy; + 11 – Ответить
Ожидание на фоновом задании - самое интересное решение (сам только что хотел предложить такое же) - но, надо бы проверить как будет вести себя в файловой базе. Предложу ещё фичу - один раз запустить "бесконечное" регл. задание (аналогично ждущее завершения самого себя) - и всем остальным сеансам обращаться на ожидание завершения ФЗ этого регл. задания. Но будет одна пользовательская лицензия расходоваться на регл. задание. Но ФЗ доступны только на сервере или в толстом клиенте - но для длительного ожидания можно и в серверный контекст переходить - это не проблема.
Остальные все советы платформенозависимые (хотя некоторые подходы можно переработать так, чтобы они имели реализацию для разных платформ).
Использовать WshShell
WshShell = Новый COMОбъект("Wscript.Shell");
WshShell.Run("Wscript.exe. ")
Всё же не рекомендую - 10-я версия платформы на это может ругаться, да ещё и в безопасном режиме работать не будет.
Но если надо так - то лучше "ЗапуститьПриложение(КомандаWindows,,Истина);" - по крайней мере будет работать в Windows, Linux и MacOS (c WEB-клиентом могут быть проблемы), где теперь тоже есть клиенты 1С.
Если нужно чисто на клиенте - то придётся извращаться с "ПодключитьОбработчикОжидания" - если нужно платформеннонезависимое решение, работающее в безопасном режиме, без модальности.
Но прямо среди кода остановиться так не получится - но, на мой взгляд, если такой код разбить на части через "ПодключитьОбработчикОжидания" не получится - значит там явно очень плохой дизайн.
Либо, нужно просто написать классический бесконечный цикл (думаю, что сюда попадут лишь короткие паузы - не более пары секунд- можно и покрутить проц клиента - коли уж очень нужно).
Или писать платформеннозависимый не безопасный код через вызов «ЗапуститьПриложение» или, ожидать на фоновом задании (регламентном или специально запускаемом), ждущим самого себя; с заходом в серверный контекст выполнения (если это не толстый клиент).
В общем всё ещё ждём, когда 1С встроит в платформу системную функцию паузы. давно ждём.
Более подробно про проверенные варианты:
1) ping и winmgmts. Оба варианта прекрасно работают, практически не нагружая процессор.
2) Пустой цикл. Вариант работающий, часто предлагаемый на форумах. Имеет большой минус - грузит процессор.
3) Вариант с использованием Sleep. Насколько я понимаю, требуют наличия программы sleep.exe. На моем компьютере такой нет, варианты проверить не удалось.
4) SleepJs и SleepVbs. Работают. Неплохой вариант. Варианты отличаются только алгоритмом запуска команды.
5) TimeoutWs и Timeout. Работают. Неплохой вариант. Варианты отличаются только алгоритмом запуска команды. Timeout показывает черное окно при каждом запуске паузы.
6) DynamicWrapper. Нужна dll. Этот вариант не проверял, так как искал вариант без внешних компонент.
В прилагаемой обработке все варианты можно протестировать в своей базе и выбрать наиболее подходящий.
Есть обычная и управляемая форма, поэтому запускать можно в любой базе. Код открыт.
Протестировано на версиях 8.2 и 8.3.11.
Специальные предложения
(1) Сравнил с (7). Работает, у меня пауза была не в секундах, а в миллисекундах, поэтому я решил, что не работает.
Кроме очевидного - задержки, не нагружая системные ресурсы - этот метод даёт пользователю возможность прервать длительный процесс, а нам - корректно отработать это прерывание и сделать всё красиво.
Ах, да, и самое, наверное, важное: этот метод работает с любым клиентом в любой операционной системе. В отличие от.
Irwin; user1334089; viktor3d; independ; Merkalov; hydro2588_2015; user1058740; SV6; adhocprog; seperblunt2; DarkUser; y.dyachenko; TreeDogNight; necropunk; jif; Yakud3a; Gluk_1C; mickey.1cx; vano-ekt; forseil; NeviD; WizaXxX; + 22 – Ответить
(4) +1, какой-то набор вредных советов в статье :) Если только нужно именно на сервере пауза, в очень редких случаях.
Найдено в недрах БСП:
Платформо-независимо, работает на сервере, не нагружает процессор.
Вызов из БСП:
user1114234; Orlando Skibraves; Egovigor; Tangram; alenakrr; Samson-lim; Vovhik; ybatiaev; kyrasol; Irwin; Jeka44; fuser; Andrei_Ivanov; FuJluH; user1188623; Smallrat; Anosov_EP; wolder; sodrk; KirinaAS; Aleskey_K; Invodev; KostyaLavr; Merkalov; axsebur; serg1c; vita8383; beardlyhich; Mi4man; hydro2588_2015; KilloN; davdykin; user990914; Anything; batusai_00; Alex_Prodigy; aezdakov; QZet; json; dreamerr7; adhocprog; Vampeg; leonidt84; boogie; noon; uno-c; + 46 – Ответить
Найдено в недрах БСП:
Платформо-независимо, работает на сервере, не загружает процессор.
Вызов из БСП (пример):
Samson-lim; oneworker; user1525588; Irwin; suepifanov; beardlyhich; MrBukas; Anything; Емельянов Алексей; user774630; Alogy; Vampeg; + 12 – Ответить
(4)
То, что Вы предлагаете, принципиально не годится, именно из-за асинхронности. Нужна ПАУЗА! А у Вас не будет никакой паузы. Висящий вопрос в асинхронном режиме - это не пауза, т.к. программа уже пошла вовсю дальше работать.
То, что Вы предлагаете, принципиально не годится, именно из-за асинхронности. Нужна ПАУЗА! А у Вас не будет никакой паузы. Висящий вопрос в асинхронном режиме - это не пауза, т.к. программа уже пошла вовсю дальше работать.
То есть, как делать формы для работы в асинхронном режиме, Вы не умеете. Но это - недостаток Вас как специалиста, а не моего ответа как алгоритма.
Подскажу для тех, кто в танке: код в методе ПриОткрытииЗавершение() выполнится только после завершения ожидания.
Переносите в него всё, что должно было отработать после паузы, и всё!
(17)
То есть, смысл моего замечания Вы не поняли. Но это - недостаток Вас как специалиста, а не моего замечания :).
Уж конечно, я понимаю, что "код в методе ПриОткрытииЗавершение() выполнится только после завершения ожидания". Но вот то, что ПОСЛЕ ПоказатьВопрос - выполнится сразу. И вот этот "гениальный" подход : "Переносите в него всё, что должно было отработать после паузы, и всё" - применим не всегда. Или для этого нужно извратиться так, как рвать гланды через Ж. Статья вообще не об этом, а о паузе. А это не ПАУЗА ( впрочем, что-то я повторяюсь, а зачем ? )
Статья не настолько полезна, насколько вредна.
Если нужна пауза в клиентском коде, то есть ПодключитьОбработчикОжидания() и не нужно изобретать велосипед.
Если нужна пауза в серверном коде, то что-то не так с логикой приложения.
Вы считаете, что обработкам, выполняющимся на сервере, совсем никогда не нужна задержка выполнения?
Реальный пример кода, где обработка ждет, когда все задания отправятся на принтер. Кстати, применен один из методов паузы, описанный автором статьи:
Не соглашусь с автором - вариант SleepJs прекрасно работает.
Будет платформенонезависимо, будет работать на клиенте. Но опять-таки, не работает в безопасном режиме (хотя на сервере профиль безопасности можно настроить, чтобы работало - для КОРП лицензии сервера).
Если очень хочется ждать на сервере, то на мой взгляд наименее костыльный способ - это ожидание фоновым заданием самого себя.
json; adhocprog; uno-c; KEV_SZK; JohnyDeath; Evil Beaver; Krio2; Darklight; nixel; azubar; Labotamy; + 11 – Ответить
Ожидание на фоновом задании - самое интересное решение (сам только что хотел предложить такое же) - но, надо бы проверить как будет вести себя в файловой базе. Предложу ещё фичу - один раз запустить "бесконечное" регл. задание (аналогично ждущее завершения самого себя) - и всем остальным сеансам обращаться на ожидание завершения ФЗ этого регл. задания. Но будет одна пользовательская лицензия расходоваться на регл. задание. Но ФЗ доступны только на сервере или в толстом клиенте - но для длительного ожидания можно и в серверный контекст переходить - это не проблема.
Остальные все советы платформенозависимые (хотя некоторые подходы можно переработать так, чтобы они имели реализацию для разных платформ).
Использовать WshShell
WshShell = Новый COMОбъект("Wscript.Shell");
WshShell.Run("Wscript.exe. ")
Всё же не рекомендую - 10-я версия платформы на это может ругаться, да ещё и в безопасном режиме работать не будет.
Но если надо так - то лучше "ЗапуститьПриложение(КомандаWindows,,Истина);" - по крайней мере будет работать в Windows, Linux и MacOS (c WEB-клиентом могут быть проблемы), где теперь тоже есть клиенты 1С.
Если нужно чисто на клиенте - то придётся извращаться с "ПодключитьОбработчикОжидания" - если нужно платформеннонезависимое решение, работающее в безопасном режиме, без модальности.
Но прямо среди кода остановиться так не получится - но, на мой взгляд, если такой код разбить на части через "ПодключитьОбработчикОжидания" не получится - значит там явно очень плохой дизайн.
Либо, нужно просто написать классический бесконечный цикл (думаю, что сюда попадут лишь короткие паузы - не более пары секунд- можно и покрутить проц клиента - коли уж очень нужно).
Или писать платформеннозависимый не безопасный код через вызов «ЗапуститьПриложение» или, ожидать на фоновом задании (регламентном или специально запускаемом), ждущим самого себя; с заходом в серверный контекст выполнения (если это не толстый клиент).
В общем всё ещё ждём, когда 1С встроит в платформу системную функцию паузы. давно ждём.
Читайте также: