Подключаем внешнюю печатную форму в режиме отладчика

Публикация № 1214650

Разработка - Печать - Универсальные печатные формы

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

Конфигурация у меня УТ 11.4 + CRM, короче УТ11.4, я сделал выгрузил рабочую базу через конфигуратор в файл dt. Затем создал папку тестовая база, открыл программу и создал новую базу без конфигурации, каталогом разумеется указал, выше созданную папку, далее открыл новую базу в режиме конфигуратора и загрузил тот dt файл который мы выгрузили, кстати, все это я сделал на учебной (демо) платформе.

Но этот метод можно использовать и на серверной базе.

 База у нас находится нп поддержке 1с, т.е. она типовая, следовательно изменять конфигурацию мы не будем, но для решения моего метода, нужно внести изменения в код конфигурации и что же блин делать, а вот что создаем расширение: нажимаем Конфигурация-Расширения конфигурации, далее нажимаем на беленький плюсик на зеленом фоне (добавить) в открывшемся окне пишем как будем называть свое расширение у меня VID назначение оставляем адаптация.

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

Далее ищем во вкладке конфигурации Общая - общие модули и ищем модуль под названием: ДополнительныеОтчетыИОбработки, нажимаем правой кнопкой на этот модуль и добавляем в наше расширение:

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

 Далее открываем данную функцию и меняем часть кода на этот, а оригинальный код комментируем:

ИмяОбработки = Менеджер.Создать ("C:\ВашаФорма.epf", Ложь);
ИмяОбработки = "ВашаФорма"

 Скопировать путь фашей формы можно следующим способом, находите вашу форму и удерживая клавишу Shift нажимаем ПКМ (правая кнопка мыши - это та которую вы будете видит справа от левой)))), и у вас появится там надпись "копировать как путь", ее и нажимаете, путь у Вас копируется в буфер обмена компьютера, а вам остается только вставить в код, опять же правой кнопкой мыши или нажимая Ctrl + V. 

Далее открываете процедуру и также вносите изменения в код:

ВнешнийОбъект = Менеджер.Создать ("С:\ВашаФорма.epf", Ложь);

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

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

Я установил точку останова с помощью клавиши F9, также можно клацнуть мышкой по серенькой полоске в модуле два раза она тоже появиться, установил я ее на функцию СведенияОВнешнейОбработке, затем открыл программу 1С в режиме отладчика, Нажал: НСИ и администрирование - Печатные формы, отчеты и обработки - -Дополнительные отчеты и обработки, затем нажал на кнопку добавить и обновить из файла, указываем именно ту обработку к которой указывали путь в модуле!

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

Не обессудьте, хорошего всем дня и главное не болеть! 

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. nomad_irk 52 23.03.20 16:14 Сейчас в теме
(0) Т.е. добавить форму в обработке с полем выбора нужного вида объекта и кнопкой, выполняющим формирование печатной формы, не получилось?
Sedaiko; Бэнни; +2 Ответить
2. VID1234 68 23.03.20 16:15 Сейчас в теме
3. VmvLer 23.03.20 16:37 Сейчас в теме
очередной костыль и по коду ясно, что только в толстом клиенте, почему только в толстом - мне лень его запускать, да и забыл когда использовал.

РежимОтладки и увеличенный пулл портов отладки, иногда F11 - решают задачу отладки на 100%.

Если есть желание извращаться с внешним файлом
- в любом клиенте современной БСП
- с внешними отчетами с комами и прочей щняжкой
-...
, то я прикрутил в расширение код попроще

просто бросаем этот код в расширяемый модуль(указано в комментах),
никаких полей и шамантва больше не нужно

и доп.отчет (обработку) можно отладить из файла, указав имя файла в поле
"комментарий" этой обработки. Первый вариант можно записать как болванку.


#Область Расш1_ОтладкаВнешнихОбъектовБСП_ОбщийМодуль_ДополнительныеОтчетыИОбработки

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

