В типовых конфигурациях 1С, таких как «Управление торговлей», функционал пакетной печати часто ограничен выводом табличных документов и изображений. Однако современные бизнес-процессы требуют работы с сертификатами, инструкциями и накладными, которые хранятся в формате PDF. Основная сложность заключается в том, чтобы не только отправить эти файлы на принтер, но и сохранить удобный интерфейс предварительного просмотра, встроенный в типовой механизм пакетной печати.
В рамках данной статьи мы разберем несколько подходов к решению этой задачи: от использования современных возможностей платформы 8.3.22 до применения внешних утилит и обходных путей для более ранних версий.
Начиная с версии платформы 8.3.22, разработчикам стал доступен специализированный объект ДокументPDF. Это наиболее «чистый» и правильный способ работы с форматом, который позволяет реализовать предпросмотр без сторонних библиотек. Рассмотрим, как интегрировать этот механизм в форму пакетной печати.
Для реализации предварительного просмотра нам потребуется разместить на форме элемент управления. Проанализируем последовательность действий:
Строка (в котором будет храниться путь к временному файлу или адрес в хранилище) или используем объект ДокументPDF напрямую.Пример кода для вывода PDF на форму:
// Создаем объект и загружаем файл из временного хранилища или с диска
Документ = Новый ДокументPDF;
Документ.Прочитать(ПутьКФайлу);
// Отображаем документ в элементе формы "ПолеПросмотраPDF"
Элементы.ПолеПросмотраPDF.УстановитьДокумент(Документ);
Преимущество этого метода в том, что пользователь видит документ в оригинальном качестве, может масштабировать его и листать страницы, не покидая интерфейс 1С. Однако для самой печати в пакетном режиме рекомендуется использовать прямую отправку файла в очередь принтера, чтобы избежать лишних преобразований в растр.
Часто возникает вопрос: как объединить ТабличныйДокумент (ТОРГ-12, Счет-фактура) и сторонний PDF (Сертификат) в одну очередь, чтобы принтер выдал их по порядку? Проанализируем подход с разделением потоков.
Разумнее всего не пытаться «впихнуть» PDF внутрь табличного документа в виде картинки. При вставке PDF в ТабличныйДокумент происходит растеризация (превращение вектора в набор точек), что резко снижает качество текста и мелких шрифтов, делая их «мыльными». Вместо этого мы можем программно управлять очередью печати ОС Windows.
Алгоритм работы пакетной печати в этом случае выглядит так:
ТабличныйДокумент (например, если вы используете факсимиле подписей для УТ 11), вызывается метод ТабДок.Напечатать().PDF, вызывается внешняя команда печати.Для реализации печати PDF «без лишних окон» (тихая печать) отлично подходят консольные утилиты. Это позволяет сохранить векторное качество документа и высокую скорость работы. Рассмотрим популярную утилиту SumatraPDF.
С помощью метода ЗапуститьПриложение() мы можем отправить документ на принтер по умолчанию или на конкретное устройство, выбранное пользователем в 1С. Проанализируем пример команды:
КомандаЗапуска = "C:\Program Files\SumatraPDF\SumatraPDF.exe -print-to-default -exit-on-print """ + ПутьКФайлуPDF + """";
ЗапуститьПриложение(КомандаЗапуска, , Истина);
Параметр -print-to-default отправляет файл на текущий принтер, а -exit-on-print закрывает приложение сразу после передачи задания в очередь печати Windows. Этот способ работает стабильнее, чем использование тяжелого Adobe Reader.
Если ваша конфигурация работает на версии платформы ниже 8.3.22, вы все равно можете реализовать предпросмотр. Современные движки 1С (основанные на WebKit/Chromium) умеют отображать PDF внутри Поля HTML документа. Разберем, как это реализовать:
Поле HTML документа.
// Путь к файлу на диске
ПутьКФайлу = "file://" + СтрЗаменить(ПолныйПутьКPDF, "\", "/");
Элементы.ПолеПредпросмотраHTML.Текст = "<html><body style='margin:0;padding:0;'>"
+ "<embed src='" + ПутьКФайлу + "' type='application/pdf' width='100%' height='100%' />"
+ "</body></html>";
В этом случае 1С задействует встроенные механизмы браузера для отображения PDF. Пользователь получит полноценное окно просмотра с инструментами печати и поиска.
Если архитектура пакетной печати в вашей конфигурации жестко завязана на использовании только одного объекта ТабличныйДокумент (например, когда нужно вывести несколько документов на одном листе), придется прибегнуть к конвертации. Выясним основные нюансы этого процесса.
Важно: Для сохранения читаемости текста при конвертации PDF в JPG или PNG необходимо использовать разрешение не менее 300 DPI. Стандартные 72/96 DPI сделают сертификаты нечитаемыми.
Для программной конвертации часто используют Ghostscript или библиотеки .NET через COM-обертку. После получения картинки её можно вставить в область табличного документа:
Рисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = Новый Картинка(ПутьКПолученномуJPG);
Рисунок.ГраницыСверху = 0;
// Установка размеров и позиции...
Внимание: Помните, что хранение десятков картинок высокого разрешения в одном ТабличномДокументе может привести к ошибке «Недостаточно памяти», особенно на 32-битных клиентах 1С. Проанализируйте объем оперативной памяти перед формированием огромных пакетов печати.
Подведем итог нашего анализа. Выбор метода зависит от версии вашей платформы и требований к качеству:
ДокументPDF для предпросмотра и прямую отправку файлов на принтер через внешние утилиты типа SumatraPDF для самой печати.Поле HTML документа для отображения PDF в интерфейсе.ТабличныйДокумент. Лучше программно посылайте на принтер сначала комплект бухгалтерских документов (как ТАБ), а следом — комплект сертификатов (как PDF). Это гарантирует максимальную четкость печати.Разберем ситуацию с сохранением типового функционала «Управления торговлей». Вы можете расширить процедуру печати в модуле менеджера или обработке печати, добавив проверку: если в присоединенных файлах документа найден PDF, система должна не пропускать его, а добавлять в список выводимых объектов со специальным флагом ЭтоPDF, который в дальнейшем будет обработан формой предварительного просмотра.