Приветствую Вас ГостьСуббота, 18.05.2024, 12:39

Каталог статей


Внешняя печатная форма с предварительным вводом данных

Рассмотрим случай когда  надо перед формированием печатной формы ввести какие-то значения, которые потом будут выведены в печатной форме.

Общий алгоритм следующий:

  1. Определяем сведения об обработке в модуле обработки, с учетом того, что нам надо запустить клиентский метод. 
  2. Так же в модуле обработки создаем процедуру "Печать" в которой формируется табличный документ и добавляется в коллекцию печатных форм. 
  3. Создаем основную форму обработки, в которой прописываем клиентскую процедуру Печать(ИдентификаторКоманды, МассивОбъектов) Экспорт. В этой процедуре либо открываем форму с параметрами, либо программируем ввод параметров в диалоге (Ввод значений).
  4. Формируем из введенных значений структуру и передаем её в метод модуля обработки (п. 2)  для получения табличного документа и коллекции печатных форм. В принципе процедуру из пункта 2 можно разместить и в модуле текущей формы - это дело вкуса.
  5. После того, как сформировали коллекцию печатных форм, выполняем метод УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФорм, ОбъектыПечати). Здесь есть нюанс: КоллекцияПечатныхФорм - это таблица значений. Таблицу значений нельзя передать с сервера на клиент, так как она не доступна на клиенте, поэтому таблица значений преобразовывается в массив структур с помощью метода ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм)

Рассмотрим подробнее случай когда параметры вводятся в отдельной форме:

1. Создаем внешнюю обработку.

Чтобы формирование табличного документа началось с клиентской процедуры надо в сведениях о внешней обработки указать Использование = "ВызовКлиентскогоМетода". Встречал в интернете альтернативное значение ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода().

В модуле обработки формируем сведения об обработки:

Перем НазваниеФормы;
Перем ИдентификаторФормы;

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

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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение, Модификатор)

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

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

В переменнst НазваниеФормы и ИдентификаторФормы записываем значения, чтобы не пришлось писать одно и тоже название в разных частях модуля. Здесь рассматриваем случай, когда в обработке только одна внешняя форма. Если несколько, то в других вызовах метода ДобавитьКоманду() надо будет указать соответствующие данные.

2. Создаем процедуру формирования табличного документа и заполнения коллекции печатных форм. В параметр СтруктураДопПараметров мы будем передавать структуру введенных данных на форме

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

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

Процедура ФормированиеТабДокумента(ТабличныйДокумент, Макет, ДокументСсылка, СтруктураДопПараметров)       
    
    Область = Макет.ПолучитьОбласть("Область1");
    Область.Параметры.Контрагент = СтруктураДопПараметров.Контрагент;  // выводим параметр из формы
    Область.Параметры.Документ = ДокументСсылка; // выводим ссылку на выбранный в списке документ
    ТабличныйДОкумент.Вывести(Область); 
    
КонецПроцедуры

ИдентификаторФормы = "АктТест";
НазваниеФормы = "Тестовая форма";

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

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

 

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

Создаем в форме реквизиты для ввода нужных значений и размещаем их на форме. В данном случае это "Контрагент".

Создаем команду для вывода печатной формы после ввода нужных реквизитов. (ПечатьДокумента)

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

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

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

 

Если бы мы не использовали параметры формы, то пришлось бы перехватывать значения в методу "ПриСозданииНаСервере" и заботиться о хранении значений.

Сначала формируем результирующий табличный документ и коллекцию печатных форм.

Обратите на то, что КоллекцияПечатныхФорм - это таблица значений и её нельзя вернуть на клиент, поэтому предварительно преобразовываем её в массив структур.

4. Формируем структуру данных в которой храним введенные значения на форме. Передаем эту структуру в качестве дополнительного параметра метода в модуле обработки.

5. Вызываем метод  УправлениеПечатьюКлиент.ПечатьДокументов(), который выводит печатную форму на экран.

 

 

Категория: Программирование | Добавил: leshic (31.03.2023)
Просмотров: 460 | Рейтинг: 5.0/1
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [41]
Администрирование [35]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0