Доброго времени суток, Уважаемые Дамы и Господа.
Моя первая публикация, поэтому прошу строго не судить.
Итак, после создания пакетной печати документов реализации (в зависимости от вида покупателя — Физ. лицо/Юр. лицо) заказчик попросил распределить печатаемые листы на различные лотки принтера.
Вариант, который предлагают на многих ветках многих форумов, который заключается в подключении одного физического принтера несколько раз, настройки каждого экземпляра принтера на свой лоток, с последующим выбором того или иного экземпляра, заказчик отмел сразу с логичным вопросом — "Зачем плодить принтеры на ПК? Разве 1С не умеет работать с настройками принтера?".
Действительно 1С не умеет изменять часть настроек без режима предпросмотра, в том числе и выбор источника бумаги, отдавая это на откуп драйверам оборудования. Поэтому пришлось искать альтернативные варианты.
Покопавшись в интернете нашел интересную, и думаю, широко используемую системными администраторами команду работы с принтерами: rundll32 printui.dll,PrintUIEntry.
Этой командой я и решил воспользоваться.
Полный список ключей и флагов можно прочитать, если набрать rundll32 printui.dll,PrintUIEntry /?
Я же воспользовался только двумя командами:
1) rundll32 printui.dll,PrintUIEntry /Ss /n "Имя принтера" /a "Файл настроек" — сохраняет настройки принтера "Имя принтера" в файл, указанный в переменной "Файл настроек";
2) rundll32 printui.dll,PrintUIEntry /Sr /n "Имя принтера" /a "Файл настроек" — восстанавливает настройки принтера "Имя принтера" из файла, указанный в переменной "Файл настроек";
Вкратце принцип работы:
1) Были внесены изменения в конфигурацию в справочнике "Пользователи" (как не жаль, но без добавления доп реквизитов не обошлось)
Были добавлены следующие объекты:
Табличная часть справочника "НастройкиПринтеров"
Данная табличная часть содержит следующие реквизиты
- РабочееМесто — Тип "Строка" — записывает имя ПК, так как пользователь может работать за несколькими ПК;
- Принтер — Тип "Строка" — Наименование принтера в системе;
- Лоток — Тип "Число" — у меня данный реквизит может иметь значения только либо "1", либо "2" по номеру лотков;
- НастройкиПринтера — Тип — "Хранилище значения" — содержит в себе файл настроек принтера для последующего восстановления
2) Была создана обработка "Настройка лотков.epf", которая загружает файлы настроек в базу 1С. При запуске обработки будет получен список принтеров, зарегистрированных в системе, и список спозиционируется на принтере по умолчанию. Есть 2 объекта работы с первым и вторым лотком. Для сохранения настроек необходимо выполнить настройки под первый лоток в стандартном окне настроек принтера Windows (или драйвера принтера) и нажать кнопку "Сохранить настройки 1 лотка" произойдет выгрузка файла настроек во временную директорию и сохранение этого файла в базу 1С. То же самое и для второго лотка. При необходимости можно удалить настройки.
3) При пакетной печати, перед сменой лотков, 1С выгружает файл текущих настроек в файл, после этого выгружает из базы файл настроек (который храниться в базе в виде двоичных данных), например, для печати из лотка 1, восстанавливает настройки принтера из этого файла, отправляет на печать необходимую Печатную форму, повторяет то же самое (выгрузка файла настроек из базы, восстановление настроек из файла) для второго лотка, ну и так далее. У меня был жестко прописан алгоритм, какие документы на какой лоток печатать, так что доп хранилища информации о том, какие данные на какой лоток бросать не потребовалось.
4) Ну и после окончания печати 1С восстанавливает изначальные настройки из файла настроек, который был сформирован до печати.
Вот вкратце и все описание принципа работы данного механизма.
Не обошлось конечно без подводных камней.
Так на MS Server 2008 при выполнении данных команд появлялась ошибка 0x0000000C с отказом восстановления настроек. Лечиться установкой обновления по ссылке из оф. источника: MS
На ОС Windows XP восстановление настроек происходит, но после выполнения команды возникает ошибка "Невозможно завершение операции". Лечиться добавлением в команду флага "/q" — тихий режим.
Пример:
rundll32 printui.dll,PrintUIEntry /Sr /n "Имя принтера" /a "Файл настроек" /q
На ОС Windows 7, Windows 10 ошибок не наблюдается.
Во вложении обработка сохранения настроек и пример пакетной печати. В пакетной печати весь код формирования Табличных документов удален, чтобы не загромождать код, оставлен только код переключения.
Данная обработка тестировалась на УТ версии 10.3.46.1.
В принципе все 🙂
Критика приветствуется, варианты альтернативных вариантов решения данного функционала приветствуется вдвойне.
Благодарю за прочтение публикации 🙂
P.S. Таким образом можно сохранять информацию не только о лотках, но и любые настройки, которые поддерживает принтер, например, цветная ч/б печать, качество печати и т. д.