1CLenta.ru  

Открытие формы настроек при запуске печатной формы в управляемом приложении

Программирование системы     10.04.2018 07:51     40519

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

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

Обработка для внешней печатной формы


Обработка содержит две формы: ФормаТестов, ФормаНастроек.

Обработка печатной формы

В функции СведенияОВнешнейОбработке() для свойства "Использование" нужно установить значение "ВызовКлиентскогоМетода". Это означает, что при запуске печатной формы из 1С Предприятия, будет автоматически запускаться экспортная функция Печать() ИЗ ОСНОВНОЙ ФОРМЫ ОБРАБОТКИ, при этом форма не открывается.

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

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

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

НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = "Товарная накладная";
НоваяКоманда.Идентификатор = "Товарная накладная";
НоваяКоманда.Использование = "ВызовКлиентскогоМетода";
НоваяКоманда.ПоказыватьОповещение = Истина;
НоваяКоманда.Модификатор = "ПечатьMXL";

ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

Возврат ПараметрыРегистрации;

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


Форма тестов


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

Форма тестов печатной формы

//Для тестирования
&НаКлиенте
Процедура КомандаПечать(Команда)

Если НЕ ЗначениеЗаполнено(Документ) Тогда
Сообщить("Не указан документ");
Возврат;
КонецЕсли;

МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Документ);

ИдентификаторКоманды = "Товарная накладная";

Печать(ИдентификаторКоманды, МассивОбъектов);

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


//Для вызова механизмом печатных форм
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, МассивОбъектов) Экспорт

СтрПраметры = Новый Структура;
СтрПраметры.Вставить("ИдентификаторКоманды", ИдентификаторКоманды);
СтрПраметры.Вставить("МассивОбъектов", МассивОбъектов);

ОткрытьФорму("ВнешняяОбработка.ВнешняяОбработка1.Форма.ФормаНастроек", СтрПраметры);

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


Форма настроек


На форме настроек расположим несколько полей ввода. Зададим обработчик действия для кнопки "ПродолжитьПечать".

Форма настроек печатной формы

Еще нужно добавить 2 параметра формы: ИдентификаторКоманды, МассивОбъектов, которые передаются при открытии формы. Эти параметры должны быть с признаком Ключевой параметр.

Параметры формы настроек печатной формы

&НаКлиенте
Процедура ПродолжитьПечать(Команда)

СтрПечать = ПродолжитьПечатьНаСервере();
УправлениеПечатьюКлиент.ПечатьДокументов(СтрПечать.КоллекцияПечатныхФорм, СтрПечать.ОбъектыПечати);
Закрыть();

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


&НаСервере

Функция ПродолжитьПечатьНаСервере()

СтрНастройки = Новый Структура;
СтрНастройки.Вставить("Реквизит1", Реквизит1);
СтрНастройки.Вставить("Реквизит2", Реквизит2);
СтрНастройки.Вставить("Реквизит3", Реквизит3);

КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(Параметры.ИдентификаторКоманды);
ОбъектыПечати = Новый СписокЗначений;

ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.гДопДанные = СтрНастройки;
ОбработкаОбъект.Печать(Параметры.МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати);

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

Возврат СтрПечать;

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


В модуле объекта обработки, разместим экспортную функцию печать, которая занимается формированием табличного документа.

Перем гДопДанные Экспорт;

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати) Экспорт

Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "Товарная накладная") Тогда

ТабДокумент = Новый ТабличныйДокумент;

Для каждого ДокументСсылка Из МассивОбъектов Цикл

//Начало области, для параметра ОбъектыПечати.
//ОбъектыПечати используется для связи документа с его областью печати,
//когда в табличный документ выводится 2 и более документов
НомерСтрокиНачало = ТабДокумент.ВысотаТаблицы + 1;

//Заполнение ТабДокумента
//...
//...
//...

//Заполнение параметра ОбъектыПечати
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДокумент,
НомерСтрокиНачало,
ОбъектыПечати,
ДокументСсылка);

КонецЦикла;

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

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

Комментарии (2)

1. Владислав  13.09.2018 11:14  
{ВнешняяОбработка.ВнешняяОбработка1.Форма.ФормаНастроек.Форма(17)}: Поле объекта не обнаружено (ИдентификаторКоманды)
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(Параметры.ИдентификаторКоманды);

Подскажите, в чем ошибка?
2. Admin  04.10.2018 10:20  
Возможно в форме настроек не добавлен параметр ИдентификаторКоманды типа "строка" с признаком Ключевой параметр.