Как реализовать автоматическую печать вложенных файлов вместе с документами в 1С:Управление торговлей 11

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

В процессе работы с документами отгрузки в 1С:Управление торговлей 11 часто возникает задача автоматизации печати комплекта документов. Типовой сценарий: менеджер печатает ТОРГ-12 или УПД, и вместе с этими формами принтер должен автоматически выдать все прикрепленные к документу сканы сертификатов соответствия, инструкции или договора. В этой статье мы подробно разберем несколько технических подходов к решению этой задачи — от простых системных вызовов до продвинутых методов объединения PDF-контейнеров.

Способ 1. Использование встроенных механизмов БСП и Windows Shell

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

Для печати файла внешним приложением, назначенным в Windows по умолчанию для данного типа расширения (например, Adobe Reader для PDF или Фотографии для JPG), можно использовать метод ShellExecute. Проанализируем пример кода, который позволяет отправить файл на печать:


Процедура НапечататьИзПриложенияПоИмениФайла(ИмяОткрываемогоФайла, ИмяПринтера = "") Экспорт
    Если Не ЗначениеЗаполнено(ИмяОткрываемогоФайла) Тогда
        Возврат;
    КонецЕсли;

    СистемнаяИнфо = Новый СистемнаяИнформация;
    Если СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86 Или СистемнаяИнфо.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
        Shell = Новый COMОбъект("Shell.Application");
        Если ПустаяСтрока(ИмяПринтера) Тогда
            // Используем стандартную команду "print"
            Shell.ShellExecute(ИмяОткрываемогоФайла, "", "", "print", 1);
        Иначе
            // Если указан конкретный принтер, используем "printto"
            Shell.ShellExecute(ИмяОткрываемогоФайла, ИмяПринтера, "", "printto", 1);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Разберем недостатки этого метода. Основная проблема заключается в том, что ShellExecute открывает стороннее приложение (например, Word или Acrobat). Если вам нужно распечатать 20 сертификатов, на компьютере пользователя может одновременно открыться 20 окон программ, что приведет к зависанию интерфейса. Кроме того, этот метод плохо контролирует очередь печати: документы 1С могут перемешаться с вложенными файлами в лотке принтера.

Способ 2. Фоновая печать через SumatraPDF

Чтобы избежать открытия лишних окон и сделать процесс "тихим", профессионалы рекомендуют использовать легковесные консольные утилиты, такие как SumatraPDF. Это бесплатное приложение, которое поддерживает печать через командную строку без графического интерфейса.

Проанализируем алгоритм интеграции:

  1. Программно сохраняем присоединенный файл из хранилища 1С во временную папку на диске через ПолучитьФайлИзХранилища.
  2. Вызываем исполняемый файл утилиты с параметрами.

Пример вызова через 1С:


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

Параметр -silent гарантирует, что пользователь не увидит никаких всплывающих окон, а -print-to-default отправит документ на принтер по умолчанию. Это гораздо стабильнее и быстрее, чем использование COM-объектов тяжелых офисных пакетов.

Способ 3. Объединение PDF-файлов средствами платформы 8.3.16+

Если ваша база работает на платформе версии 8.3.16 и выше, мы можем использовать встроенный объект ОбъединениеФайловPDF. Это, пожалуй, самый элегантный способ решения проблемы перемешивания листов в принтере. Вместо того чтобы посылать на печать 5 разных заданий, мы создаем одно большое задание.

Выясним, как это работает по шагам:

  1. Сначала мы формируем печатную форму (например, ТОРГ-12) и сохраняем её во временный PDF-файл.
  2. Затем извлекаем все присоединенные PDF-файлы (сканы) также во временные файлы.
  3. Используем объект ОбъединениеФайловPDF для "склейки" основного документа и всех приложений в один файл.
  4. Отправляем один итоговый PDF на печать.

Пример кода для объединения:


Объединение = Новый ОбъединениеФайловPDF;
Объединение.Добавить(ПутьКФайлуТОРГ12);
Для Каждого Скан Из МассивСканов Цикл
    Объединение.Добавить(Скан.Путь);
КонецЦикла;
Объединение.Записать(ИтоговыйПутьФайла);

Важный момент: этот метод идеально работает с форматом PDF, но если вложениями являются картинки (JPG, PNG), их предварительно нужно сконвертировать в PDF или выводить другим способом.

Способ 4. Вывод графических сканов в табличный документ

Рассмотрим ситуацию, когда сертификаты хранятся в виде обычных картинок. В этом случае нам не обязательно прибегать к внешним программам. Мы можем вывести их прямо в ТабличныйДокумент 1С, добавив новую страницу.

Для реализации этого подхода выполним следующие действия:

Такой метод позволяет пользователю увидеть весь комплект (и накладную, и сканы) в окне предварительного просмотра 1С перед отправкой на принтер.

Способ 5. Правильная архитектура хранения (Сертификаты номенклатуры)

Вместо того чтобы вручную прикреплять файлы к каждой реализации, в УТ 11 лучше использовать штатный механизм Сертификаты номенклатуры. Рассмотрим, почему это эффективнее:

  1. Вы привязываете скан сертификата к карточке товара (или к виду номенклатуры) один раз.
  2. Указываете срок действия сертификата.
  3. При печати документа Реализация товаров и услуг система автоматически анализирует список товаров, находит актуальные сертификаты для каждой позиции и собирает их в единый пакет для печати.

Это исключает человеческий фактор (менеджер забыл прикрепить файл) и дублирование данных в базе.

Подведем итоги

Мы проанализировали ситуацию и выяснили, что универсального "коробочного" решения для всех форматов файлов сразу не существует, но комбинация методов дает отличный результат. Для PDF оптимально использовать ОбъединениеФайловPDF (платформенный механизм) или SumatraPDF (внешняя утилита). Для картинок — прямой вывод в табличный документ 1С. А для файлов MS Office — управление через COMОбъект("Word.Application") с параметром Visible = False.

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

← На главную