При работе тонкого или толстого клиента 1С в операционных системах семейства Linux разработчики и системные администраторы нередко сталкиваются с проблемой: при попытке отправить на печать табличный документ нестандартного формата (например, конверт DL) система сбрасывает размер бумаги на US Letter, а само поле выбора формата в диалоговом окне печати становится неактивным.
Выясним причину такого поведения подсистемы печати и подробно разберем все способы решения данной проблемы.
Проанализируем цепочку взаимодействия платформы 1С с подсистемой печати CUPS на Linux:
EnvDL или DL. В то же время платформа 1С в программном свойстве РазмерСтраницы использует строковые значения ("Envelope DL" или "Конверт DL"). Если GTK/CUPS-прослойка клиента 1С не может сопоставить строковое значение с опциями конкретного PPD-файла, выбор сбрасывается на системное значение по умолчанию.US Letter.Принтеры Kyocera поддерживают аппаратный язык управления печатью PRESCRIBE. С его помощью можно принудительно задать параметры вывода, поместив специальную управляющую команду непосредственно в первую ячейку макета табличного документа со служебным шрифтом.
Посмотрим на пример программной установки команды принтеру:
ТабДокумент.Область("КомандаПринтеру").Текст = "!R! SPO P; DUPX 1; EXIT;";
ТабДокумент.Область("КомандаПринтеру").Шрифт = "PRESCRIBE";
Разберем данный подход: принтер перехватывает служебную последовательность !R! ... EXIT;, не выводит ее на печать, а применяет указанные параметры печати (ориентацию, лоток подачи, формат или дуплекс) на аппаратном уровне.
Наиболее стабильным и универсальным решением для Linux является создание отдельной выделенной очереди печати под конверты на уровне CUPS. В этом случае все настройки формата и подачи бумаги жестко фиксируются в операционной системе.
Разберем по шагам порядок настройки:
Kyocera_Envelope_DL.РазмерСтраницы:
ТабДокумент.ИмяПринтера = "Kyocera_Envelope_DL";
ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Конверт_DL";
ТабДокумент.КлючПараметровПечати = "Ключ_Конверт_DL";
// Свойство РазмерСтраницы программно не заполняем,
// чтобы применились параметры по умолчанию из CUPS
Если графический интерфейс печати 1С продолжает блокировать выбор параметров, надежным обходным путем является сохранение макета во временный PDF-файл с последующей отправкой в CUPS через командную строку.
Рассмотрим пример реализации:
ПутьКФайлу = ПолучитьИмяВременногоФайла("pdf");
ТабДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
КомандаCUPS = "lp -d Kyocera_M2535 -o media=EnvDL " + ПутьКФайлу;
ЗапуститьПриложение(КомандаCUPS, , Истина);
УдалитьФайлы(ПутьКФайлу);
Движок 1С при экспорте в PDF сохраняет точные физические размеры макета, а утилита lp корректно передает параметр media=EnvDL драйверу принтера.
Проанализируем конфигурационные файлы операционной системы:
/etc/papersize убедимся, что системный формат по умолчанию задан как a4, а не letter./etc/cups/ppd/<ИмяПринтера>.ppd, установив параметры по умолчанию:
*DefaultPageSize: EnvDL*DefaultPageRegion: EnvDL*DefaultImageableArea: EnvDL