При разработке внешних печатных форм (ВПФ) на базе Библиотеки стандартных подсистем (БСП) часто возникает задача: перед формированием самого печатного документа запросить у пользователя дополнительные данные. Это может быть выбор ответственного лица, установка даты, выбор варианта оформления или любого другого параметра, который не хранится в самом документе. В этой статье мы подробно разберем, как правильно реализовать такое окно, как передать в него данные и как избежать типичных ошибок при регистрации команды.
Для начала проанализируем, как БСП взаимодействует с внешней обработкой. По умолчанию большинство печатных форм используют ВызовСерверногоМетода. В этом режиме система сразу обращается к модулю объекта обработки, выполняет процедуру Печать и ожидает на выходе табличный документ. В этой цепочке нет места для взаимодействия с пользователем, так как код исполняется на сервере.
Чтобы вывести окно, нам необходимо перехватить управление на клиенте. Для этого существуют два основных пути:
Рассмотрим подробнее, как должна выглядеть регистрация команды, если мы хотим использовать форму параметров. В функции СведенияОВнешнейОбработке модуля объекта необходимо правильно указать поле Использование.
Пример кода для регистрации с использованием клиентского метода:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
// ... заполнение основных параметров (Наименование, Вид и т.д.)
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = НСтр("ru = 'Печать с параметрами'");
НоваяКоманда.Идентификатор = "ПечатьСПараметрами";
// Указываем тип команды - Вызов клиентского метода
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
НоваяКоманда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
После того как мы указали ВызовКлиентскогоМетода, БСП при нажатии кнопки печати будет искать процедуру Печать в модуле основной формы обработки. Проанализируем важный нюанс: эта процедура должна быть экспортной и иметь строго определенную сигнатуру.
Разберем по шагам, что должно происходить в этой процедуре:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыПечати) Экспорт
// Параметры для открытия формы настроек
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ОбъектыПечати", ОбъектыПечати);
ПараметрыФормы.Вставить("ИдентификаторКоманды", ИдентификаторКоманды);
// Открываем форму параметров (например, форму с именем "ФормаНастроек")
ОткрытьФорму("ВнешняяОбработка.ИмяВашейОбработки.Форма.ФормаНастроек", ПараметрыФормы, ЭтаФорма);
КонецПроцедуры
Здесь ОбъектыПечати — это массив ссылок на документы, которые пользователь выбрал в списке. Важно передать их в форму параметров, иначе вы не будете знать, для каких именно объектов нужно формировать печать.
Выясним причину часто встречающейся ошибки, упомянутой в сообщениях форума. Если вы изменили тип команды на клиентский, но оставили процедуру Печать только в модуле объекта, БСП выдаст ошибку. При использовании ВызовКлиентскогоМетода система игнорирует модуль объекта и ищет процедуру именно в модуле формы.
Основные причины ошибки:
Печать отсутствует в модуле формы, которая назначена основной.Экспорт.&НаКлиенте по ошибке использована директива &НаСервере.Когда пользователь ввел данные в вашей форме параметров и нажал кнопку "ОК", нам нужно запустить стандартный механизм формирования печатной формы БСП. Посмотрим, как это сделать правильно, чтобы результат открылся в привычном пользователю окне предпросмотра.
В форме параметров создадим процедуру завершения:
&НаКлиенте
Процедура КомандаОК(Команда)
// Собираем настройки из реквизитов формы
СтруктураНастроек = Новый Структура;
СтруктураНастроек.Вставить("Подписант", Объект.Подписант);
СтруктураНастроек.Вставить("ВыводитьЦену", Объект.ВыводитьЦену);
// Теперь нам нужно вызвать формирование печати.
// Обычно это делается через вызов серверного метода модуля объекта.
// Но лучше всего воспользоваться стандартным методом БСП для вывода результата:
ВыполнитьПечатьНаСервере(СтруктураНастроек);
КонецПроцедуры
Для сохранения единообразия интерфейса рекомендуется в конечном итоге использовать метод УправлениеПечатьюКлиент.ПечатьДокументов. Это позволит вывести вашу форму в стандартный просмотрщик 1С с возможностью печати на принтер, сохранения в PDF и отправки по почте.
Проанализируем ситуацию: пользователю неудобно каждый раз вводить одни и те же параметры (например, свою фамилию в поле "Ответственный"). Мы можем использовать механизм автоматического сохранения настроек формы 1С. Для этого в свойствах формы параметров установите галочку "Автоматическое сохранение данных в настройках" и выберите нужные реквизиты в списке "Сохраняемые данные". Теперь при следующем открытии формы параметры заполнятся автоматически из последнего сеанса.
СведенияОВнешнейОбработке установите ТипКомандыВызовКлиентскогоМетода().&НаКлиенте Печать(ИдентификаторКоманды, ОбъектыПечати).ОткрытьФорму для вашей формы с параметрами.ТабличныйДокумент.Такой подход позволяет создавать профессиональные и удобные инструменты для пользователей, сохраняя при этом все преимущества стандартной библиотеки БСП.