Печать на сервере 1С делается в два шага: табличный документ сохраняется в PDF во временный файл, а затем внешняя программа отправляет этот PDF на принтер. На Windows-сервере для этого удобно использовать Ghostscript с устройством mswinpr2, на Linux — lp из CUPS. Запускается всё из серверного кода методом ЗапуститьПриложение, поэтому работает и в регламентных заданиях, и в обработчиках веб-сервисов, где клиента нет вовсе.

Типичный сценарий, где это нужно, — складской ТСД. Кладовщик сканирует товар, мобильное приложение передаёт данные в учётную базу через веб-сервис, а этикетка должна выйти на принтер этикеток по шаблону из 1С. Пользовательского сеанса с принтером в этой цепочке нет.

Почему штатной печати не хватает

Печать в 1С рассчитана на пользователя: табличный документ показывается или отправляется на принтер на клиентском компьютере. В сеансах без интерфейса так не получится:

Где выполняется кодЕсть клиентКак печатать
Форма документа у пользователяДаШтатная печать, БСП
Веб-сервис / HTTP-сервис (вызов с ТСД, сайта)НетТолько на сервере
Регламентное заданиеНетТолько на сервере
Фоновое задание, запущенное пользователемНетНа сервере или вернуть результат на клиент

Если печать нужна в сеансе без клиента, остаётся сохранить документ в файл и отдать его системному средству печати сервера.

Печать на сервере 1С: табличный документ превращается в PDF и уходит на принтер
Печать на сервере 1С: табличный документ превращается в PDF и уходит на принтер

Подготовка сервера

  1. Установите Ghostscript на сервер 1С (64-битную сборку для Windows). Путь к gswin64c.exe запомните — лучше хранить его в константе или настройке, а не в коде.
  2. Установите принтер этикеток для учётной записи, под которой работает служба сервера 1С, или как общий системный. Это главная причина «у меня печатает, а у задания нет».
  3. Проверьте печать вручную из командной строки под той же учётной записью — так вы отделите проблемы драйвера от проблем кода.
  4. Убедитесь, что у службы есть права на временный каталог (ПолучитьИмяВременногоФайла создаёт файлы именно там).

Я обычно использую консольную версию gswin64c.exe: она не открывает окон, что для службы правильнее.

Код: формируем этикетку и печатаем

Ниже серверная процедура для конфигурации на БСП. Печатная форма строится типовой подсистемой печати, затем задаются размеры этикетки, документ сохраняется в PDF и отправляется на принтер. Имена менеджера печати и макета — пример из типовых обработок печати этикеток; в вашей конфигурации они могут отличаться.

1С
// Печатает этикетки номенклатуры на принтер, установленный на сервере 1С.
// Вызывается из веб-сервиса, регламентного или фонового задания.
Процедура НапечататьЭтикеткиНаСервере(Номенклатура, Штрихкод, КоличествоЭтикеток) Экспорт

	ПутьКGhostscript = Константы.ПутьКGhostscript.Получить(); // например C:\Program Files\gs\gs10.01.1\bin\gswin64c.exe
	ИмяПринтера = Константы.ПринтерЭтикетокНаСервере.Получить();

	МассивОбъектов = Новый Массив;
	МассивОбъектов.Добавить(Номенклатура);

	ПараметрыПечати = ПараметрыПечатиЭтикеток(Номенклатура, Штрихкод, КоличествоЭтикеток);
	ПечатныеФормы = УправлениеПечатьюВызовСервера.СформироватьПечатныеФормыДляБыстройПечати(
		"Обработка.ПечатьЭтикетокИЦенников", "ЭтикеткаТовары", МассивОбъектов, ПараметрыПечати);

	Если ПечатныеФормы.Отказ Или ПечатныеФормы.ТабличныеДокументы.Количество() = 0 Тогда
		ВызватьИсключение НСтр("ru = 'Не удалось сформировать этикетку.'");
	КонецЕсли;

	ТабличныйДокумент = ПечатныеФормы.ТабличныеДокументы[0].Значение;
	НастроитьРазмерЭтикетки(ТабличныйДокумент, 43, 25); // ширина и высота в мм

	ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
	ТабличныйДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);

	Команда = КомандаПечатиGhostscript(ПутьКGhostscript, ИмяПринтера, ИмяФайла,
		ТабличныйДокумент.ШиринаСтраницы, ТабличныйДокумент.ВысотаСтраницы);

	КодВозврата = Неопределено;
	ЗапуститьПриложение(Команда, , Истина, КодВозврата);

	УдалитьФайлы(ИмяФайла);

	Если КодВозврата <> 0 Тогда
		ЗаписьЖурналаРегистрации("ПечатьНаСервере", УровеньЖурналаРегистрации.Ошибка, , ,
			СтрШаблон("Ghostscript вернул код %1. Команда: %2", КодВозврата, Команда));
	КонецЕсли;

КонецПроцедуры

// Задаёт поля и размер страницы табличного документа под этикетку.
Процедура НастроитьРазмерЭтикетки(ТабличныйДокумент, ШиринаМм, ВысотаМм)

	ТабличныйДокумент.ПолеСверху = 1;
	ТабличныйДокумент.ПолеСнизу = 0;
	ТабличныйДокумент.ПолеСлева = 2;
	ТабличныйДокумент.ПолеСправа = 2;
	ТабличныйДокумент.РазмерКолонтитулаСверху = 0;
	ТабличныйДокумент.РазмерКолонтитулаСнизу = 0;
	ТабличныйДокумент.АвтоМасштаб = Истина;
	ТабличныйДокумент.ШиринаСтраницы = ШиринаМм;
	ТабличныйДокумент.ВысотаСтраницы = ВысотаМм;

КонецПроцедуры

// Собирает командную строку Ghostscript для печати PDF на принтер Windows.
Функция КомандаПечатиGhostscript(ПутьКGhostscript, ИмяПринтера, ИмяФайла, ШиринаМм, ВысотаМм)

	МиллиметровВДюйме = 25.4;
	ТочекВДюйме = 72;
	Ширина = Формат(ШиринаМм / МиллиметровВДюйме * ТочекВДюйме, "ЧДЦ=0; ЧГ=0");
	Высота = Формат(ВысотаМм / МиллиметровВДюйме * ТочекВДюйме, "ЧДЦ=0; ЧГ=0");

	Возврат СтрШаблон("""%1"" -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 "
		+ "-sDEVICE=mswinpr2 -sOutputFile=""%%printer%%%2"" "
		+ "-dDEVICEWIDTHPOINTS=%3 -dDEVICEHEIGHTPOINTS=%4 -dPDFFitPage ""%5""",
		ПутьКGhostscript, ИмяПринтера, Ширина, Высота, ИмяФайла);

КонецФункции

Пояснения к ключевым местам:

  • Размер страницы. Ghostscript работает в пунктах (1/72 дюйма), а табличный документ — в миллиметрах. Отсюда пересчёт через 25,4 и 72.
  • %printer%ИмяПринтера. Так устройство mswinpr2 понимает, что выводить надо на конкретный принтер Windows, а не в файл. В СтрШаблон знак процента экранируется удвоением.
  • -dPDFFitPage вписывает содержимое PDF в заданный размер страницы — полезно, когда драйвер принтера этикеток округляет размеры.
  • ДождатьсяЗавершения = Истина. Ждём окончания печати, чтобы получить код возврата и удалить временный файл. Если не ждать, файл удалить нельзя, и временный каталог начнёт расти.
  • Функцию ПараметрыПечатиЭтикеток вы пишете под свой макет: она передаёт штрихкод, количество и прочие данные в менеджер печати.

Печать на сервере 1С под Linux

На Linux всё проще: CUPS сам умеет печатать PDF (внутри его фильтров тот же Ghostscript). Достаточно настроить принтер в CUPS и заменить команду:

1С
Команда = СтрШаблон("lp -d %1 -n %2 ""%3""", ИмяПринтера, Формат(КоличествоКопий, "ЧГ=0"), ИмяФайла);
ЗапуститьПриложение(Команда, , Истина, КодВозврата);

Пользователь usr1cv8, от имени которого работает сервер, должен иметь право отправлять задания в очередь CUPS.

Типичные ошибки

  • Печатает из конфигуратора, не печатает из задания. Принтер установлен для вашего пользователя, а не для учётной записи службы. Проверяйте всегда под учётной записью службы.
  • Код зависает на ЗапуститьПриложение. Используется оконный gswin64.exe или Ghostscript ждёт ввода. Берите консольный gswin64c.exe с ключами -dBATCH -dNOPAUSE.
  • Этикетка печатается мелко или на две страницы. Не совпадают размеры страницы табличного документа, параметры DEVICEWIDTHPOINTS/DEVICEHEIGHTPOINTS и настройки бумаги в драйвере.
  • Пробелы в путях. Путь к Ghostscript, имя принтера и путь к файлу нужно брать в кавычки.
  • Кластер из нескольких серверов. Код выполнится на любом рабочем сервере кластера. Ghostscript и принтер должны быть на каждом, либо задание нужно закрепить за конкретным сервером требованиями назначения функциональности.
  • Жёстко прописанный путь к Ghostscript. После обновления Ghostscript меняется каталог версии, и печать тихо перестаёт работать. Храните путь в настройке.
Печать на сервере — это интеграция с операционной системой, а не только код 1С. Половина успеха — правильно установленный принтер под учётной записью службы.

Если нужна печать этикеток с ТСД, нестандартные печатные формы или настройка сервера 1С под такие задачи, это делается в рамках доработки 1С.

Итог

  • Печать на сервере 1С нужна там, где нет клиента: веб-сервисы, HTTP-сервисы, регламентные и фоновые задания.
  • Схема: табличный документ → PDF во временный файл → Ghostscript (mswinpr2) на Windows или lp на Linux.
  • Запускайте программу через ЗапуститьПриложение с ожиданием завершения, проверяйте код возврата и удаляйте временный файл.
  • Принтер и права должны быть у учётной записи службы сервера 1С и на всех серверах кластера.