Имя: Пароль:
1C
 
Влияет ли режим отладки внешней ПФ на передачу параметров?
0 НоваяВолна
 
11.03.25
12:14
Есть самописная обработка ГрупповаяПечать, которая заполняется Заказами Клиента, по кнопке формирует Реализации и Счета-Фактуры, а по кнопке Печать выводит на принтер весь комплект документов на тех печатных формах, которые нужны контрагенту.

  Мне надо добавить групповую печать "новому"контрагенту (Магнит в данном случае). Список печатных форм другой, как и макеты ПФ.
  Поэтому создал внешнюю ПФ Товарно-транспортной накладной, сначала привязав её к Реализации (для проверки, что работает, она РАБОТАЕТ), а потом отвязал от объекта.

   Проблема: Мне нужно отлаживать одновременно и внешнюю ПФ и обработку ГрупповойПечати. Поэтому во внешнюю ПФ ставлю код отладки:
+
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	  
	  ВО = ВнешниеОбработки.Создать("D:\ГрупповаяПечатьДляМагнита\ПечатьТТН_Магнит.epf", Ложь);
	  ВО.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
	  Возврат;
	  
	  ПараметрыПечати = Новый Структура;
	  
	  Макет = ЭтотОбъект.ПолучитьМакет("ПФ_MXL_ТТН");
	  

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


Начинаю отлаживать и ... не получаю  ТабличныйДокумент именно для этой ПФ, для других внешних ПФ всё работает.
1 Ёпрст
 
11.03.25
12:20
(0) кто где зачем? - хз
Но вот это - полный пэ: ""D:\ГрупповаяПечатьДляМагнита\П"
2 НоваяВолна
 
11.03.25
12:30
(1) Хочешь сказать, что путь обрезать до D:\Test\ПечатьТТН_Магнит.epf и поможет? Сомневаюсь. Сама ПФ по этому пути норм отлаживается
3 Gucci76
 
11.03.25
12:38
В момент отладки этот код должен быть закомментирован
ВО = ВнешниеОбработки.Создать("D:\ГрупповаяПечатьДляМагнита\ПечатьТТН_Магнит.epf", Ложь);
      ВО.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
      Возврат;
4 Ёпрст
 
11.03.25
12:40
(2) ё...само использование абсолютных путей в коде - полный пэ.
5 Gucci76
 
11.03.25
12:44
(4) Так это для отладки. Оно временно.
6 Мультук
 
гуру
11.03.25
12:49
(0)

1) Это на сервере путь ?
"D:\ГрупповаяПечатьДляМагнита\ПечатьТТН_Магнит.epf
Сервер (юзер от которго работает сервис 1С), хоть видит его ?

2) Наверное,

ВО.Печать(...) 


делает совсем не то же самое, что

 

Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ПечатьТТН_Магнит") Тогда
	      УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "ПечатьТТН_Магнит", "Товарно-транспортная накладная",
	      СформироватьПечатнуюФормуТТН(МассивОбъектов, ОбъектыПечати, ПараметрыПечати), , Макет);
	  КонецЕсли;
7 mikecool
 
11.03.25
12:50
а сервер этот путь видит?
8 НоваяВолна
 
11.03.25
12:59
(7) сервер видит
9 DrZombi
 
гуру
11.03.25
13:03
(0) У вас БСП?

То тогда все просто. И не очень.
Код для БП 3.0.167...

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

2. В общий модуль "ДополнительныеОтчетыИОбработки" в расширении
      
    
ПодключитьВнешнююОбработку(Ссылка)

&Вместо("ПодключитьВнешнююОбработку")
Функция СОГ_ПодключитьВнешнююОбработку(Ссылка) Экспорт
    
    //Периодически смотреть, что бы 1С чего не поменяли :)
    
    СтандартнаяОбработка = Истина;
    Результат = Неопределено;
    
    ИнтеграцияПодсистемБСП.ПриПодключенииВнешнейОбработки(Ссылка, СтандартнаяОбработка, Результат);
    Если Не СтандартнаяОбработка Тогда
        Возврат Результат;
    КонецЕсли;
        
    // Проверка корректности переданных параметров.
    Если ТипЗнч(Ссылка) <> Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки")
        Или Ссылка = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка() Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    // Подключение
#Если ТолстыйКлиентОбычноеПриложение Тогда
    ИмяОбработки = ПолучитьИмяВременногоФайла();
    ХранилищеОбработки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "ХранилищеОбработки");
    ДвоичныеДанные = ХранилищеОбработки.Получить();
    ДвоичныеДанные.Записать(ИмяОбработки);
    Возврат ИмяОбработки;
#КонецЕсли
    
    Вид = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Вид");
    Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет
        Или Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда
        Менеджер = ВнешниеОтчеты;
    Иначе
        Менеджер = ВнешниеОбработки;
    КонецЕсли;
    
    //+
    Попытка
    Если ТипЗнч(Ссылка) = Тип("СправочникСсылка.ДополнительныеОтчетыИОбработки") Тогда
        ПараметрыЗапуска = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "БезопасныйРежим, ХранилищеОбработки, СОГ_ПолныйПутьДляОтладки, СОГ_ИспользоватьОтладку");
        
        Если ПараметрыЗапуска.СОГ_ИспользоватьОтладку = Истина и НЕ ПустаяСтрока(ПараметрыЗапуска.СОГ_ПолныйПутьДляОтладки) Тогда
            АдресВоВременномХранилище = СокрЛП(ПараметрыЗапуска.СОГ_ПолныйПутьДляОтладки); //Указывать сетевой путь, т.к. обработка запускается с Сервера...
            пФайл = Новый Файл(АдресВоВременномХранилище);
            Если НЕ (пФайл.Существует() и пФайл.ЭтоФайл()) Тогда
                //Нет файла, либо не доступен...
                АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ПараметрыЗапуска.ХранилищеОбработки.Получить());
            КонецЕсли;
            
        Иначе
            АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ПараметрыЗапуска.ХранилищеОбработки.Получить());
        КонецЕсли;
        
    Иначе
    //-
    
    ПараметрыЗапуска = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "БезопасныйРежим, ХранилищеОбработки");
    АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ПараметрыЗапуска.ХранилищеОбработки.Получить());
    
    //+    
    КонецЕсли;
    Исключение
    //Добавлено в исключение, чтобы восстановить работоспособность...    
    ПараметрыЗапуска = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "БезопасныйРежим, ХранилищеОбработки");
    АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ПараметрыЗапуска.ХранилищеОбработки.Получить());
    КонецПопытки;
    //-
    
    Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ПрофилиБезопасности") Тогда
        МодульРаботаВБезопасномРежиме = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежиме");
        ИспользуютсяПрофилиБезопасности = МодульРаботаВБезопасномРежиме.ИспользуютсяПрофилиБезопасности();
    Иначе
        ИспользуютсяПрофилиБезопасности = Ложь;
    КонецЕсли;
    
    ЕстьРазрешения = Ложь;
    Если ИспользуютсяПрофилиБезопасности Тогда
        
        МодульРаботаВБезопасномРежимеСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаВБезопасномРежимеСлужебный");
        БезопасныйРежим = МодульРаботаВБезопасномРежимеСлужебный.РежимПодключенияВнешнегоМодуля(Ссылка);
        
        Если БезопасныйРежим = Неопределено Тогда
            БезопасныйРежим = Истина;
        КонецЕсли;
        
    Иначе
        
        БезопасныйРежим = ПолучитьФункциональнуюОпцию("СтандартныеПодсистемыВМоделиСервиса") Или ПараметрыЗапуска.БезопасныйРежим;
        
        Если БезопасныйРежим Тогда
            РежимСовместимости = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "РежимСовместимостиРазрешений");
            
            ЗапросРазрешений = Новый Запрос(
                "ВЫБРАТЬ ПЕРВЫЕ 1
                |    ДополнительныеОтчетыИОбработкиРазрешения.НомерСтроки,
                |    ДополнительныеОтчетыИОбработкиРазрешения.ВидРазрешения
                |ИЗ
                |    Справочник.ДополнительныеОтчетыИОбработки.Разрешения КАК ДополнительныеОтчетыИОбработкиРазрешения
                |ГДЕ
                |    ДополнительныеОтчетыИОбработкиРазрешения.Ссылка = &Ссылка");
            ЗапросРазрешений.УстановитьПараметр("Ссылка", Ссылка);
            ЕстьРазрешения = Не ЗапросРазрешений.Выполнить().Пустой()
                И РежимСовместимости = Перечисления.РежимыСовместимостиРазрешенийДополнительныхОтчетовИОбработок.Версия_2_2_2;
            
            Если ЕстьРазрешения Тогда
                БезопасныйРежим = Ложь;
            КонецЕсли;
        КонецЕсли;
        
    КонецЕсли;
    
    ЗаписатьПримечание(Ссылка,
        СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Подключение, %1 = ""%2"".'"), "БезопасныйРежим", БезопасныйРежим));
    
    //+
    Если Не ПустаяСтрока(АдресВоВременномХранилище) и Не ЭтоАдресВременногоХранилища(АдресВоВременномХранилище) Тогда
        ИмяОбработки = Менеджер.Создать(АдресВоВременномХранилище,Ложь);
        ИмяОбработки = ИмяОбработки.Метаданные().Имя;
    Иначе    
    //-
        
    ИмяОбработки = Менеджер.Подключить(АдресВоВременномХранилище, , БезопасныйРежим,
        ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений());
        
    КонецЕсли;
    //-
    
    //+
    //        Стер часть кода, т.к. вызывала ошибку работы ... и переполнения памяти!!!
    
    Возврат ИмяОбработки;
    
КонецФункции

10 Gucci76
 
11.03.25
13:13
(9) В (0) намного проще (если отлаживать на сервере)
11 DrZombi
 
гуру
11.03.25
13:19
(10) У меня на долго и намного интересней, если засматриваться на скрытые возможности БСП :)
12 Gucci76
 
11.03.25
13:21
(0) Кеш может надо почистить. (раз другие ВПФ отлаживаются, а одна не хочет, то может зависло в кеше)
13 Gucci76
 
11.03.25
14:51
(11) Не спорю. Но в части простоты в (0) просто изумительно )))
14 НоваяВолна
 
11.03.25
17:38
(4)
ВО = ВнешниеОбработки.Создать("D:\ГрупповаяПечатьДляМагнита\ПечатьТТН_Магнит.epf", Ложь);
	  ВО.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
	  Возврат;


Этот код - отладочный! Во время выполнения внешней обработки формируется временный файл, поэтому поймать и отладить его невозможно. Тут идет создание внешней обработки по конкретному пути, дальше вызывается процедура Печать из файла в базе и командой   Возврат; запускается код файла по указанному пути
(открытого в конфигураторе).

  В таком виде обработку надо загрузить в базу, а перед выполнением (чтобы Цикл убрать) код в конфигураторе комментируется. Получается вот так:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	  
	//  ВО = ВнешниеОбработки.Создать("D:\ГрупповаяПечатьДляМагнита\ПечатьТТН_Магнит.epf", Ложь);
	//  ВО.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
	//  Возврат;
	  
	  ПараметрыПечати = Новый Структура;
	  
	  Макет = ЭтотОбъект.ПолучитьМакет("ПФ_MXL_ТТН");
	  

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


Ставится точка останова в любом месте и вперед... Прыгай по точкам
15 Gucci76
 
11.03.25
17:26
(0) А что означает в названии темы "режим отладки" ?
Это параметр запуска 1С? Или просто факт отладки обработки?
16 НоваяВолна
 
11.03.25
17:36
(15) факт отладки обработок (двух)
17 Gucci76
 
11.03.25
18:11
(16) Просто есть такой режим запуска. В ЗУП он отменяет выполнение в фоне (как в других не знаю)
Для отладки очень удобно