Печать документов из 1С:Предприятие — рутинная задача, которая отнимает время сотрудников и увеличивает риск ошибок при ручном выборе принтера или макета. Автоматизация этого процесса через встроенный язык позволяет сократить издержки, стандартизировать вывод и интегрировать печать в бизнес-процессы. Например, автоматическая распечатка счетов при проведении или отправка накладных на печать сразу после согласования.

В этой статье разберём 5 способов программной печати в 1С 8.3/8.2 — от базового вызова стандартного диалога до сложных сценариев с выбором принтера, настройкой параметров и обработкой ошибок. Все примеры приведены с учётом типовых конфигураций (УТ 11, БП 3.0, ЗУП 3.1) и адаптированы для работы в тонком клиенте, веб-клиенте и на сервере. Особое внимание уделим обходу ограничений печати в фоновых заданиях и веб-клиенте, где стандартные методы могут не работать.

1. Базовый способ: метод Печать() для документов и отчётов

Самый простой вариант — использование встроенного метода Печать(), который доступен для большинства объектов . Он открывает стандартный диалог печати, где пользователь может выбрать принтер, количество копий и другие параметры. Подходит для быстрой интеграции без глубокой кастомизации.

Пример кода для печати текущего документа:

Процедура ПечатьДокумента(Документ)

Документ.Печать();

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

  • 📄 Работает для любых документов и отчётов, где реализован метод Печать().
  • 🖨️ Пользователь сам выбирает принтер и настройки — нет контроля над процессом.
  • ⚡ Поддерживается во всех режимах (тонкий клиент, веб-клиент, толстый клиент).
  • ❌ Не подходит для автоматической печати без участия пользователя.
⚠️ Внимание: В веб-клиенте метод Печать() может открывать диалог печати браузера, а не . Для стабильной работы проверьте настройки публикации и права доступа.
📊 Какой клиент 1С вы используете чаще?
Тонкий клиент
Веб-клиент
Толстый клиент
Мобильное приложение

2. Прямая печать без диалога: ПечатьСтандартная() и ПечатьСтандартнаяНаСервере()

Если нужно распечатать документ без участия пользователя, используйте методы ПечатьСтандартная() (для клиента) или ПечатьСтандартнаяНаСервере() (для серверных процедур). Эти методы позволяют указать принтер по умолчанию и количество копий, но не поддерживают выбор макета.

Пример серверной печати с указанием принтера:

Процедура СервернаяПечать(Документ, ИмяПринтера = "")

ПараметрыПечати = Новый Структура();

Если Не ПустаяСтрока(ИмяПринтера) Тогда

ПараметрыПечати.Вставить("ИмяПринтера", ИмяПринтера);

КонецЕсли;

Документ.ПечатьСтандартнаяНаСервере(ПараметрыПечати);

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

Метод Работает в тонком клиенте Работает в веб-клиенте Требует права на печать
ПечатьСтандартная() ✅ Да ❌ Нет ✅ Да
ПечатьСтандартнаяНаСервере() ✅ Да ❌ Нет ✅ Да
Печать() ✅ Да ⚠️ Частично ❌ Нет

Для печати в веб-клиенте без диалога потребуется обходной путь — генерация PDF и отправка его на печать через браузер (разберём в разделе 5).

💡

Если принтер не определяется автоматически, проверьте настройки в Администрирование → Печать → Настройки принтеров. Часто проблема решается указанием принтера по умолчанию в ОС.

3. Печать с выбором макета: использование МенеджераПечати

Когда нужно распечатать документ по конкретному макету (например, бланк с логотипом компании или специальная форма для налоговой), используйте объект МенеджерПечати. Он позволяет гибко настраивать вывод, включая:

  • 📑 Выбор макета из справочника или внешнего файла (.mxl, .ert).
  • 🔧 Динамическое изменение параметров (например, подстановка реквизитов контрагента).
  • 🖼️ Вставка изображений (логотипов, подписей) в печатную форму.

Пример печати документа "РеализацияТоваровУслуг" с кастомизированным макетом:

Процедура ПечатьСМакетом(Документ)

МенеджерПечати = Документ.ПолучитьМенеджерПечати();

Макет = МенеджерПечати.ПолучитьМакет("МакетСЛоготипом");

Печать = МенеджерПечати.Печать(Макет);

Печать.Вывести();

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

⚠️ Внимание: Если макет хранится во внешнем файле, убедитесь, что путь к нему доступен из . В веб-клиенте и тонком клиенте могут действовать ограничения на доступ к файловой системе.

Убедиться, что макет добавлен в конфигурацию|Проверить права доступа к макету|Настроить параметры подстановки (реквизиты, изображения)|Тестировать печать в разных клиентах (тонкий/веб)

-->

4. Печать в фоновом задании: обход ограничений

Один из сложных сценариев — печать из фонового задания. Стандартные методы (Печать(), ПечатьСтандартная()) в фоновых процессах не работают, так как требуют взаимодействия с клиентской частью. Решение — генерация файла (PDF, XPS) и последующая печать через внешнюю утилиту или службу печати.

Алгоритм автоматической печати из фонового задания:

  1. Сгенерировать печатную форму в файл (например, Документ.ВывестиВКоллекциюЗначений() → СохранитьВоВременныйФайл()).
  2. Отправить файл на сервер печати (через FTP, REST API или общую папку).
  3. Запустить внешнюю команду печати (например, sumatraPDF -print-to "PrinterName" file.pdf).

Пример кода для генерации PDF:

Процедура ПечатьВФоновомЗадании(Документ)

