Имя: Пароль:
1C
1С v8
Количество страниц в Word'е
0 Baloven
 
17.08.11
07:35
Собственно проблема следующая:
перебираю файлы с обчитыванием количества страниц с Tiff и mdi разобрался, вот наткнулся на doc и docx и не могу нигде получить толкового объяснения как получить количество страниц все-таки???

вот кусок кода:


   Макет = ПолучитьМакет("ДоговорНаУслуги");
   КомОбъект = Макет.Получить();
   КомОбъект.Variables.Item("ДатаДоговора").Value = Формат(ДатаДоговора,"ДФ=дд ММММ гггг") + "г.";
   КомОбъект.Fields.UpDate();
   КомОбъект.SaveAS(ИмяКаталога + "\Договор на услуги.docx");
   
 
   Строка = ЭлементыФормы.ТаблицаПриложений.Значение.Добавить();
   Строка.НомерПП = ЭлементыФормы.ТаблицаПриложений.Значение.Количество();
   Строка.Наименование = "Договор на услуги";
   Строка.Экземпляров = 2;
   Строка.Страниц = ??? //КомОбъект.ActiveDocument.PageSetup.Pages.Count;

PageSetup.Pages.Count - это в екселе там количество страниц лежит, а где в ворде?
1 Wobland
 
17.08.11
07:39
чей-то чужой код:
w := CreateOleObject('Word.Application');
w.Documents.Open (FileName:=Doc);
PageCount := w.Documents.Item(DocName).ComputeStatistics(Statistic:=wdStatisticPages);
2 Baloven
 
17.08.11
08:10
я видел этот код - я его не могу под 1с адаптировать :(
3 vde69
 
17.08.11
08:13
(2) в 1с НЕТ ворда, если хочешь получить что-то от ворда - сначало его открой в 1с
4 Baloven
 
17.08.11
08:16
ПолучитьМакет("ДоговорНаУслуги"); - это и есть документ ворда
5 Wobland
 
17.08.11
08:27
странно как-то. макрос из документа c = ActiveDocument.ComputeStatistics(wdStatisticPages) говорит, что пять. код в 1С
w=Новый COMОбъект("Word.Application");
w.Documents.Open("D:\home\00.doc");
pages=w.ActiveDocument.ComputeStatistics(wdStatisticPages);
говорит, что 2 тысячи...
6 Wobland
 
17.08.11
08:27
глюкануло что-то. код в 1С:
   w=Новый COMОбъект("Word.Application");
   w.Documents.Open("D:\home\00.doc");
   pages=w.ActiveDocument.ComputeStatistics(wdStatisticPages);
7 Baloven
 
17.08.11
08:30
сомневаюсь - сругнется на wdStatisticPages что неопределена.... но попробую
8 Wobland
 
17.08.11
08:30
(7) ну да, я Перем сделал
9 vde69
 
17.08.11
08:32
WCount:=WordDocument1.ComputeStatistics($00000000);
CCount:=WordDocument1.ComputeStatistics($00000003);
SCount:=WordDocument1.ComputeStatistics($00000005);
PCount:=WordDocument1.ComputeStatistics($00000002);
10 Baloven
 
17.08.11
08:33
(8) угу с таким успехом можно и пустое значение передать... так что прошу другие варианты
11 Baloven
 
17.08.11
08:36
(9) извини поясни... я так понимаю это и есть одно из них wdStatisticPages
12 vde69
 
17.08.11
08:39
(11) в зависимости от параметра (число от 0 и выше) возращает разные данные


$00000000 - wdStatisticWords - Количество слов
$00000001 - wdStatisticLines - Количество строк
$00000002 - wdStatisticPages - Количество страниц
$00000003 - wdStatisticCharacters - Знаки без пробелов
$00000004 - wdStatisticParagraphs - Количество абзацев
$00000005 - wdStatisticCharactersWithSpaces - Знаки с пробелами
13 Baloven
 
17.08.11
08:41
(12) спасибо огромное щас буду пробовать
14 vde69
 
17.08.11
08:43
(13) вообще-то это ПЕРВАЯ ссылка в яндексе по слову "wdStatisticPages"
15 Baloven
 
17.08.11
08:44
попробовал... интересно что строка

КомОбъект.Application.Documents.Item("Документ в Без имени").ComputeStatistics("wdStatisticWords")
не работает
а то же самое но вот так по числовым значениям:
КомОбъект.Application.Documents.Item("Документ в Без имени").ComputeStatistics(0)
прекрасно работает
всем спасибо
16 Baloven
 
17.08.11
08:46
(14) спасибо, огромное я просто искал аналогию по PageSetup.Pages.Count и не мог понять как водру передать строковые параметры переменных просто когда увидел посты тогда и дошло что они имеют какие-то предопределенные числовые значения
17 vde69
 
17.08.11
08:55
(16) сразу видно что никогда с языками высокого уровня не работал :)

это тип данных такой (примерно можно сравнить с колекцией в 1с, конечно очень условно) к нему можно обращатся по имени или по индексу, число это и есть индекс.
18 Baloven
 
17.08.11
08:59
другой вопрос возник... как получить из моего кода первого поста имя документа чтобы его поставить в Item?
PS просто ни разу не приходилось сталкивался с VBA
19 smaharbA
 
17.08.11
09:00
(14) а можно еще нажать альт+ф11 и ф2
20 vde69
 
17.08.11
09:01
(18) открою страшную тайну, вместо имени документо можно использовать индекс (число)
21 smaharbA
 
17.08.11
09:01
.Name
.Caption
22 Baloven
 
17.08.11
09:07
(20) хм наверно не вариант.... просто а если будет открыт ворд и в нем будет 10 документов открыто???? думаю тут 2 варианта, 1й по уникальному индексу а лучше все же по пути я же его сохраняю предварительно
23 smaharbA
 
17.08.11
09:10
(22) КомОбъект у тебя - это и есть Документ и ненадо тебе .апликешн.документс()
24 Baloven
 
17.08.11
09:15
(23) да Спасибо действительно

КомОбъект.ComputeStatistics(2);

тоже имеет место быть
25 Baloven
 
17.08.11
10:45
.... проблема не связанная с данной проблемой, но может кто подскажет:
у меня открывается из макета и заполняется договор и потом сохраняется... по чекпоинтам я получаю полный доступ к документу.... но после его сохранения - файл не открывается и выдает ошибку предлагая попытаться его вовсстановить... где может быть ошибка?
26 dka80
 
17.08.11
11:30
(25) Процесс Word.exe не висит в памяти?
27 dka80
 
17.08.11
11:31
+26 в смысле до момента открытия файла
28 Baloven
 
17.08.11
12:02
причину нашел оказалось я принудительно указывал расширение docx а сам оригинал в макете был из источника в формате 2003 ворда, т.е. поменял расширение при сохранении на doc и все встало на свои места и файл нормально открывается: отсюда вопрос как правильно сохранить файл с указанием принудительно формата выходного файла?
29 Baloven
 
17.08.11
12:05
(26) (27) сам уже разобрался - просто в я работаю (как видно в тексте с образцом взятым из макета - и посути нормально все отрабатывается, пока не попытаешься его открыть, а вот попытки открытия из-за ассоциаций - уже не получается так как 2007 формат ворду нужно разархивировать :) потому и вылазила ошибка...
30 Baloven
 
17.08.11
12:59
в общем как-то так:

КомОбъект.SaveAS(ИмяКаталога + "\Договор на услуги.docx",12);

12 = wdFormatXMLDocument

собственно я глупость сморозил все есть в VB редакторе в обжект браузере и в том числе все числовые если это необходимо соответсвия :)
31 Baloven
 
17.08.11
16:45
Возникла следующая проблема :(

с вордом прокатывает следующая конструкция:

       doc.Documents.Open(Файл);
       doc.ActiveDocument.PrintOut(,,Количество);
       
         //Ожидание окончания отправки на печать...
         Пока doc.Application.BackgroundPrintingStatus<>0 Цикл
           Предупреждение("Ожидание идет печать",1);
         КонецЦикла;  
       doc.ActiveDocument.Close();
       doc.Application.Quit();

А как аналогичную схему сделать с екселем?
32 Baloven
 
17.08.11
16:47
(31) Я имею ввиду организовать паузу пока файл будет отправлен на печать?
33 Baloven
 
17.08.11
16:51
.... и еще вопрос:
как сделаь приостановку пока ексель записывает файл в седующей конструкции перед закрытием листа:


   doc = новый COMОбъект("Excel.Application");
   doc.Workbooks.Open(Строка.Файл);
   doc.ActiveSheet.PageSetup.FitToPagesWide = 1;        
   doc.ActiveWorkbook.Save();
   doc.ActiveWorkbook.Close();
   doc.Application.Quit();
   doc = 0;
34 Baloven
 
17.08.11
16:56
... и до кучи....

собственно опять же вопрос по экселю:

   doc = новый COMОбъект("Excel.Application");
   doc.Workbooks.Open(Строка.Файл);
   doc.ActiveSheet.PageSetup.FitToPagesWide = 1;        
   doc.ActiveWorkbook.Save();
   doc.ActiveWorkbook.Close();
   doc.Application.Quit();
   doc = 0;

данная конструкция не работает в части устанвки параметра размещения данных по ширине 1го листа
35 smaharbA
 
17.08.11
18:28

Ексель = новый COMОбъект("Excel.Application");
Книги = Ексель.Workbooks;
Книга = Книги.Open(Строка.Файл);
Листы = Книга.Worksheets;
Лист = Листы.Item(1);
ПараметрыСтраницы = Лист.PageSetup;
ПараметрыСтраницы.Zoom = ЛОЖЬ;
ПараметрыСтраницы.FitToPagesWide = 1;
Лист.Save();
Лист.Close();
Лист.Quit();
ПараметрыСтраницы = 0;
Лист = 0;
Листы = 0;
Книга = 0;
Книги = 0;
Ексель = 0;
36 Baloven
 
18.08.11
02:49
так у меня то же самое только я с активным листом работаю ActiveSheet и это не работает :(
и это неправильно:
Лист.Close();
Лист.Quit();

вот так нужно:
Книга.Close();
Ексель.Quit();
37 Baloven
 
18.08.11
06:59
(35) за подсказку все же спасибо - беру свои слова обратно

эта конструкция в моем случае работает:

   doc = новый COMОбъект("Excel.Application");
   doc.Workbooks.Open(Строка.Файл);
   doc.ActiveSheet.PageSetup.Zoom = ЛОЖЬ;
   doc.ActiveSheet.PageSetup.FitToPagesWide = 1;        
   doc.ActiveWorkbook.Save();
   doc.ActiveWorkbook.Close();
   doc.Application.Quit();
   doc = 0;

Все дело как оказалось в строке doc.ActiveSheet.PageSetup.Zoom = ЛОЖЬ;

Всем спасибо
38 smaharbA
 
18.08.11
07:05
(37) переписывай код, а то рано или поздно банан упадет
39 Baloven
 
18.08.11
07:11
(38) сорри не понял?
40 smaharbA
 
18.08.11
07:46
doc = новый COMОбъект("Excel.Application");
doc.Workbooks.Open(Строка.Файл);
"завис" адинес, в это время активируется другая книга
и после этого банан, объект уже не твой, а какой то другой
41 Baloven
 
18.08.11
07:52
вполне согласен... однако и строка
Лист = Листы.Item(1);
не показатель, что это именно открытый вами лист... так что если есть предложение получить ссылку именно на открытую книгу - то выслушаю
42 smaharbA
 
18.08.11
08:10
(41) это именно показатель
Ексель - Книги - Открытая книга - листы - конкретный лист - ...
все связано однозначно
а в конструкции

Ексель - Ексель.активныйлист(книга) абсолютно хаос
43 smaharbA
 
18.08.11
08:11
в (35) самое верное написание
44 Baloven
 
18.08.11
08:44
я так думаю что однозначная идентификация будет все же по ссылке на файл, т.е. прежде чем присваивать ссылку - перебрать все книги и сверить ссылку с открытым... Вот тогда будет однозначно :) а то опять же получится да же по Вашему коду после строки:
Книга = Книги.Open(Строка.Файл);
""завис" адинес, в это время активируется другая книга"... я это все понимаю и вопрос в принципе решен и решение стабилизации я так понимаю мы оба знаем :) как минмум в каком направлении двигаться :)
45 smaharbA
 
18.08.11
08:47
(44) открытием уже открытой вполне можно активировать уже открытую, а про банан о другом
46 Baloven
 
18.08.11
09:59
нет ну я-то согласен - и описанная мной ситуация - тоже в принципе имеет место быть жизненной - собственно это уже полемика и не по текущему вопросу - тогда можно проверить ссылку на файл у Лист = Листы.Item(1); ну и в конце концов если уж она не соответствует - тогда и делать перебор открытых книг....
47 Baloven
 
21.08.11
04:19
и опять проблемы с маштабированием страниц в екселе :(
конструкция:

   doc.ActiveSheet.PageSetup.Zoom = Ложь;
   doc.ActiveSheet.PageSetup.FitToPagesWide = 1;

масштабирует все данные на Один лист, а мне нужно чтобы масштаб был по ширине на одну страницу, а по высоте - сколько получится...вручную я просто удаляю значение второй графы - и все ок.... попробовал записать макрос - мне отобразилось вот такое

   FitToPagesTall = 0

изменяю свою конструкцию

   doc.ActiveSheet.PageSetup.Zoom = Ложь;
   doc.ActiveSheet.PageSetup.FitToPagesWide = 1;
   doc.ActiveSheet.PageSetup.FitToPagesTall = 0;
не работает так и ругается на ошибку с Zoom и если его поставить в Истину, тогда ругается на ошибку с установкой значения FitToPagesTall .
Где грабли?
48 Baloven
 
21.08.11
04:55
Вроде получилось вот так:
doc.ActiveSheet.PageSetup.FitToPagesTall = Ложь;
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.