Зелёнкин Александр

1С программист,
стаж работы более 10 лет
тел.: 8-963-570-26-00

Двухсторонняя и односторонняя пакетная печать из 1С

  Кто не в курсе, в 1С очень неважно реализована работа с настройками печати документа на принтер. В частности более года назад передо мною клиент поставил задачу реализации попеременной печати печатных форм - для некоторых печатных форм односторонней, а для других - двухсторонней. Требовалось реализовать печать на один и тот же принтер. Конфигурация на 1С 8.2 в режиме совместимости с 8.1.

  Задачу "в лоб" средствами 1С решить не удалось. Решили созданием двух логических принтеров с различными настройками дуплекса и добавлением в 1С регистра сведений, в котором хранилась информация о том, использовать ли дуплексную печать для данной печатной формы.

  Недавно началась вторая серия "марлезонского балета" - у клиента появилась необходимость организации пакетной печати и мы её реализовали. Следствием реализации пакетной печати стало то, что одно-, двухсторонние документы стали перемешиваться между собой и это вызвало затруднения у операторов - на разбор напечатанного затрачивалось значительное время. Размещение печатных форм после печати условно выглядело следующим образом:

 Например, есть доумент1 и печатные формы для него: счет-фактура(одностор. печать), ТОРГ12(одностор. печать),..., Сертификат(двустор. печать) и документ2 с такими же печатными формами. Заданы два принтера(физически это один принтер) \\pr и \\pr-d. При отправке на печать документы отправляются в такой последовательности:
док1 счет-фактура \\pr
док1 ТОРГ12 \\pr
..................
док1 Сертификат \\pr-d 
док2 счет-фактура \\pr
док2 ТОРГ12 \\pr
..................
док2 Сертификат \\pr-d

По факту получается так:
док1 счет-фактура \\pr
док1 ТОРГ12 \\pr
..................
док2 счет-фактура \\pr
док2 ТОРГ12 \\pr
..................
док1 Сертификат \\pr-d
док2 Сертификат \\pr-d

То есть, сначала печатались все односторонние документы, а после - двухсторонние. 

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

Способы решить проблему средствами 1С и настроек принтера, сервера печати были исчерпаны и не дали результата.

Пришлось использовать внешний функционал и средствами WMI проверять наличие документов в очереди на печать. Благодаря этому задача была решена.

Ниже привожу код процедуры проверки наличие документов в очереди печати:

Процедура ОжиданиеОчередиПечати()
	Состояние("Ожидание освобождения очереди печати...");
	Locator = Новый COMОбъект("WbemScripting.SWbemLocator"); 
	ИмяСервера = "."; 
	Скрипт=Новый COMОбъект("WScript.Network");
	ИмяПользователя=Скрипт.UserName;
	ТочкаПодключения = "root\cimv2"; 
	objWMIService = Locator.ConnectServer(ИмяСервера, ТочкаПодключения); 
	
	МассивЗаданий = objWMIService.ExecQuery("Select * from Win32_PrintJob where Owner='" + ИмяПользователя + "'"); 
	ЗаданийВОчереди = ТолькоНашиЗадания(МассивЗаданий);//МассивЗаданий.Count;
	Пока ЗаданийВОчереди > 0 Цикл 
		//Задержка в 1 секунду    
		scr = Новый COMОбъект("WScript.Shell"); 
		scr.Run("ping 127.0.0.1 -n "+СокрЛП(Число(1)),0,1); 
		//--------------------
		МассивЗаданий = objWMIService.ExecQuery("Select * from Win32_PrintJob where Owner='" + ИмяПользователя + "'"); 
		ЗаданийВОчереди = ТолькоНашиЗадания(МассивЗаданий);//МассивЗаданий.Count;
		Состояние("Ожидание освобождения очереди печати..."+ЗаданийВОчереди);
	КонецЦикла;
КонецПроцедуры
Функция ТолькоНашиЗадания(МассивЗаданий)
	Кол = 0;
	Для каждого Элем Из МассивЗаданий Цикл
		Для Каждого принтер Из МассивПринтеров Цикл
			Если Найти(Элем.Path_.Path,СтрЗаменить(принтер,"\","\\"))>0 Тогда
				Кол = Кол + 1;
			КонецЕсли;	
		КонецЦикла;		
	КонецЦикла;
	Возврат Кол;	
КонецФункции

Список названий принтеров в переменную "МассивПринтеров" получаем предварительно при открытии формы из нашего регистра сведений:

Процедура ПолучитьМассивПринтеровИзНастроекПользователя()
	 Запрос = Новый Запрос("ВЫБРАТЬ
	                       |	рссПринтерыПоУмолчанию.ПринтерДляОдностороннейПечати Как Принтер
	                       |ИЗ
	                       |	РегистрСведений.рссПринтерыПоУмолчанию КАК рссПринтерыПоУмолчанию
	                       |ГДЕ
	                       |	рссПринтерыПоУмолчанию.Компьютер = &Компьютер
	                       |
	                       |ОБЪЕДИНИТЬ ВСЕ
	                       |
	                       |ВЫБРАТЬ
	                       |	рссПринтерыПоУмолчанию.ПринтерДляДвухстороннейПечати
	                       |ИЗ
	                       |	РегистрСведений.рссПринтерыПоУмолчанию КАК рссПринтерыПоУмолчанию
	                       |ГДЕ
	                       |	рссПринтерыПоУмолчанию.Компьютер = &Компьютер");
	 Запрос.УстановитьПараметр("Компьютер",ИмяКомпьютера());
	 МассивПринтеров = Новый Массив;
	 Результат = Запрос.Выполнить();
	 Выборка = Результат.Выбрать();
	 Пока Выборка.Следующий() Цикл
		 МассивПринтеров.Добавить(Выборка.Принтер);
	 КонецЦикла;	 
КонецПроцедуры

 

 

 

 

Автоматизация хаоса

Контакты:

Телефон: +7 963 570 26 00

E-mail: al_zzz@mail.ru

Дизайн сайта:

Веб-дизайн и верстка: Зелёнкина Елена

8 963 578 05 35, lena_431@mail.ru