МенеджерПечати = Документ.ПолучитьМенеджерПечати();

ТаблицаДокумента = МенеджерПечати.ПолучитьТаблицуДокумента();

Макет = МенеджерПечати.ПолучитьМакет("Основной");

// Сохраняем во временный файл

ИмяФайла = ПолучениеИмениВременногоФайла("pdf");

ТаблицаДокумента.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.PDF);

// Отправляем на печать (пример для Windows)

Команда = "sumatraPDF -print-to ""HP LaserJet"" """ + ИмяФайла + """";

ВыполнитьКомандуСистемы(Команда);

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

Для Linux-серверов вместо sumatraPDF используйте lp или cups.

Как проверить доступность принтера из 1С?

Используйте объект Принтеры для получения списка доступных устройств:

Принтеры = Новый Принтеры;

Если Принтеры.Количество() = 0 Тогда

Сообщить("Нет доступных принтеров!");

Иначе

Для Каждого Принтер Из Принтеры Цикл

Сообщить(Принтер.Имя);

КонецЦикла;

КонецЕсли;

5. Печать в веб-клиенте: генерация PDF и отправка на печать

В веб-клиенте прямая печать через ограничена из-за безопасности браузера. Решение — генерация PDF и автоматическая отправка его на печать через JavaScript. Для этого:

  1. Сформируйте печатную форму в PDF на сервере.
  2. Отдайте файл клиенту через HTTP-Сервис или временную ссылку.
  3. Используйте JavaScript для вызова печати в браузере:

Пример кода для клиентской части:

&НаКлиенте

Процедура ПечатьВВебКлиенте(СсылкаНаPDF)

ВыполнитьJavaScript(

"fetch('" + СсылкаНаPDF + "')

.then(response => response.blob())

.then(blob => {

const url = URL.createObjectURL(blob);

const iframe = document.createElement('iframe');

iframe.style.display = 'none';

iframe.src = url;

document.body.appendChild(iframe);

iframe.onload = () => {

iframe.contentWindow.print();

document.body.removeChild(iframe);

};

});"

);

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

Для стабильной работы:

  • 🔒 Настройте CORS на сервере , если PDF хостится на другом домене.
  • 📥 Проверьте, что браузер не блокирует автоматическую печать (в Chrome это разрешается только после действия пользователя, например, клика).
  • 🖼️ Для сложных макетов используйте библиотеки вроде jsPDF или PDF.js.
💡

В веб-клиенте прямая печать невозможна без участия браузера. Всегда требуется промежуточный шаг — генерация файла (PDF, HTML) и вызов печати через JavaScript.

6. Типовые ошибки и их решения

При программной печати в часто возникают ошибки, связанные с правами, драйверами принтеров или неверными настройками макетов. Разберём самые распространённые:

Ошибка Причина Решение
Печать не поддерживается в данном режиме Вызов Печать() в фоновом задании или веб-клиенте. Используйте генерацию PDF + внешнюю печать.
Нет прав на печать Отсутствуют права в ролях пользователя. Настройте права в Администрирование → Права доступа.
Принтер не найден Принтер не установлен на сервере или клиенте. Проверьте настройки принтера в ОС и .
Ошибка формирования макета Повреждён макет или неверные параметры. Откройте макет в конструкторе и проверьте структуру.

Для диагностики ошибок печати используйте:

  • 🔍 Журнал регистрации (Администрирование → Журнал регистрации).
  • 📋 Тестирование и исправление (Все функции → Тестирование и исправление).
  • 🖥️ Логи Windows (если ошибка связана с драйвером принтера).
⚠️ Внимание: При печати из терминального сервера (RDS) убедитесь, что принтеры перенаправлены корректно. В некоторых случаях требуется установка драйверов на сервере.

FAQ: Частые вопросы по программной печати в 1С

Можно ли распечатать документ на конкретный принтер без диалога?

Да, используйте метод ПечатьСтандартная() с указанием имени принтера в параметрах:

Параметры = Новый Структура("ИмяПринтера", "HP LaserJet");

Документ.ПечатьСтандартная(Параметры);

В веб-клиенте этот метод не работает — потребуется генерация PDF.

Как распечатать документ в фоновом задании?

Прямая печать невозможна. Решение:

  1. Сгенерируйте PDF-файл (ТабличныйДокумент.Записать()).
  2. Сохраните его в доступную папку или отправьте по FTP.
  3. Запустите внешнюю команду печати (например, sumatraPDF -print-to).

Для Linux используйте lp или cups.

Почему в печатной форме не отображаются картинки (логотип)?

Проблема возникает, если:

  • Путь к изображению указан неверно (например, C:\logo.png вместо относительного пути).
  • Файл не доступен в веб-клиенте или тонком клиенте.
  • Изображение не добавлено в хранилище конфигурации.

Решение: используйте ресурсы конфигурации или временные файлы, доступные клиенту.

Как распечатать документ на сетевой принтер?

Убедитесь, что:

  1. Принтер установлен на машине, где запущен (клиент или сервер).
  2. Имя принтера указано корректно (например, \\server\HP_LaserJet).
  3. Пользователь имеет права на печать на этом принтере.

Пример кода:

Параметры = Новый Структура();

Параметры.Вставить("ИмяПринтера", "\\server\HP_LaserJet");

Документ.ПечатьСтандартная(Параметры);

Можно ли распечатать документ в формате Excel?

Да, для этого:

  1. Сформируйте данные в ТабличныйДокумент.
  2. Сохраните в формате XLSX:
Таблица.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLSX);

Для печати из Excel потребуется открыть файл и вручную отправить на печать.