В процессе работы с конфигурациями 1С, такими как Управление торговлей 10.3, часто возникает задача автоматизации печати документов, которые хранятся не в виде табличных документов платформы, а в виде внешних присоединенных файлов. Обычно это УПД, счета-фактуры, сертификаты номенклатуры, инструкции или спецификации в форматах PDF или JPEG, либо счета на оплату с особым расчетом НДС. Рассмотрим подробно, как реализовать механизм печати таких файлов прямо из интерфейса программы.
Поскольку платформа 1С не имеет встроенного метода «Напечатать PDF» напрямую из хранилища значений (хотя возможен экспорт печатных форм в изображения), процесс всегда разбивается на три логических этапа. Проанализируем их:
ПрисоединенныеФайлы или аналогичного).Рассмотрим реализацию каждого этапа на конкретных примерах кода.
Для начала нам необходимо получить объект ДвоичныеДанные. В типовых конфигурациях данные файла обычно хранятся в реквизите типа ХранилищеЗначения. Выясним, как правильно выгрузить файл во временную папку, чтобы операционная система могла к нему обратиться.
// Предположим, что СсылкаНаФайл — это ссылка на элемент справочника с файлом
ДвоичныеДанные = СсылкаНаФайл.Хранилище.Получить();
// Генерируем уникальное имя файла во временной директории с нужным расширением
ИмяФайла = ПолучитьИмяВременногоФайла("pdf");
// Записываем данные на диск
ДвоичныеДанные.Записать(ИмяФайла);
Использование функции ПолучитьИмяВременногоФайла крайне важно, так как она гарантирует отсутствие конфликтов имен при одновременной работе нескольких пользователей на сервере или терминале.
Самый простой способ отправить файл на печать — использовать стандартную команду операционной системы. Разберем ситуацию, когда в системе установлена программа по умолчанию для работы с данным типом файлов (например, Adobe Reader для PDF). Для вызова используем метод ЗапуститьПриложение.
// Формируем команду для печати
// Ключ /p в большинстве программ означает команду "Печать"
Команда = "AcroRd32.exe /p /h " + ИмяФайла;
ЗапуститьПриложение(Команда);
Однако у этого метода есть существенный недостаток: окно сторонней программы может остаться открытым или потребовать подтверждения пользователя. Посмотрим, как решить это с помощью специализированных утилит.
Для профессиональной реализации «тихой» печати (без открытия лишних окон) системные администраторы и разработчики часто используют легковесные бесплатные утилиты. Проанализируем использование SumatraPDF, которая отлично поддерживает управление через консоль.
Пример команды для отправки на принтер по умолчанию:
ПутьКПрограмме = """C:\Program Files\SumatraPDF\SumatraPDF.exe""";
ПараметрыПечати = " -print-to-default -exit-on-print ";
ЗапуститьПриложение(ПутьКПрограмме + ПараметрыПечати + ИмяФайла, , Истина);
Здесь флаг -exit-on-print принудительно закрывает программу после того, как задание отправлено в спулер печати, что экономит ресурсы системы.
Если мы не хотим привязываться к конкретному пути установки программы (например, Acrobat или Foxit Reader), можно воспользоваться системным объектом Shell.Application. Этот метод инициирует действие «Печать», зарегистрированное в Windows для данного типа расширения файла.
Разберем этот алгоритм пошагово:
ФайлОбъект = Новый Файл(ИмяФайла);
ПутьКПапке = ФайлОбъект.Путь;
ИмяФайлаБезПути = ФайлОбъект.Имя;
Шелл = Новый COMОбъект("Shell.Application");
Папка = Шелл.NameSpace(ПутьКПапке);
ОбъектФайла = Папка.ParseName(ИмяФайлаБезПути);
// Вызываем команду "Печать" (Print), которая прописана в реестре Windows
ОбъектФайла.InvokeVerb("Print");
Этот способ универсален, так как он одинаково сработает и для PDF, и для JPEG, и даже для документов Word, если на компьютере установлен соответствующий софт.
Если ваши присоединенные файлы являются картинками, нам необязательно обращаться к внешним приложениям. Платформа 1С позволяет вывести картинку на печать через ТабличныйДокумент. Этот метод считается самым надежным, так как он полностью контролируется кодом 1С.
Рассмотрим, как это сделать:
Рисунок.
ТабДок = Новый ТабличныйДокумент;
ТабДок.ИмяПринтера = "ИмяВашегоПринтера"; // Необязательно
// Получаем картинку из файла
КартинкаФайла = Новый Картинка(ИмяФайла);
// Добавляем рисунок в таблицу
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = КартинкаФайла;
// Настраиваем положение: растянуть на всю страницу
Рисунок.Верх = 0;
Рисунок.Лево = 0;
Рисунок.Высота = 297; // Пример для A4
Рисунок.Ширина = 210;
ТабДок.АвтоМасштаб = Истина;
ТабДок.Напечатать(РежимИспользованияПринтера.БезПредварительногоПросмотра);
Если вы работаете в современной конфигурации, где интегрирована БСП, задача значительно упрощается. Разработчики уже подготовили программный интерфейс для работы с файлами. Выясним, какую процедуру стоит вызвать.
В модуле РаботаСФайламиКлиент существует экспортная процедура НапечататьФайлы. Она принимает массив ссылок на присоединенные файлы и выполняет всю рутину по их открытию и печати автоматически.
// Пример вызова для одного файла
МассивФайлов = Новый Массив;
МассивФайлов.Добавить(СсылкаНаПрисоединенныйФайл);
РаботаСФайламиКлиент.НапечататьФайлы(МассивФайлов);
Этот метод предпочтителен для управляемых форм, так как он учитывает особенности работы тонкого клиента и веб-клиента.
При реализации механизмов печати важно учитывать среду выполнения кода. Проанализируем критические моменты:
ЗапуститьПриложение на сервере попытается запустить программу на серверной машине. Если принтеры подключены к локальным компьютерам пользователей, код печати должен выполняться строго НаКлиенте.Таким образом, мы рассмотрели несколько эффективных стратегий печати присоединенных файлов. Выбор конкретного метода зависит от типа файлов (картинки или документы) и архитектуры вашей информационной системы.