Как программно вызвать печать присоединенного файла в 1С

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

В процессе работы с конфигурациями 1С, такими как Управление торговлей 10.3, часто возникает задача автоматизации печати документов, которые хранятся не в виде табличных документов платформы, а в виде внешних присоединенных файлов. Обычно это УПД, счета-фактуры, сертификаты номенклатуры, инструкции или спецификации в форматах PDF или JPEG, либо счета на оплату с особым расчетом НДС. Рассмотрим подробно, как реализовать механизм печати таких файлов прямо из интерфейса программы.

Общая схема решения задачи

Поскольку платформа 1С не имеет встроенного метода «Напечатать PDF» напрямую из хранилища значений (хотя возможен экспорт печатных форм в изображения), процесс всегда разбивается на три логических этапа. Проанализируем их:

  1. Извлечение данных: Получение двоичных данных файла из базы данных (обычно из справочника ПрисоединенныеФайлы или аналогичного).
  2. Сохранение во временный файл: Запись этих данных на жесткий диск во временную директорию пользователя.
  3. Вызов внешней команды: Отправка файла на принтер с использованием системных средств Windows или сторонних утилит.

Рассмотрим реализацию каждого этапа на конкретных примерах кода.

Этап 1 и 2: Получение и сохранение файла

Для начала нам необходимо получить объект ДвоичныеДанные. В типовых конфигурациях данные файла обычно хранятся в реквизите типа ХранилищеЗначения. Выясним, как правильно выгрузить файл во временную папку, чтобы операционная система могла к нему обратиться.


// Предположим, что СсылкаНаФайл — это ссылка на элемент справочника с файлом
ДвоичныеДанные = СсылкаНаФайл.Хранилище.Получить(); 

// Генерируем уникальное имя файла во временной директории с нужным расширением
ИмяФайла = ПолучитьИмяВременногоФайла("pdf"); 

// Записываем данные на диск
ДвоичныеДанные.Записать(ИмяФайла);

Использование функции ПолучитьИмяВременногоФайла крайне важно, так как она гарантирует отсутствие конфликтов имен при одновременной работе нескольких пользователей на сервере или терминале.

Способ 3.1: Печать через командную строку (Windows)

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


// Формируем команду для печати
// Ключ /p в большинстве программ означает команду "Печать"
Команда = "AcroRd32.exe /p /h " + ИмяФайла; 
ЗапуститьПриложение(Команда);

Однако у этого метода есть существенный недостаток: окно сторонней программы может остаться открытым или потребовать подтверждения пользователя. Посмотрим, как решить это с помощью специализированных утилит.

Способ 3.2: Использование специализированных утилит (SumatraPDF, PDFtoPrinter)

Для профессиональной реализации «тихой» печати (без открытия лишних окон) системные администраторы и разработчики часто используют легковесные бесплатные утилиты. Проанализируем использование SumatraPDF, которая отлично поддерживает управление через консоль.

Пример команды для отправки на принтер по умолчанию:


ПутьКПрограмме = """C:\Program Files\SumatraPDF\SumatraPDF.exe""";
ПараметрыПечати = " -print-to-default -exit-on-print ";
ЗапуститьПриложение(ПутьКПрограмме + ПараметрыПечати + ИмяФайла, , Истина);

Здесь флаг -exit-on-print принудительно закрывает программу после того, как задание отправлено в спулер печати, что экономит ресурсы системы.

Способ 3.3: Использование Windows Shell (объект Shell.Application)

Если мы не хотим привязываться к конкретному пути установки программы (например, Acrobat или Foxit Reader), можно воспользоваться системным объектом Shell.Application. Этот метод инициирует действие «Печать», зарегистрированное в Windows для данного типа расширения файла.

Разберем этот алгоритм пошагово:


ФайлОбъект = Новый Файл(ИмяФайла);
ПутьКПапке = ФайлОбъект.Путь;
ИмяФайлаБезПути = ФайлОбъект.Имя;

Шелл = Новый COMОбъект("Shell.Application");
Папка = Шелл.NameSpace(ПутьКПапке);
ОбъектФайла = Папка.ParseName(ИмяФайлаБезПути);

// Вызываем команду "Печать" (Print), которая прописана в реестре Windows
ОбъектФайла.InvokeVerb("Print");

Этот способ универсален, так как он одинаково сработает и для PDF, и для JPEG, и даже для документов Word, если на компьютере установлен соответствующий софт.

Особенности печати изображений (JPEG, PNG) средствами 1С

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

Рассмотрим, как это сделать:

  1. Создаем пустой табличный документ.
  2. Добавляем в него объект Рисунок.
  3. Помещаем в рисунок нашу картинку.
  4. Настраиваем параметры страницы и отправляем на принтер.

ТабДок = Новый ТабличныйДокумент;
ТабДок.ИмяПринтера = "ИмяВашегоПринтера"; // Необязательно

// Получаем картинку из файла
КартинкаФайла = Новый Картинка(ИмяФайла);

// Добавляем рисунок в таблицу
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = КартинкаФайла;

// Настраиваем положение: растянуть на всю страницу
Рисунок.Верх = 0;
Рисунок.Лево = 0;
Рисунок.Высота = 297; // Пример для A4
Рисунок.Ширина = 210;

ТабДок.АвтоМасштаб = Истина;
ТабДок.Напечатать(РежимИспользованияПринтера.БезПредварительногоПросмотра);

Использование функций БСП (Библиотеки Стандартных Подсистем)

Если вы работаете в современной конфигурации, где интегрирована БСП, задача значительно упрощается. Разработчики уже подготовили программный интерфейс для работы с файлами. Выясним, какую процедуру стоит вызвать.

В модуле РаботаСФайламиКлиент существует экспортная процедура НапечататьФайлы. Она принимает массив ссылок на присоединенные файлы и выполняет всю рутину по их открытию и печати автоматически.


// Пример вызова для одного файла
МассивФайлов = Новый Массив;
МассивФайлов.Добавить(СсылкаНаПрисоединенныйФайл);

РаботаСФайламиКлиент.НапечататьФайлы(МассивФайлов);

Этот метод предпочтителен для управляемых форм, так как он учитывает особенности работы тонкого клиента и веб-клиента.

Важные нюансы и рекомендации

При реализации механизмов печати важно учитывать среду выполнения кода. Проанализируем критические моменты:

Таким образом, мы рассмотрели несколько эффективных стратегий печати присоединенных файлов. Выбор конкретного метода зависит от типа файлов (картинки или документы) и архитектуры вашей информационной системы.

← На главную