Как открыть форму внешней печатной формы перед выводом на печать в 1С?

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

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

Шаг 1. Настройка регистрации внешней обработки

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

Разберем пример настройки команды в функции СведенияОВнешнейОбработке:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма;
    ПараметрыРегистрации.Назначение.Добавить("Документ.РасходнаяНакладная");
    ПараметрыРегистрации.Наименование = "Печать с параметрами";
    ПараметрыРегистрации.Версия = "1.1";
    ПараметрыРегистрации.БезопасныйРежим = Истина;

    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = "Печать с выбором настроек";
    НоваяКоманда.Идентификатор = "ПечатьСПараметрами";
    
    // КРИТИЧЕСКИ ВАЖНЫЙ МОМЕНТ:
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
    
    НоваяКоманда.Модификатор = "ПечатьMXL";
    
    Возврат ПараметрыРегистрации;
КонецФункции

Указав ТипКомандыОткрытиеФормы(), мы говорим системе, что при нажатии кнопки в меню «Печать» нужно найти основную форму обработки и открыть её, а не пытаться сразу вызвать экспортный метод модуля объекта.

Шаг 2. Получение ссылки на документ в форме

Теперь рассмотрим ситуацию: форма открылась, но нам нужно знать, для какого именно документа (или списка документов) она была вызвана. Когда БСП открывает форму внешней обработки, она автоматически передает в неё структуру параметров. Самый важный для нас параметр — ОбъектыНазначения.

Выясним причину, по которой данные не заполняются автоматически в реквизитах. Поскольку форма «внешняя», она не знает о контексте вызова сама по себе. Нам нужно вручную перехватить параметры в обработчике ПриСозданииНаСервере. Рассмотрим код:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем наличие параметра ОбъектыНазначения
    Если Параметры.Свойство("ОбъектыНазначения") Тогда
        МассивСсылок = Параметры.ОбъектыНазначения;
        
        Если МассивСсылок.Количество() > 0 Тогда
            // Если нам нужна ссылка только на один (первый) документ:
            Объект.СсылкаНаОбъект = МассивСсылок[0];
            
            // Если мы поддерживаем печать нескольких документов сразу, 
            // лучше сохранить весь массив в реквизит формы типа "СписокЗначений"
        КонецЕсли;
    КонецЕсли;
    
    // Также полезно получить ссылку на саму запись справочника "Дополнительные отчеты и обработки"
    Если Параметры.Свойство("ДополнительнаяОбработкаСсылка") Тогда
        СсылкаНаОбработку = Параметры.ДополнительнаяОбработкаСсылка;
    КонецЕсли;

КонецПроцедуры

Важный момент: Параметр ОбъектыНазначения всегда является массивом, даже если пользователь нажал печать из формы одного документа. Всегда обрабатывайте его именно как массив.

Шаг 3. Запуск печати из формы

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

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


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

Шаг 4. Обработка параметров в модуле объекта

Заключительный этап — принять переданные из формы параметры в основной процедуре Печать модуля объекта. Рассмотрим, как это выглядит в коде:


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

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

Рекомендации и особенности

Разберем несколько важных нюансов, которые помогут сделать вашу обработку более профессиональной:

  1. Безопасный режим: Если в регистрации указано БезопасныйРежим = Истина, помните, что ваша форма будет ограничена в правах. Она не сможет записывать файлы на диск сервера или обращаться к COM-объектам без специальных разрешений.
  2. Сохранение настроек: Чтобы пользователю не приходилось каждый раз заполнять одни и те же данные (например, ставить галочку «С печатью»), используйте свойство формы «Автоматическое сохранение данных в настройках». Включите его для нужных реквизитов формы.
  3. Множественный выбор: Если ваша печатная форма вызывается из списка, где выделено 10 документов, массив ОбъектыНазначения будет содержать 10 ссылок. Постарайтесь спроектировать интерфейс формы так, чтобы настройки были применимы ко всем выбранным объектам сразу.
  4. Программное закрытие: Использование метода Закрыть() после вызова команды печати — хороший тон. Это избавляет пользователя от необходимости вручную закрывать ставшее ненужным окно параметров.

Таким образом, мы проанализировали полный цикл работы с промежуточной формой внешней печатной формы. Сочетание правильной регистрации типа команды и корректного извлечения параметров из ОбъектыНазначения позволяет реализовывать гибкие и удобные инструменты для конечных пользователей.

← На главную