&Вместо("ПриПолученииРегистрационныхДанных")
Процедура Расш1ПриПолученииРегистрационныхДанных(Объект, РегистрационныеДанные, ПараметрыРегистрации, РезультатРегистрации)
	
	ПродолжитьВызов(Объект, РегистрационныеДанные, ПараметрыРегистрации, РезультатРегистрации);
	
	// Расширяем метод основной конфигурации если у внешнего объекта включен режим отладки и указано имя файла объекта отладки в поле "Комментарий".
	ОбъектОтладкиФайлПолноеИмя = Расш1ПолучитьПолноеИмяФайлаВнешнегоОбъектаОтладки(Объект.Ссылка);
	Если НЕ ПустаяСтрока(ОбъектОтладкиФайлПолноеИмя) Тогда
		
		ВнешнийОбъект = ПолучитьВнешнийОбъектОтладки(Объект.Ссылка, ОбъектОтладкиФайлПолноеИмя);  // Получаем внешний объект отладки по имени файла
		ВнешнийОбъектМетаданные = ВнешнийОбъект.Метаданные();
		
		СведенияОВнешнейОбработке = ВнешнийОбъект.СведенияОВнешнейОбработке();
		ОбщегоНазначенияКлиентСервер.ДополнитьСтруктуру(РегистрационныеДанные, СведенияОВнешнейОбработке, Истина);
		
		// ≪✔▼ СКОПИРОВАННЫЙ БЛОК КОДА из окончания метода основной конфигурации ▼≫
		Если РегистрационныеДанные.Наименование = Неопределено ИЛИ РегистрационныеДанные.Информация = Неопределено Тогда
			Если РегистрационныеДанные.Наименование = Неопределено Тогда
				РегистрационныеДанные.Наименование = ВнешнийОбъектМетаданные.Представление();
			КонецЕсли;
			Если РегистрационныеДанные.Информация = Неопределено Тогда
				РегистрационныеДанные.Информация = ВнешнийОбъектМетаданные.Комментарий;
			КонецЕсли;
		КонецЕсли;
		
		Если ТипЗнч(РегистрационныеДанные.Вид) <> Тип("ПеречислениеСсылка.ВидыДополнительныхОтчетовИОбработок") Тогда
			РегистрационныеДанные.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок[РегистрационныеДанные.Вид];
		КонецЕсли;
		
		РегистрационныеДанные.Вставить("ХранилищеВариантов");
		Если РегистрационныеДанные.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет
			Или РегистрационныеДанные.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет Тогда
			Если ВнешнийОбъектМетаданные.ХранилищеВариантов <> Неопределено Тогда
				РегистрационныеДанные.ХранилищеВариантов = ВнешнийОбъектМетаданные.ХранилищеВариантов.Имя;
			КонецЕсли;
		КонецЕсли;
		
		РегистрационныеДанные.Команды.Колонки.Добавить("ВариантЗапуска");
		
		Для Каждого КомандаОписание Из РегистрационныеДанные.Команды Цикл
			КомандаОписание.ВариантЗапуска = Перечисления.СпособыВызоваДополнительныхОбработок[КомандаОписание.Использование];
		КонецЦикла;
		
		#Если ТолстыйКлиентОбычноеПриложение Тогда
			РезультатРегистрации.ИмяОбъекта = ВнешнийОбъектМетаданные.Имя;
		#КонецЕсли
		// ≪✔▲ СКОПИРОВАННЫЙ БЛОК КОДА из окончания метода основной конфигурации ▲≫
		
	КонецЕсли;
	
КонецПроцедуры

Функция Расш1ПолучитьПолноеИмяФайлаВнешнегоОбъектаОтладки(Ссылка)

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

	Возврат  ОбъектОтладкиФайлПолноеИмя;
	
КонецФункции 

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

#КонецОбласти
Показать



Насчет код попроще я погарячился, главное когда мне надо отладить внешний отчет/ обработку я просто пишу имя файла(доступное на сервере, например \\....) в комментарий элемента справочника внешних отчетов и в этом же элементе жму кнопку Отладка - всё.
По завершении отладки стираю путь, отжимаю кнопку и заливаю новую версию в элемент.

Этот код я тут кидал ранее и то, что автор пришел к той же методике не удивительно - другие пути более сложны.
Правда, мне лень разбираться почему почему у автора толстый клиент и много воды.
Dimasik2007; +1 Ответить
6. VID1234 68 23.03.20 17:15 Сейчас в теме
4. nomad_irk 52 23.03.20 17:00 Сейчас в теме
Просто оставлю это здесь.......
Прикрепленные файлы:
ВПФ_БолванкаСВозможностьюОтладки.epf
jobkostya1c8; Sedaiko; work.sable; adeich; Il; wowik; +6 Ответить
5. VID1234 68 23.03.20 17:15 Сейчас в теме
7. davdykin 25 23.03.20 17:25 Сейчас в теме
я дела практически такое же расширение, но я перехватил добавление файла печатной формы во внешние доработки, и сохранял его путь в коментарий, а потом создавал обработку из этого пути, таким образом не меняя расширение можно отлаживать любое количество печатных форм.
8. VID1234 68 23.03.20 17:29 Сейчас в теме
9. v_id 101 23.03.20 20:27 Сейчас в теме
10. VID1234 68 24.03.20 14:09 Сейчас в теме
(9) Спасибо. Я только встретил такую фишку, попробую.
11. leosoft 149 24.03.20 14:23 Сейчас в теме
12. v_id 101 24.03.20 15:20 Сейчас в теме
13. leosoft 149 24.03.20 15:42 Сейчас в теме
(12) Понятно, про эти инструменты я знаю, спасибо.
Оставьте свое сообщение

См. также

Макеты печатных форм в руках пользователей (обычные формы)

Практика программирования Универсальные печатные формы v8 Россия Бесплатно (free)

Как частично избавить себя от низкопрофильного труда по правке печатных форм. Для конфигураций на основе БСП, конечно, не актуально, но для нетиповых вполне. Ну и как в помощь начинающим. У меня реализовано для печати различных "согласие на обработку персональных данных","согласие на медицинские вмешательства", различных анкет. Удобно для печатных форм, которые часто по тем или иным причинам меняются. Чтоб не дергать программиста, пусть пользователи рисуют макеты самостоятельно.

01.11.2018    7992    fromlion    3    

Подход к организации печати одного макета документа из обычной и управляемой форм документа (интерфейс Такси)

Универсальные печатные формы Печатные формы документов Математика и алгоритмы v8 1cv8.cf Бесплатно (free)

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

10.10.2013    39887    RailMen    9