Как создать внешнюю печатную форму в 1С 8.3 с открытием формы настроек перед печатью

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

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

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

В этой статье мы подробно разберем, как правильно реализовать данный механизм с использованием штатных возможностей БСП, используя режим запуска команды «ВызовКлиентскогоМетода».

---

Архитектурный принцип решения задачи

Чтобы обойти ограничение клиент-серверного разделения, мы должны разделить процесс печати на три последовательных этапа:

  1. Регистрация команды печатной формы: Мы сообщаем системе, что наша команда печати должна вызываться на клиенте (тип запуска — ВызовКлиентскогоМетода), а не напрямую на сервере.
  2. Интерактивный диалог (Клиент): При нажатии кнопки «Печать» БСП вызывает клиентский метод нашей обработки. Мы открываем диалоговое окно настроек, в котором пользователь выбирает нужные параметры. После подтверждения выбора мы программно инициируем печать.
  3. Формирование документа (Сервер): Переданные пользователем настройки поступают в процедуру печати модуля объекта на сервере. На основе этих настроек генерируется и выводится итоговый табличный документ.

---

Шаг 1. Регистрация внешней печатной формы в модуле объекта

Сначала подготовим процедуру регистрации нашей печатной формы в справочнике «Дополнительные отчеты и обработки». Откроем модуль объекта внешней обработки и напишем функцию СведенияОВнешнейОбработке.

Обратите внимание на заполнение таблицы команд: для колонки Использование мы укажем значение ВызовКлиентскогоМетода, а в качестве идентификатора команды укажем имя нашей основной формы.


&НаСервере
Функция СведенияОВнешнейОбработке() Экспорт

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

КонецФункции

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

&НаСервере
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры

---

Шаг 2. Создание и настройка Основной формы обработки

Для того чтобы БСП корректно передала контекст вызываемых документов во внешнюю обработку, нам потребуется создать **Основную форму** обработки. Назовем её ИмяОсновнойФормы.

Важно: В реквизитах этой формы обязательно нужно объявить три параметра:

Если эти параметры не будут объявлены, БСП не сможет передать в форму информацию о документах, из которых была нажата кнопка печати.

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


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

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

&НаКлиенте
Процедура ПослеНастройкиПараметров(РезультатВыбора, ДополнительныеПараметры) Экспорт
    
    // Если пользователь закрыл форму настроек крестиком или нажал "Отмена"
    Если РезультатВыбора = Неопределено Или Не РезультатВыбора.Свойство("Выполнено") Или Не РезультатВыбора.Выполнено Тогда
        Возврат;
    КонецЕсли;
    
    // Подготавливаем структуру для открытия стандартного просмотрщика печати БСП
    // В новых версиях БСП (3.1.9+) структура ОБЯЗАТЕЛЬНО должна содержать 3 ключа:
    ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника, КоллекцияПечатныхФорм");
    
    // Ссылка на элемент справочника дополнительных обработок
    ПараметрыОткрытия.ИсточникДанных = Параметры.ДополнительнаяОбработкаСсылка;
    
    // Формируем параметры источника данных
    ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
    ПараметрыИсточника.ИдентификаторКоманды = Параметры.ИдентификаторКоманды;
    ПараметрыИсточника.ОбъектыНазначения = ДополнительныеПараметры; // Массив документов
    
    // Передаем настройки пользователя во вложенную структуру. 
    // Именно здесь лежат наши флаги, подписанты и даты, выбранные в форме настроек!
    ПараметрыИсточника.Вставить("ДополнительныеПараметры", РезультатВыбора.Настройки);
    
    ПараметрыОткрытия.ПараметрыИсточника = ПараметрыИсточника;
    
    // Открываем стандартную общую форму предварительного просмотра БСП
    ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
    
КонецПроцедуры

---

Шаг 3. Создание вспомогательной формы настроек

Теперь создадим вторую форму в нашей внешней обработке и назовем ее ФормаНастроек. На ней мы разместим необходимые элементы управления. Например:

Добавим на форму две кнопки: «Продолжить» (свойство КнопкаВыбора = Истина) и «Отмена».

Напишем простой код обработчиков событий для кнопок в модуле ФормаНастроек:


&НаКлиенте
Процедура КомандаОК(Команда)
    
    // Собираем все настройки в структуру
    СтруктураНастроек = Новый Структура;
    СтруктураНастроек.Вставить("ВыводитьПодписи", Объект.ВыводитьПодписи);
    СтруктураНастроек.Вставить("ОтветственныйПодписант", Объект.ОтветственныйПодписант);
    
    // Передаем результат обратно в вызывающую форму
    РезультатЗакрытия = Новый Структура;
    РезультатЗакрытия.Вставить("Выполнено", Истина);
    РезультатЗакрытия.Вставить("Настройки", СтруктураНастроек);
    
    Закрыть(РезультатЗакрытия);
    
КонецПроцедуры

&НаКлиенте
Процедура КомандаОтмена(Команда)
    Закрыть(Неопределено);
КонецПроцедуры

---

Шаг 4. Обработка полученных параметров на сервере

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

Проанализируем структуру параметров и напишем код модуля объекта:


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

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

&НаСервере
Функция СформироватьТабличныйДокумент(МассивОбъектов, НастройкиПользователя)
    
    ТабДокумент = Новый ТабличныйДокумент;
    ТабДокумент.АвтоМасштаб = Истина;
    
    Макет = ПолучитьМакет("МакетПечати");
    
    // Выводим данные документов в цикле
    Для Каждого ТекущийДокумент Из МассивОбъектов Цикл
        
        // Шапка документа
        ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
        ОбластьШапка.Параметры.Заполнить(ТекущийДокумент);
        ТабДокумент.Вывести(ОбластьШапка);
        
        // Строки документа (табличная часть)
        ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
        Для Каждого СтрокаТЧ Из ТекущийДокумент.Товары Цикл
            ОбластьСтрока.Параметры.Заполнить(СтрокаТЧ);
            ТабДокумент.Вывести(ОбластьСтрока);
        КонецЦикла;
        
        // Подвал документа с условным выводом подписей на основе пользовательской настройки
        ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
        
        Если НастройкиПользователя.ВыводитьПодписи Тогда
            ОбластьПодвал.Параметры.ФИОПодписанта = НастройкиПользователя.ОтветственныйПодписант;
        Иначе
            ОбластьПодвал.Параметры.ФИОПодписанта = "_________________";
        EndЕсли;
        
        ТабДокумент.Вывести(ОбластьПодвал);
        
    КонецЦикла;
    
    Возврат ТабДокумент;

КонецФункции

---

Важные особенности для актуальных версий БСП (3.1.9 и новее)

При работе в современных конфигурациях (например, 1С:Бухгалтерия 3.0 свежих релизов) необходимо строго следовать правилам передачи параметров при программном открытии формы ПечатьДокументов.

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

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

← На главную