Имя: Пароль:
1C
1С v8
Остановка алгоритма на 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 перешел. Чильно удивлялся.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший