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

Программирование - Практика программирования

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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

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

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

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

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

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

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

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

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

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

(1) NeviD,
спасибо.
4. rasswet (rasswet) 80 11.01.17 08:22 Сейчас в теме
интересная идея спасибо.
5. Эдуард Попсуев (edip) 18.01.17 23:13 Сейчас в теме
Используя идею отсюда, можно сделать так:

в процедуре ДополнительныеОтчетыИОбработки.ПечатьПоВнешнемуИсточнику находим строки
	ВнешняяОбработкаОбъект = ПолучитьОбъектВнешнейОбработки(Ссылка);
	
	Если ВнешняяОбработкаОбъект = Неопределено Тогда
		ВызватьИсключение СтрШаблон(

ставим точку останова по условию на строку
Если ВнешняяОбработкаОбъект = Неопределено Тогда

в условии пишем код
ВнешниеОбработки.Создать("C:\Отладка\ОбработкаПечатнаяФорма.epf", Ложь).Отладка(ВнешняяОбработкаОбъект)

в модуль обработки добавляем функцию Отладка
Функция Отладка(ОбработкаОбъект) Экспорт
	
	ОбработкаОбъект = ЭтотОбъект;
	Возврат Ложь;
	
КонецФункции
...Показать Скрыть

В результате при проверке условия переменной ВнешняяОбработкаОбъект присваивается объект нашей внешней обработки из файла C:\Отладка\ОбработкаПечатнаяФорма.epf и можно спокойно ее отлаживать.
6. A_kryl К (A_kryl) 125 19.01.17 08:44 Сейчас в теме
(5)
ДополнительныеОтчетыИОбработки
Это же правка конфигурации? Как еще один вариант...
7. Эдуард Попсуев (edip) 19.01.17 13:37 Сейчас в теме
(6) Никакой правки конфигурации. В нужном месте точка останова с условием и одна дополнительная функция в модуле отлаживаемой внешней обработки.
Оставьте свое сообщение