1С тесно связана с печатью и бывает так, что процесс печати подвисает и в очереди начинают накапливаться файлы. Есть разные штатные варианты, как это решить:
- перезапустить службу печати - вполне неплохой вариант, однако, если с 1С ведется работа из терминального сервера, на котором проброшено множество других принтеров, то это приведет к отмене всей печати;
- очистить очередь печати штатными средствами - тоже работает, но не всегда пользователи хотят запоминать, как это сделать, поэтому часто админам приходится это делать самим.
Данная обработка позволяет в привычном интерфейсе 1С и с минимальными итерациями решить проблему подвисшей печати даже неподготовленным пользователям без вмешательства админа.
Обработка универсальная и может открываться и работать в конфигурации 1С 8.3, тестирование проводилось на платформе 8.3.22.1709
P.S. перезапуск службы печати в обработке тоже присутствует, но могут быть проблемы с правами доступа.
Также эта обработка может послужить наглядным примером для разработки своего функционала, приведу готовые функции:
1. Как получить список системных принтеров:
&НаКлиенте
Функция ПолучитьСписокПринтеров()
ВыборПринтеров = Новый СписокЗначений;
Принтеры = Новый COMОбъект ("WScript.Network");
prn = Принтеры.EnumPrinterConnections();
i = 0;
Пока i < prn.Count()-1 Цикл
текПринтер = СокрЛП(prn.Item(i+1));
Если (СтрНайти(текПринтер, "OneNote") = 0) Тогда
ВыборПринтеров.Добавить(prn.Item(i+1));
КонецЕсли;
i = i + 2;
КонецЦикла;
Возврат ВыборПринтеров;
КонецФункции
2. Очистить очередь печати выбранного принтера:
&НаКлиенте
Процедура ОчиститьОчередьПечати(Команда)
Если СокрЛП(Принтер) = "" Тогда
Предупреждение("Не выбран принтер!");
КонецЕсли;
ВременныйСкрипт = ПолучитьИмяВременногоФайла(".ps1");
Текст = Новый ЗаписьТекста(
ВременныйСкрипт,
КодировкаТекста.ANSI, // кодировка
Символы.ПС, // разделитель строк (необ.)
Ложь // перезаписывать файл, а не дописывать в конец (необ.)
);
Текст.ЗаписатьСтроку("Get-PrintJob -PrinterName """ + СокрЛП(Принтер) + """ | Remove-PrintJob");
Текст.Закрыть();
стрКоманда = "powershell -executionpolicy RemoteSigned -file """ + ВременныйСкрипт + """";
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.Run(стрКоманда, 0, -1);
Пауза(1000*2);
Предупреждение("Очередь печати очищена!");
КонецПроцедуры
3. Пауза
&НаКлиенте
Процедура Пауза(МиллиСекунды)
ТаймерМС = ТекущаяУниверсальнаяДатаВМиллисекундах() + МиллиСекунды;
Пока ТаймерМС > ТекущаяУниверсальнаяДатаВМиллисекундах() Цикл
Состояние(ОКР((ТаймерМС-ТекущаяУниверсальнаяДатаВМиллисекундах())/1000),1);
КонецЦикла;
КонецПроцедуры
4. Перезапустить службу печати:
&НаКлиенте
Процедура ПерезапуститьСлужбуПечати(Команда)
РежимДиалога = РежимДиалогаВопрос.ДаНет;
ТекстВопроса = "Будет остановлена печать на всех принтерах." + Символы.ПС + "Продолжить?";
Ответ = Вопрос(ТекстВопроса, РежимДиалога, 0);
Если Ответ = КодВозвратаДиалога.Да Тогда
ВременныйBat = ПолучитьИмяВременногоФайла(".bat");
Текст = Новый ЗаписьТекста(
ВременныйBat,
КодировкаТекста.ANSI, // кодировка
Символы.ПС, // разделитель строк (необ.)
Ложь // перезаписывать файл, а не дописывать в конец (необ.)
);
Текст.ЗаписатьСтроку("net stop spooler");
Текст.ЗаписатьСтроку("del %systemroot%\system32\spool\printers\*.shd /F /S /Q");
Текст.ЗаписатьСтроку("del %systemroot%\system32\spool\printers\*.spl /F /S /Q");
Текст.ЗаписатьСтроку("net start spooler");
Текст.Закрыть();
ЗапуститьПриложение(ВременныйBat);
КонецЕсли;
КонецПроцедуры
6. Открыть параметры принтера:
&НаКлиенте
Процедура ПринтерОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если СокрЛП(Принтер) <> "" Тогда
стрКоманда = "rundll32 printui.dll,PrintUIEntry /p /n """ + Принтер + """";
WshShell = Новый COMОбъект("WScript.Shell");
WshShell.Run(стрКоманда, 0, -1);
КонецЕсли;
КонецПроцедуры