При разработке внешних печатных форм (ВПФ) в среде «1С:Предприятие 8.3» на базе Библиотеки стандартных подсистем (БСП) часто возникает задача: перед выводом печатного документа на экран запросить у пользователя дополнительные параметры. Это может быть выбор подписантов, установка флагов отображения скидок, выбор склада, вывод факсимиле или другие специфические настройки.
Начинающие разработчики часто совершают классическую ошибку: пытаются вызвать форму настроек (через метод ПолучитьФорму или ОткрытьФорму) непосредственно из процедуры Печать в модуле объекта обработки. В результате система выдает ошибку, так как модуль объекта внешней печатной формы выполняется на сервере, где интерактивные действия и работа с клиентскими окнами физически невозможны.
В этой статье мы подробно разберем, как правильно реализовать данный механизм с использованием штатных возможностей БСП, используя режим запуска команды «ВызовКлиентскогоМетода».
---
Чтобы обойти ограничение клиент-серверного разделения, мы должны разделить процесс печати на три последовательных этапа:
ВызовКлиентскогоМетода), а не напрямую на сервере.---
Сначала подготовим процедуру регистрации нашей печатной формы в справочнике «Дополнительные отчеты и обработки». Откроем модуль объекта внешней обработки и напишем функцию СведенияОВнешнейОбработке.
Обратите внимание на заполнение таблицы команд: для колонки Использование мы укажем значение ВызовКлиентскогоМетода, а в качестве идентификатора команды укажем имя нашей основной формы.
&НаСервере
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
// Указываем документы, к которым подключается печатная форма
МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");
МассивНазначений.Добавить("Документ.СчетНаОплатуПокупателю");
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Наименование", "Печать с предварительными настройками");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ПараметрыРегистрации.Вставить("Информация", "Дополнительная печатная форма с возможностью настройки параметров перед выводом.");
// Создаем таблицу команд
ТаблицаКоманд = ПолучитьТаблицуКоманд();
// Добавляем команду. "ИмяОсновнойФормы" - идентификатор нашей формы, которая откроется на клиенте
ДобавитьКоманду(ТаблицаКоманд,
"Печать с настройкой...",
"ИмяОсновнойФормы",
"ВызовКлиентскогоМетода",
Ложь,
"ПечатьMXL");
ПараметрыРегистрации.Vставить("Команды", ТаблицаКоманд);
Возврат ПараметрыРегистрации;
КонецФункции
&НаСервере
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка"));
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
&НаСервере
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
---
Для того чтобы БСП корректно передала контекст вызываемых документов во внешнюю обработку, нам потребуется создать **Основную форму** обработки. Назовем её ИмяОсновнойФормы.
Важно: В реквизитах этой формы обязательно нужно объявить три параметра:
ДополнительнаяОбработкаСсылка (Тип: СправочникСсылка.ДополнительныеОтчетыИОбработки)ИдентификаторКоманды (Тип: Строка)ОбъектыНазначения (Тип: Массив)Если эти параметры не будут объявлены, БСП не сможет передать в форму информацию о документах, из которых была нажата кнопка печати.
После создания параметров перейдем в модуль этой основной формы и напишем экспортную процедуру Печать. Именно ее БСП вызывает при старте клиентского сценария:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
// Подготовим параметры, которые мы хотим передать в нашу форму ввода настроек
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ОбъектыНазначения", ОбъектыНазначенияМассив);
// Настроим обработчик закрытия окна настроек
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеНастройкиПараметров", ЭтотОбъект, ОбъектыНазначенияМассив);
// Открываем интерактивную вспомогательную форму "ФормаНастроек"
ОткрытьФорму("ВнешняяОбработка.ИмяВашейОбработкиВСистеме.Форма.ФормаНастроек",
ПараметрыФормы,
ЭтотОбъект,
Истина, , ,
ОписаниеОповещения,
РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры
&НаКлиенте
Процедура ПослеНастройкиПараметров(РезультатВыбора, ДополнительныеПараметры) Экспорт
// Если пользователь закрыл форму настроек крестиком или нажал "Отмена"
Если РезультатВыбора = Неопределено Или Не РезультатВыбора.Свойство("Выполнено") Или Не РезультатВыбора.Выполнено Тогда
Возврат;
КонецЕсли;
// Подготавливаем структуру для открытия стандартного просмотрщика печати БСП
// В новых версиях БСП (3.1.9+) структура ОБЯЗАТЕЛЬНО должна содержать 3 ключа:
ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника, КоллекцияПечатныхФорм");
// Ссылка на элемент справочника дополнительных обработок
ПараметрыОткрытия.ИсточникДанных = Параметры.ДополнительнаяОбработкаСсылка;
// Формируем параметры источника данных
ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
ПараметрыИсточника.ИдентификаторКоманды = Параметры.ИдентификаторКоманды;
ПараметрыИсточника.ОбъектыНазначения = ДополнительныеПараметры; // Массив документов
// Передаем настройки пользователя во вложенную структуру.
// Именно здесь лежат наши флаги, подписанты и даты, выбранные в форме настроек!
ПараметрыИсточника.Вставить("ДополнительныеПараметры", РезультатВыбора.Настройки);
ПараметрыОткрытия.ПараметрыИсточника = ПараметрыИсточника;
// Открываем стандартную общую форму предварительного просмотра БСП
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);
КонецПроцедуры
---
Теперь создадим вторую форму в нашей внешней обработке и назовем ее ФормаНастроек. На ней мы разместим необходимые элементы управления. Например:
ВыводитьПодписи (Тип: Булево)ОтветственныйПодписант (Тип: СправочникСсылка.ФизическиеЛица)Добавим на форму две кнопки: «Продолжить» (свойство КнопкаВыбора = Истина) и «Отмена».
Напишем простой код обработчиков событий для кнопок в модуле ФормаНастроек:
&НаКлиенте
Процедура КомандаОК(Команда)
// Собираем все настройки в структуру
СтруктураНастроек = Новый Структура;
СтруктураНастроек.Вставить("ВыводитьПодписи", Объект.ВыводитьПодписи);
СтруктураНастроек.Вставить("ОтветственныйПодписант", Объект.ОтветственныйПодписант);
// Передаем результат обратно в вызывающую форму
РезультатЗакрытия = Новый Структура;
РезультатЗакрытия.Вставить("Выполнено", Истина);
РезультатЗакрытия.Вставить("Настройки", СтруктураНастроек);
Закрыть(РезультатЗакрытия);
КонецПроцедуры
&НаКлиенте
Процедура КомандаОтмена(Команда)
Закрыть(Неопределено);
КонецПроцедуры
---
Когда общая форма просмотра БСП ОбщаяФорма.ПечатьДокументов открывается, она обращается к нашей обработке на сервере и запускает стандартную экспортную функцию Печать в модуле объекта. Мы должны извлечь наши пользовательские параметры из структуры ПараметрыВывода и использовать их при формировании печатной формы.
Проанализируем структуру параметров и напишем код модуля объекта:
// Функция вызывается платформой БСП на сервере
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ИмяМакета = "ИмяОсновнойФормы"; // Идентификатор нашей команды
// Извлекаем переданные пользователем настройки
НастройкиПользователя = Неопределено;
Если ПараметрыВывода <> Неопределено Тогда
ПараметрыВывода.Свойство("ДополнительныеПараметры", НастройкиПользователя);
КонецЕсли;
// Если по какой-то причине настройки не дошли, инициализируем их значениями по умолчанию
Если НастройкиПользователя = Неопределено Тогда
НастройкиПользователя = Новый Структура("ВыводитьПодписи, ОтветственныйПодписант", Ложь, Справочники.ФизическиеЛица.ПустаяСсылка());
КонецЕсли;
// Формируем табличный документ с учетом настроек пользователя
ТабДокумент = СформироватьТабличныйДокумент(МассивОбъектов, НастройкиПользователя);
// Выводим сформированный макет в коллекцию для отображения пользователю
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, ИмяМакета) Тогда
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
ИмяМакета,
"Печатный документ с настройками",
ТабДокумент
);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция СформироватьТабличныйДокумент(МассивОбъектов, НастройкиПользователя)
ТабДокумент = Новый ТабличныйДокумент;
ТабДокумент.АвтоМасштаб = Истина;
Макет = ПолучитьМакет("МакетПечати");
// Выводим данные документов в цикле
Для Каждого ТекущийДокумент Из МассивОбъектов Цикл
// Шапка документа
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.Заполнить(ТекущийДокумент);
ТабДокумент.Вывести(ОбластьШапка);
// Строки документа (табличная часть)
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаТЧ Из ТекущийДокумент.Товары Цикл
ОбластьСтрока.Параметры.Заполнить(СтрокаТЧ);
ТабДокумент.Вывести(ОбластьСтрока);
КонецЦикла;
// Подвал документа с условным выводом подписей на основе пользовательской настройки
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
Если НастройкиПользователя.ВыводитьПодписи Тогда
ОбластьПодвал.Параметры.ФИОПодписанта = НастройкиПользователя.ОтветственныйПодписант;
Иначе
ОбластьПодвал.Параметры.ФИОПодписанта = "_________________";
EndЕсли;
ТабДокумент.Вывести(ОбластьПодвал);
КонецЦикла;
Возврат ТабДокумент;
КонецФункции
---
При работе в современных конфигурациях (например, 1С:Бухгалтерия 3.0 свежих релизов) необходимо строго следовать правилам передачи параметров при программном открытии формы ПечатьДокументов.
Помните: структура ПараметрыОткрытия обязательно должна быть инициализирована конструктором с тремя ключами: Новый Структура("ИсточникДанных, ПараметрыИсточника, КоллекцияПечатныхФорм"). Если опустить ключ КоллекцияПечатныхФорм, система выдаст ошибку совместимости типов на этапе открытия формы просмотра.
Применяя этот подход, мы получаем гибкий и полностью соответствующий стандартам разработки 1С (БСП) инструмент для реализации интерактивной печати с любыми предварительными настройками.