Печать на сервере 1С делается в два шага: табличный документ сохраняется в PDF во временный файл, а затем внешняя программа отправляет этот PDF на принтер. На Windows-сервере для этого удобно использовать Ghostscript с устройством mswinpr2, на Linux — lp из CUPS. Запускается всё из серверного кода методом ЗапуститьПриложение, поэтому работает и в регламентных заданиях, и в обработчиках веб-сервисов, где клиента нет вовсе.
Типичный сценарий, где это нужно, — складской ТСД. Кладовщик сканирует товар, мобильное приложение передаёт данные в учётную базу через веб-сервис, а этикетка должна выйти на принтер этикеток по шаблону из 1С. Пользовательского сеанса с принтером в этой цепочке нет.
Почему штатной печати не хватает
Печать в 1С рассчитана на пользователя: табличный документ показывается или отправляется на принтер на клиентском компьютере. В сеансах без интерфейса так не получится:
| Где выполняется код | Есть клиент | Как печатать |
|---|---|---|
| Форма документа у пользователя | Да | Штатная печать, БСП |
| Веб-сервис / HTTP-сервис (вызов с ТСД, сайта) | Нет | Только на сервере |
| Регламентное задание | Нет | Только на сервере |
| Фоновое задание, запущенное пользователем | Нет | На сервере или вернуть результат на клиент |
Если печать нужна в сеансе без клиента, остаётся сохранить документ в файл и отдать его системному средству печати сервера.

Подготовка сервера
- Установите Ghostscript на сервер 1С (64-битную сборку для Windows). Путь к
gswin64c.exeзапомните — лучше хранить его в константе или настройке, а не в коде. - Установите принтер этикеток для учётной записи, под которой работает служба сервера 1С, или как общий системный. Это главная причина «у меня печатает, а у задания нет».
- Проверьте печать вручную из командной строки под той же учётной записью — так вы отделите проблемы драйвера от проблем кода.
- Убедитесь, что у службы есть права на временный каталог (
ПолучитьИмяВременногоФайласоздаёт файлы именно там).
Я обычно использую консольную версию gswin64c.exe: она не открывает окон, что для службы правильнее.
Код: формируем этикетку и печатаем
Ниже серверная процедура для конфигурации на БСП. Печатная форма строится типовой подсистемой печати, затем задаются размеры этикетки, документ сохраняется в PDF и отправляется на принтер. Имена менеджера печати и макета — пример из типовых обработок печати этикеток; в вашей конфигурации они могут отличаться.
// Печатает этикетки номенклатуры на принтер, установленный на сервере 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 и заменить команду:
Команда = СтрШаблон("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С и на всех серверах кластера.




