gifts2017

Еще раз про отладку внешних печатных форм в Управляемом приложении

Опубликовал A_kryl К (A_kryl) в раздел Программирование - Практика программирования

Как добиться отладки внешних печатных форм в управляемом приложении аналогично отладке под толстым клиентом.

Частенько вижу рекомендации по отладке внешних печатных форм в управляемом приложении через ошибки, дополнительные обработки и т.д. и т.п. В то время как это можно сделать полностью аналогично отладке в толстом клиенте. Имеется ввиду способ - когда к внешней обработке добавляется форма где есть реквизит ссылкаНаОбъект, и эта форма вызывает уже процедуру формирования табличного документа из модуля объекта и показывает сформированный табличный документ.

Итак в модуле внешней обработки мы имеем процедуру:

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

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

добавляем в отчет реквизит СсылкаНаОбъект того типа что нам нужен здесь, один в один как в толстом клиенте. Создаем форму - реквизит на ней добавится автоматом. Добавляем на форме кнопку - Печать, привязываем к ней команду Печать и создаем автоматом процедуру на сервере и на клиенте.

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

    // Вставить содержимое обработчика.
КонецФункции

&НаКлиенте
Процедура Команда1(Команда)
    Команда1НаСервере().Показать();
КонецПроцедуры

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

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

Функция ПечатьСчетДоговор(МассивОбъектов) Экспорт

Доработка минимальная, и займет немногим больше времени чем в толстом клиенте. Отлаженную печатную форму без всяких изменений можно добавить во внешние отчеты и обработки - она будет полностью работоспособна.

Теперь мы можем свободно отлаживать форму открыв ее через меню файл. Переходить на ошибки напрямую в конфигуратор/обработку и вставлять готовую печатную форму в дополнительные отчеты и обработки без всяких допиливаний - как есть.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Дмитрий Царапкин (NeviD) 21.11.16 11:53
Можно эмулировать БСП-шный вызов процедуры Печать.
Тогда печатная форма будет выводиться в стандартную форму для печатных форм, со всеми её плюсами.

&НаСервере
Функция СформироватьНаСервере(ОбъектыПечати)

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

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

КонецПроцедуры
...Показать Скрыть
2. Art Fa (artfa) 23.11.16 12:03
в форме
&НаСервере
Функция ПечатьНаСервере()
    МассивОбъектов = Новый Массив;
    МассивОбъектов.Добавить(Объект.СсылкаНаОбъект);
    ОбработкаОбъект = РеквизитФормыВЗначение("Объект");

	СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);

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

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

&НаКлиенте
Процедура Печать(Команда)
	ПечатьНаСервере();
КонецПроцедуры
...Показать Скрыть

в модуле
Функция СформироватьПечатнуюФормуСчетНаОплату(СтруктураТипов, ОбъектыПечати, ПараметрыПечати, КомплектыПечати = Неопределено) Экспорт
3. Сергей Семченков (BigClock) 23.11.16 15:39
(2) artfa,
Ваше решение требует скопировать текст функции "СоответствиеМассивовПоТипамОбъектов" из УТ
В других конфигурациях на основе БСП функции с таким именем нет, или, возможно, она называется по-другому.

(1) NeviD,
спасибо.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа