Как программно вывести внешнюю печатную форму (ВПФ) сразу на принтер в 1С:УТ 11.4?

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

При работе с конфигурациями на платформе 1С:Предприятие 8.3, особенно в прикладных решениях, таких как 1С:Управление торговлей 11.4, часто возникает задача программного формирования и печати документов. В случае с внешними печатными формами (ВПФ), зарегистрированными в справочнике ДополнительныеОтчетыИОбработки, стандартный механизм вызова через общую форму ПечатьДокументов обычно открывает предварительный просмотр, а не сразу отправляет документ на принтер. Рассмотрим, как обойти это ограничение и реализовать прямую печать ВПФ.

Понимание проблемы: почему не подходит общая форма печати?

Когда мы используем код, подобный исходному в сообщении 1:


ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника");
ПараметрыОткрытия.ИсточникДанных = ВПФ;
ПараметрыОткрытия.ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
ПараметрыОткрытия.ПараметрыИсточника.ИдентификаторКоманды = "МаршрутныйЛист";
ПараметрыОткрытия.ПараметрыИсточника.ОбъектыНазначения = ОбъектыНазначения;
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);

мы вызываем общую форму ПечатьДокументов. Эта форма предназначена для интерактивной работы с печатными формами: предварительного просмотра, выбора принтера, настройки параметров печати, сохранения в файл. В ней по умолчанию нет прямого параметра для немедленной отправки на принтер. Наша цель — полностью исключить интерактивное взаимодействие и отправить документ непосредственно на принтер.

Ключевая идея: прямое формирование и печать

Вместо того чтобы полагаться на общую форму, нам необходимо программно выполнить следующие шаги:

  1. Получить доступ к двоичным данным внешней печатной формы.
  2. Создать экземпляр этой внешней обработки в памяти 1С.
  3. Вызвать экспортную функцию обработки, которая формирует табличный документ.
  4. Полученный табличный документ отправить на принтер.

Этот подход позволяет нам взять полный контроль над процессом и избежать промежуточных форм. При этом мы сталкиваемся с одной важной особенностью платформы — безопасным режимом.

Пошаговое решение: программное формирование и печать ВПФ

Шаг 1: Получение двоичных данных ВПФ

Первое, что нам нужно сделать, это извлечь сами двоичные данные внешней печатной формы, которая хранится в справочнике ДополнительныеОтчетыИОбработки. Для этого мы можем использовать свойство ХранилищеОбработки элемента справочника.

Предположим, у нас есть ссылка на элемент справочника ВПФ (например, переменная ВПФ). Мы можем получить двоичные данные так:

ДвоичныеДанные = ВПФ.ХранилищеОбработки.Получить();

Здесь ВПФ — это ссылка на элемент справочника Справочники.ДополнительныеОтчетыИОбработки, который содержит нужную нам внешнюю печатную форму.

Шаг 2: Запись ВПФ во временный файл

Для того чтобы создать экземпляр внешней обработки в памяти 1С, обычно требуется сначала записать её двоичные данные во временный файл на диске. Система 1С затем использует этот временный файл для загрузки обработки.

Воспользуемся функцией ПолучитьИмяВременногоФайла для генерации уникального имени и запишем наши двоичные данные:


ИмяФайла = ПолучитьИмяВременногоФайла("epf"); // ".epf" - стандартное расширение для внешних обработок
ДвоичныеДанные.Записать(ИмяФайла);

Здесь мы указываем расширение "epf", которое ассоциируется с внешними печатными формами. Именно на этом шаге, как показывает опыт сообщений 26 и 28, может возникнуть проблема с безопасным режимом.

Шаг 3: Создание экземпляра внешней обработки с отключением безопасного режима

Это один из наиболее критичных шагов. При попытке записи файла (ДвоичныеДанные.Записать(ИмяФайла)) или при последующем создании экземпляра внешней обработки, система 1С может активировать безопасный режим. В управляемых формах, особенно в клиент-серверном варианте, выполнение файловых операций на сервере или создание экземпляров внешних объектов часто ограничивается мерами безопасности.

Проблема, описанная в сообщениях 24, 26, 28, 29 и окончательно решенная в 32, заключалась в "безопасном режиме расширения". Для решения этой проблемы при создании экземпляра внешней обработки через ВнешниеОбработки.Создать() необходимо явно указать, что безопасный режим должен быть отключен для данного экземпляра.

ВН = ВнешниеОбработки.Создать(ИмяФайла, Ложь);

Метод ВнешниеОбработки.Создать() принимает два параметра:

  1. ИмяФайла: Полный путь к временному файлу, содержащему внешнюю обработку.
  2. БезопасныйРежим: Значение типа Булево. Если передать Ложь, то внешняя обработка будет создана и сможет выполняться без ограничений безопасного режима, что позволит ей выполнять файловые операции (если они есть в ее коде) и другие "опасные" действия.

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

Шаг 4: Вызов экспортной функции ВПФ для формирования ТабличногоДокумента

После успешного создания экземпляра внешней обработки (в переменной ВН), мы можем вызвать её экспортные процедуры и функции. Из сообщений 17, 18 и 22 становится ясно, что в типовых ВПФ для формирования печатной формы обычно используется экспортная функция с именем, похожим на СформироватьПечатнуюФормуМЛ (где "МЛ" — это сокращение от "Маршрутный Лист" в данном случае). Эта функция должна возвращать объект типа ТабличныйДокумент.

Типовые параметры для такой функции, как указано в сообщениях 18, 19 и 23, обычно включают:

Таким образом, мы вызываем функцию и получаем табличный документ:


// Накл - это наш массив документов, для которых нужна печать
ТД = ВН.СформироватьПечатнуюФормуМЛ(Накл, Новый СписокЗначений, Новый Структура);

Теперь в переменной ТД у нас находится полностью сформированный табличный документ, готовый к печати.

Шаг 5: Прямая печать ТабличногоДокумента

Получив объект ТабличныйДокумент, мы можем отправить его непосредственно на принтер, используя метод Напечатать(). Этот метод позволяет выполнить прямую печать без вывода предварительного просмотра.

Для печати на принтер по умолчанию достаточно вызвать:

ТД.Напечатать();

Если требуется печать на конкретный принтер или с определённым количеством копий, можно использовать перегруженные варианты метода:


// Пример: печать на принтер с именем "Мой_Принтер" в 2 экземплярах
// ТД.Напечатать("Мой_Принтер", 2);

Обратите внимание, что имя принтера должно быть точным, как оно зарегистрировано в операционной системе. Если имя принтера не указано, документ будет отправлен на принтер, установленный по умолчанию.

Финальный код

Итак, объединяя все шаги, мы получаем рабочий программный код для непосредственной печати внешней печатной формы:


// ВПФ - ссылка на элемент справочника ДополнительныеОтчетыИОбработки
// Накл - массив ссылок на документы (например, РеализацииТоваровУслуг), для которых формируется печать

&НаСервере
Функция НапечататьВПФ(ВПФ, Накл)
    // Шаг 1: Получаем двоичные данные внешней печатной формы
    ДвоичныеДанные = ВПФ.ХранилищеОбработки.Получить();
    
    // Шаг 2: Записываем ВПФ во временный файл
    ИмяФайла = ПолучитьИмяВременногоФайла("epf");
    ДвоичныеДанные.Записать(ИмяФайла);
    
    // Шаг 3: Создаем экземпляр внешней обработки, отключая безопасный режим
    // Второй параметр 'Ложь' критически важен для обхода проблем с безопасным режимом
    ВН = ВнешниеОбработки.Создать(ИмяФайла, Ложь);
    
    // Шаг 4: Вызываем экспортную функцию ВПФ для формирования ТабличногоДокумента
    // СформироватьПечатнуюФормуМЛ - пример имени функции из ВПФ "Маршрутный лист"
    // Передаем массив объектов и пустые СписокЗначений/Структура для ОбъектыПечати/ПараметрыПечати
    ТД = ВН.СформироватьПечатнуюФормуМЛ(Накл, Новый СписокЗначений, Новый Структура);
    
    // Шаг 5: Отправляем ТабличныйДокумент на принтер по умолчанию
    ТД.Напечатать();
    
    // Можно удалить временный файл после печати
    УдалитьФайлы(ИмяФайла);
    
    // Если нужно вернуть что-то, кроме ТД, или просто завершить функцию
    Возврат Истина; // Или любой другой результат
КонецФункции

// Пример вызова на клиенте (предполагая, что ВПФ и Накл уже получены)
&НаКлиенте
Процедура ПечатьМаршрутногоЛистаНаПринтер()
    // Предполагаем, что ВПФСсылка и МассивНакладных определены
    // Например: ВПФСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Маршрутный лист");
    // МассивНакладных = ...
    Если НапечататьВПФ(ВПФСсылка, МассивНакладных) Тогда
        Сообщить("Маршрутные листы успешно отправлены на печать.");
    Иначе
        Сообщить("Произошла ошибка при печати маршрутных листов.");
    КонецЕсли;
КонецПроцедуры

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

Альтернативные подходы через БСП

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

  1. УправлениеПечатью.НапечататьДокументы(): Эта процедура из БСП предназначена для печати коллекций печатных форм. Чтобы использовать её, вам сначала нужно было бы поместить ваш сформированный ТабличныйДокумент в КоллекцияПечатныхФорм с помощью, например, УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(). Затем вы могли бы вызвать УправлениеПечатью.НапечататьДокументы(КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыПечати, Истина), где последний параметр Истина означает прямую печать без предпросмотра.
  2. РаспечататьТабличныеДокументы(): Упоминаемая в обсуждении процедура также относится к БСП и предназначена для печати списка готовых табличных документов. Для её использования вам понадобится массив ТабличныхДокументов.

Однако для прямого вывода одного табличного документа, полученного из ВПФ, метод ТД.Напечатать() является наиболее простым и эффективным.

Заключение

Мы успешно разобрали, как программно отправить внешнюю печатную форму на принтер в 1С:УТ 11.4, минуя стандартную форму предварительного просмотра. Ключевыми шагами стали: извлечение двоичных данных ВПФ, запись их во временный файл, создание экземпляра внешней обработки с отключенным безопасным режимом, вызов экспортной функции для получения ТабличногоДокумента и его прямая печать методом Напечатать(). Особое внимание уделили решению проблемы с безопасным режимом, которая может возникнуть при работе с файлами и внешними обработками.

← На главную