|
Остановка алгоритма на 5 сек. (таймер) | ☑ | ||
---|---|---|---|---|
0
mzelensky
28.05.12
✎
09:39
|
Доброго всем! Помню точно, что уже поднимался этот вопрос и вроде находили решение, но не могу вспомнить название темы :(
Суть - из 1С создаю pdf файл, а затем делаю его копию (копирую в другое место). Проблема в том, что 1С-ка не дожидаясь завершения создания файлика переходит к копированию и разумеется просто не обнаруживает его. Один из вариантов поставить "тормозилку" (скажем 3 секунды). Как это сделать??? |
|||
1
butterbean
28.05.12
✎
09:40
|
Предупреждение()
|
|||
2
skunk
28.05.12
✎
09:40
|
как создаешь файл
|
|||
3
mzelensky
28.05.12
✎
09:40
|
(0)+ ПДФ-ки делаю через виртуальный принтер:
попытка obj = Новый COMObject("bioPDF.PDFPrinterSettings"); obj.SetValue("ShowPDF", "no"); obj.SetValue("Output", ПутьКФайлу); obj.SetValue("ConfirmOverwrite", "no"); obj.SetValue("ShowSaveAS", "never"); obj.SetValue("ShowSettings", "never"); obj.SetValue("RememberLastFileName", "no"); obj.SetValue("RememberLastFolderName", "no"); obj.SetValue("ShowProgressFinished", "yes"); obj.WriteSettings(True); ПечатныйДок.ИмяПринтера = "PDF Writer - bioPDF"; ПечатныйДок.Напечатать(Истина); исключение КонецПопытки; Может у него есть какой-то параметр (у объекта obj) чтобы 1С-ка ждала завершения ? |
|||
4
Азат
28.05.12
✎
09:41
|
ТекВремя = ТекущаяДата();
Пока 2 = 2 Цикл Если ТекущаяДата() - ТекВремя = 5 Тогда Прервать; КонецЕсли; КонецЦикла |
|||
5
mzelensky
28.05.12
✎
09:41
|
(1) окошки будут вылазить.... не очень хочется
|
|||
6
kotletka
28.05.12
✎
09:41
|
буква я справа сверху "1С таймер"
|
|||
7
golden-pack
28.05.12
✎
09:41
|
(1) неплохо)
|
|||
8
Ursus maritimus
28.05.12
✎
09:41
|
(4) тады уж существование файла проверять :))
|
|||
9
mzelensky
28.05.12
✎
09:42
|
(6) предлагаешь внешние компоненты?
|
|||
10
mzelensky
28.05.12
✎
09:44
|
(8) существование тож не прокатит - файл может быть создан, но занят другйо программой.
|
|||
11
butterbean
28.05.12
✎
09:45
|
запихни попытку в цикл и не парься
|
|||
12
Ursus maritimus
28.05.12
✎
09:45
|
(0) Если есть уверенность, что будет работать только на винде, то wscript.shell и run
|
|||
13
aleks-id
28.05.12
✎
09:45
|
тыщу раз обсуждали. вешаем обработчик ожидания который 1 раз в 5 секунд лезет в папку и проверяет наличие и доступность для копирования файла.
|
|||
14
aleks-id
28.05.12
✎
09:46
|
(4) ты зачем ребятенку цигарку суешь?
|
|||
15
Ursus maritimus
28.05.12
✎
09:47
|
(13) А если 100 документов формируется, ждать не упреешь?
|
|||
16
Лефмихалыч
28.05.12
✎
09:48
|
||||
17
skunk
28.05.12
✎
09:48
|
(12)не поможет
|
|||
18
aleks-id
28.05.12
✎
09:49
|
(15) а цикл крутить 5 секунд не упреешь да?
|
|||
19
Лефмихалыч
28.05.12
✎
09:49
|
||||
20
0xFFFFFF
28.05.12
✎
09:50
|
(0) Регламентное задание раз в минуту (две или три..), которое будет тупо копировать все нескопированные файлы. Или Cobian какой нить...
|
|||
21
Ursus maritimus
28.05.12
✎
09:50
|
(18) А где я это предлагал?
|
|||
22
andrewks
28.05.12
✎
09:50
|
sleep не предлагать?
|
|||
23
aleks-id
28.05.12
✎
09:51
|
(22) еще один...
|
|||
24
mzelensky
28.05.12
✎
09:51
|
(22) и куда его? в "run" ?
|
|||
25
Ursus maritimus
28.05.12
✎
09:51
|
(17) Чёй-то вдруг? запустить приложение с дождаться завершения (приложение - скрипт со sleep)
|
|||
26
skunk
28.05.12
✎
09:52
|
WshShell = Новый COMОбъект("WScript.Shell");
Сообщить(ТекущаяДата()); чисСекунд = 10; WshShell.Run("cmd.exe /c ping -n " + чисСекунд + " 127.0.0.1 > NUL", 0, 1); Сообщить(ТекущаяДата()); |
|||
27
aleks-id
28.05.12
✎
09:52
|
программе ведь делать больше нечего, кроме как в цикле бестолку молотить
(0) вешай обработчик ожидания и никого не слушай. |
|||
28
andrewks
28.05.12
✎
09:52
|
(24) можно в vbs, можно через DynamicWrapper напрямую заюзать WinAPI
|
|||
29
skunk
28.05.12
✎
09:52
|
(25)какое приложение ... файл формируется 1с
|
|||
30
skunk
28.05.12
✎
09:52
|
ПечатныйДок.Напечатать(Истина);
|
|||
31
andrewks
28.05.12
✎
09:53
|
(27) чем цикл со слипом принципиально отличается от обработчика ожидания?
|
|||
32
Stepa86
28.05.12
✎
09:54
|
(0) копируешь то как?
|
|||
33
aleks-id
28.05.12
✎
09:54
|
(31) тем, что в обработчике ожидания можно обработать массив файлов, каждый раз удаляя из него успешно скопированные и добавляя по ходу пьесы вновь сформированные.
|
|||
34
sttt
28.05.12
✎
09:55
|
WScript.Sleep 500
|
|||
35
Бледно Золотистый
28.05.12
✎
09:55
|
(0)А сразу в два места его печатать не вариант?
|
|||
36
skunk
28.05.12
✎
09:55
|
(33)вот только он не срабатывает во время выполнения какого-либо кода
|
|||
37
mzelensky
28.05.12
✎
09:56
|
(27) с обработчиком 1 минус: у меня формируется таких документов 3 штуки (подряд). Следовательно нужно в обработчике ожидания проверять какой файлик создался и скопирвоали его уже или нет. После того как все файлы скопируются - отключать обработчик.
НУ как-то лишние действия...все-таки проще, как мне кажется, делать именно паузу. |
|||
38
aleks-id
28.05.12
✎
09:57
|
(36) а нам это не важно. он отработает во время простоя либо когда сформируется все задание.
|
|||
39
andrewks
28.05.12
✎
09:57
|
(33) ты приводишь аргумент "за", который вытекает из додуманного тобой контекста задачи. автор не озвучил детали, поэтому пока особой разницы не вижу
|
|||
40
andrewks
28.05.12
✎
09:58
|
и потом, не надо забывать про обработку ошибок и информирование пользователя
|
|||
41
aleks-id
28.05.12
✎
09:59
|
(37) объявляем переменную МассивФайлов. Вешаем обработчик ожидания. В обработчике ожидания бегаем по массиву и пытаемся скопировать файлы по имени из массива. Если скопировали - удаляем элемент. В основной процедуре выполняется код из (3) и добавляет в МассивФайлов имена файлов для копирования.
|
|||
42
Stepa86
28.05.12
✎
09:59
|
+(32) КопироватьФайл( вроде б ждет окончания, в ЗапуститьПриложение( есть флажок ждатьЕпт, КомандаСистемы( непонятно (СП: "После загрузки Windows-приложения управление возвращается в 1С:Предприятие и исполнение модуля продолжается." )
|
|||
43
andrewks
28.05.12
✎
09:59
|
кстати, немного в сторону:
биопдф я бы порекомендовал заменить на PDFCreator - у него больше возможностей и меньше ограничений |
|||
44
Stepa86
28.05.12
✎
10:02
|
печатать в пдф средствами 1С не предлагать?
|
|||
45
mzelensky
28.05.12
✎
10:04
|
(43) я его пробовал, но что-то мне его настройка не понравилась. По биопдф нашел более наглядные примеры работы.
|
|||
46
mzelensky
28.05.12
✎
10:04
|
(44) каким образом???
|
|||
47
Stepa86
28.05.12
✎
10:06
|
(46) ТабДок.Записать( "D:\МояПэДЭЭфочка.pdf", ТипФайлаТабличногоДокумента.PDF )
|
|||
48
aleks-id
28.05.12
✎
10:07
|
(47) из будущего прилетел? как там ВВП поживает?
|
|||
49
WebberNSK
28.05.12
✎
10:07
|
(47) стоит уточнить, что это только на последних версиях платформы
|
|||
50
andrewks
28.05.12
✎
10:08
|
||||
51
mzelensky
28.05.12
✎
10:09
|
(47) я работаю на 8.2.13 ... на сколько я помню там такого НЕТ!
|
|||
52
andrewks
28.05.12
✎
10:09
|
||||
53
Stepa86
28.05.12
✎
10:10
|
(51) в 8.2.15 есть, вроде б в 14 появилось
|
|||
54
newfantom
28.05.12
✎
10:10
|
А ПодключитьОбработчикОжидания не годится?
|
|||
55
Бледно Золотистый
28.05.12
✎
10:10
|
(53) Неа, в 14 нету.
|
|||
56
mzelensky
28.05.12
✎
10:10
|
(50) что-то как-то все это геморойно выглядик.
|
|||
57
Vladal
28.05.12
✎
10:11
|
Запихни в командный файл или любой другой скрипт с последовательным выполнением команд.
Когда ПДФ-принтер сформирует файл и завершит работу. сработает команда копирования. |
|||
58
andrewks
28.05.12
✎
10:12
|
(56) да чё геморройно-то? не читал, что-ли? я тебе ссылку на развёрнутый пример дал.
найди 5 отличий PDFCreatorOptions = PDFCreator.cOptions; PDFCreatorOptions.AutosaveDirectory = КаталогСохранения; PDFCreatorOptions.AutosaveFilename = ИмяФайла; ТабличныйДокумент.ИмяПринтера = "PDFCreator"; ТабличныйДокумент.Напечатать(); |
|||
59
Stepa86
28.05.12
✎
10:12
|
как вы можете на 13 и 14 работать при таком багфиксе, что в 15 сделали...
|
|||
60
mzelensky
28.05.12
✎
10:13
|
(58) и таже проблема:
// Здесь одна особенность, которую я победил не очень хорошим способом. Помните, что у нас все файлы называются "Табличный документ.pdf"? Это нас не устраивает - надо переименовать, но поскольку принтер работает не мгновенно, необходимо сначала дождаться, пока файл сформируется и запишется на диск. Так что запускаем цикл и ждем пока файл появится. Да, грузится проц, но что поделать - это ненадолго. // На случай, если что-то пойдет не так, ставим ограничение в 30 секунд, по истечении которых цикл прерываем принудительно ФайлСформирован = Истина; ФайлPDF = Новый Файл(Путь + "Табличный документ.pdf"); Порог = ТекущаяДата() + 30; Пока Не ФайлPDF.Существует() И ФайлСформирован Цикл ОбработкаПрерыванияПользователя(); Если ТекущаяДата() >= Порог Тогда ФайлСформирован = Ложь; КонецЕсли; КонецЦикла; |
|||
61
andrewks
28.05.12
✎
10:14
|
(60) а я что, говорил, что это решит данную проблему?
|
|||
62
mzelensky
28.05.12
✎
10:15
|
(59) сколько не читал всякие темы на форуме, убеждался ,что 13 релиз наиболее стабильный....про 14 вообще молчу - бедные люди, кто на него перешел.
|
|||
63
andrewks
28.05.12
✎
10:15
|
PDFCreator - OSS, не имеет ограничений по установке на серверные оси, работе по сети, и т.п.
|
|||
64
Stepa86
28.05.12
✎
10:19
|
(62) там серверную часть сильно подлатали, пофиксили кучу всего, что привнесли в 14ой, лично для тебя сделали сохранение в пдф, да и все свежие типовые требуют 15ой... я б советовал переходить
|
|||
65
Vladal
28.05.12
✎
10:56
|
(62) Товарищ из франча сильно удивлялся. когда я с 13 на 14 перешел. Чильно удивлялся.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |