Имя: Пароль:
1C
 
Подсчитываем число страниц в 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
ща попробую
AdBlock убивает бесплатный контент. 1Сергей