|
|
|
Подсчитываем число страниц в 1С без ВК,попутно управляем печатью... | ☑ | ||
|---|---|---|---|---|
|
0
smaharbA
17.11.05
✎
09:32
|
Часто задают вопрос как посчитать количество страниц до вывода на печать, вот вариант...(подсчет страниц отчета непосредственно для выбранного принтера)
Перем Dict,Locator,Service,oIE; //******************************************* Функция ТемыОбъектаJS(obj) oIE=СоздатьОбъект("InternetExplorer.Application"); oIE.Visible=0; oIE.Navigate("about:blank"); oIE.document.write("<html><script language=jscript> |var d = new ActiveXObject(""Scripting.Dictionary""); |function GetItemsObject(obj){ | var e=new Enumerator(obj); | i=1; | for (;!e.atEnd();e.moveNext()) { | d.Add(""pj""+i,e.item()); | i++; | } | return(d); | } |</script> |<body></body></html>"); Пока oIE.ReadyState<3 Цикл Состояние("Ждeм..."); КонецЦикла; рез=oIE.document.script.GetItemsObject(obj); Возврат рез; КонецФункции // ТемыОбъекта Функция Random() oIE=СоздатьОбъект("InternetExplorer.Application"); oIE.Navigate("about:blank"); oIE.document.write("<html> |<script language=jscript></script> |<body></body></html>"); Пока oIE.ReadyState<3 Цикл Состояние("Ждeм..."); КонецЦикла; Возврат oIE.document.script.Math.random(0); КонецФункции // Random Функция ПаузаПринтера() r=Service.execquery("select * from Win32_Printer"); Dict.RemoveAll(); Dict=ТемыОбъектаJS(r); Для к=1 По Dict.count Цикл Dict.item("pj"+к).Pause(); КонецЦикла; КонецФункции // ПаузаПринтера Функция ПродолжениеПринтера() Locator=CreateObject("WbemScripting.SWbemLocator"); Service=Locator.ConnectServer(); r=Service.execquery("select * from Win32_Printer"); Dict.RemoveAll(); Dict=ТемыОбъектаJS(r); Для к=1 По Dict.count Цикл Dict.Item("pj"+к).Resume(); КонецЦикла; КонецФункции // ПаузаПринтера Функция ПаузаПечати(Doc="") r=Service.execquery("select * from Win32_PrintJob"+?(ПустоеЗначение(Doc)=1,""," Where Document='"+Doc+"'")); Dict.RemoveAll(); Dict=ТемыОбъектаJS(r); Для к=1 По Dict.count Цикл Dict.Item("pj"+к).Pause(); КонецЦикла; КонецФункции // ПаузаПечати Функция ПродолжениеПечати(Doc="") r=Service.execquery("select * from Win32_PrintJob"+?(ПустоеЗначение(Doc)=1,""," Where Document='"+Doc+"'")); Dict.RemoveAll(); Dict=ТемыОбъектаJS(r); Для к=1 По Dict.count Цикл Dict.Item("pj"+к).Resume(); КонецЦикла; КонецФункции // ПаузаПечати Функция ОтменаПечати(Doc="") r=Service.execquery("select * from Win32_PrintJob"+?(ПустоеЗначение(Doc)=1,""," Where Document='"+Doc+"'")); Dict.RemoveAll(); Dict=ТемыОбъектаJS(r); Для к=1 По Dict.count Цикл Dict.Item("pj"+к).Delete_(); КонецЦикла; КонецФункции // ПаузаПечати Функция ПодсчетСтраниц(Doc="") r=Service.execquery("select * from Win32_PrintJob"+?(ПустоеЗначение(Doc)=1,""," Where Document='"+Doc+"'")); TotalPages=0; Dict.RemoveAll(); Dict=ТемыОбъектаJS(r); Для к=1 По Dict.count Цикл TotalPages = TotalPages + Dict.Item("pj"+к).TotalPages; КонецЦикла; Возврат TotalPages; КонецФункции // ПодсчетСтраниц() Процедура Сформировать() Таб=СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Таблица"); Таб.ВывестиСекцию("Шапка"); Сп=СоздатьОбъект("Справочник.Контрагенты"); Сп.ВыбратьЭлементы(0); Пока Сп.ПолучитьЭлемент() = 1 Цикл Таб.ВывестиСекцию("Строка"); КонецЦикла; Таб.ПовторятьПриПечатиСтроки(1, 1); Заг="1S "+Random(); Страниц=""; Таб.ПараметрыСтраницы(1,100,,,,,,,,1); Таб.Показать(Заг,,0); ПаузаПринтера(); Таб.Напечатать(1); Страниц=ПодсчетСтраниц(Заг+" "); Сообщить("Страниц всего: "+Страниц); ОтменаПечати(Заг+" "); ПродолжениеПринтера(); Таб.Показать("Контрагенты",,-1); Таб.Напечатать(1); КонецПроцедуры Процедура ПриОткрытии() Dict=СоздатьОбъект("Scripting.Dictionary"); Locator=CreateObject("WbemScripting.SWbemLocator"); Service=Locator.ConnectServer(); КонецПроцедуры // ПриОткрытии ... Тут также реализован механизм управления принтерами и печатью заданий, кому не лень допеределывайте... В таблице отчета две секции "Шапка" и "Строка", в верхнем колонтитуле надо ввести в конфигураторе следующее "стр.№ #P из [Страниц]", на печати будет чтото вроде "стр.№ 3 из 32"... У меня проблемма с мокселем (постаянная ;)) поэтому Таб.Напечатать(1);, а не Таб.Напечатать(0); P.S. это не готовое решение (хотя и рабочее), если надо дорабатывайте... |
|||
|
1
Фокусник
17.11.05
✎
09:45
|
(0) Ну допустим в колонитулы 1Ска уже сама умеет проставлять итого страниц... ;) А так замечательно, отправляем (в очередной раз) в "FAQ от smaharbA"
|
|||
|
2
smaharbA
17.11.05
✎
09:51
|
(1) Как ? там вроде #P #D #T только, я в 1С неочч. Ненашол я как количество страниц. Но дело тут не только в количестве страниц, тут и возможность управления системой печати, если поправить ("select * from Win32_Printer") на
("select * from Win32_Printer Name='"+ИмяПринтера+"'"); то и канкретным принтером, в этом коде можно получить и принтер поумолчанию... |
|||
|
3
Билли Г
17.11.05
✎
09:53
|
(2)
Текст колонтитула может включать следующие управляющие конструкции: #T при печати в данном месте будет вставлено время печати документа #D при печати в данном месте будет вставлена дата печати документа #P при печати в данном месте будет вставлен номер страницы документа #Q при печати в данном месте будет вставлено число - общее количество страниц документа 1С:Предприятие, версия 7.7. (c) 1996-1999, Фирма "1С" |
|||
|
4
smaharbA
17.11.05
✎
09:56
|
(3) А что у меня в ЖКК нету ?
|
|||
|
5
smaharbA
17.11.05
✎
09:58
|
(3) Попробывал (рел. 21) нету...
|
|||
|
6
Djkxfhf
17.11.05
✎
10:00
|
2(2) список принтеров получить не проблема. Проблема печатать на разные принтера в одном сеансе 1С без показа диалога выбора принтеров.
|
|||
|
7
smaharbA
17.11.05
✎
10:09
|
(6) Список локальных ?
|
|||
|
8
Deon
17.11.05
✎
10:16
|
(1) А где весь FAQ почитать можно?
|
|||
|
9
Djkxfhf
17.11.05
✎
10:16
|
2(7) список подключенных.
|
|||
|
10
GrayT
17.11.05
✎
10:19
|
(8)Кстати ти бы да. Я тут искал скрипт, который протоколирует что печатается на принтере, что то не нашел :(
|
|||
|
11
smaharbA
17.11.05
✎
10:22
|
(8)(10) Правдо составлю для БЗ статью, яж безалаберный и необязательный, многое сам теряю и снова пишу :(
|
|||
|
12
Билли Г
17.11.05
✎
10:23
|
(5)Старый у тебя релиз. Кстати, скрипт из (0) не будет работать, если win < XP...
|
|||
|
13
smaharbA
17.11.05
✎
10:24
|
(12) Только в плане остановки и продолжения печати, но этт другая история, печать и из коммандной строки можно приостановить/отменить rundll32
|
|||
|
14
Билли Г
17.11.05
✎
10:31
|
(13)Не только. Я года три-четыре назад экспериментровал на эту тему с классом Win32_PrintJob в винтукее - количество страниц он врал безбожно...
|
|||
|
15
banda
28.11.05
✎
13:52
|
у меня такая проблема:
я отправляю на печать Таб.Напечатать(1); и после это мне надо проверить все ли страницы напечатались |
|||
|
16
smaharbA
28.11.05
✎
14:05
|
Перем Dict,Locator,Service,oIE;
//******************************************* Функция ТемыОбъектаJS(obj) oIE=СоздатьОбъект("InternetExplorer.Application"); oIE.Visible=0; oIE.Navigate("about:blank"); oIE.document.write("<html><script language=jscript> |var d = new ActiveXObject(""Scripting.Dictionary""); |function GetItemsObject(obj){ | var e=new Enumerator(obj); | i=1; | for (;!e.atEnd();e.moveNext()) { | d.Add(""pj""+i,e.item()); | i++; | } | return(d); | } |</script> |<body></body></html>"); Пока oIE.ReadyState<3 Цикл Состояние("Ждeм..."); КонецЦикла; рез=oIE.document.script.GetItemsObject(obj); Возврат рез; КонецФункции // ТемыОбъекта Функция Random() oIE=СоздатьОбъект("InternetExplorer.Application"); oIE.Navigate("about:blank"); oIE.document.write("<html> |<script language=jscript></script> |<body></body></html>"); Пока oIE.ReadyState<3 Цикл Состояние("Ждeм..."); КонецЦикла; Возврат oIE.document.script.Math.random(0); КонецФункции // Random Функция ПодсчетСтраниц(Doc="") r=Service.execquery("select * from Win32_PrintJob"+?(ПустоеЗначение(Doc)=1,""," Where Document='"+Doc+"'")); TotalPages=0; Dict.RemoveAll(); Dict=ТемыОбъектаJS(r); Для к=1 По Dict.count Цикл TotalPages = TotalPages + Dict.Item("pj"+к).TotalPages; КонецЦикла; Возврат TotalPages; КонецФункции // ПодсчетСтраниц() Процедура Сформировать() Таб=СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Таблица"); Таб.ВывестиСекцию("Шапка"); Сп=СоздатьОбъект("Справочник.Контрагенты"); Сп.ВыбратьЭлементы(0); Пока Сп.ПолучитьЭлемент() = 1 Цикл Таб.ВывестиСекцию("Строка"); КонецЦикла; Таб.ПовторятьПриПечатиСтроки(1, 1); Заг="1S "+Random(); Страниц=""; Таб.ПараметрыСтраницы(1,100,,,,,,,,1); Таб.Показать(Заг,,0); Таб.Напечатать(1); Страниц=ПодсчетСтраниц(Заг+" "); Сообщить("Страниц всего: "+Страниц); КонецПроцедуры Процедура ПриОткрытии() Dict=СоздатьОбъект("Scripting.Dictionary"); Locator=CreateObject("WbemScripting.SWbemLocator"); Service=Locator.ConnectServer(); КонецПроцедуры // ПриОткрытии |
|||
|
17
banda
28.11.05
✎
14:11
|
ща попробую
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |