Отладка дополнительных обработок БСП

Опубликовал Роман Уничкин (unichkin) в раздел Программирование - Практика программирования

Описан подход к отладке подключаемых дополнительных обработок. Протестировано в БСП 2.3.4.71 для вида "ДополнительнаяОбработка" с режимом использования "ВызовСерверногоМетода", но есть уверенность, что будет работать везде.

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

 Если работаете на серверной базе:

  • должна быть включена отладка сервера
  • кроме этого добавляем в предмет отладки фоновые задания (Конфигуратор => Отладка\Подключение\Автоматическое подключение\ поставить флаг "Фоновые задания")
  • а еще лучше так не делать, а воспользоваться параметром запуска "РежимОтладки" (Конфигуратор => Сервис\ Запуск 1С предприятия \ Основные \ ПараметрЗапуска, см. документацию к БСП Приложение 3. Доступные параметры запуска приложения) - тогда вызов доп. обработки не будет выполняться в фоне, что для отладки проще и лучше.

Ниже приведен модуль внешней обработки с методом "ВыполнитьПроведениеДокументов":


#Область ПрограммныйИнтерфейс

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

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

	Если ИдентификаторКоманды = "ВыполнитьПроведениеДокументов" Тогда
		ВыполнитьПроведениеДокументов(ПараметрыВыполнения);		
	КонецЕсли; 
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ВыполнитьПроведениеДокументов(ПараметрыВыполнения)

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

#КонецОбласти 

Пусть сама обработка располагается например по адресу "D:\ПроведениеДокументов.epf". Модифицируем экспортный метод, который нужно отладить - здесь это "ВыполнитьКоманду":

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт

    Адрес = "D:\ПроведениеДокументов.epf";
    обр = ВнешниеОбработки.Создать(Адрес, БезопасныйРежим());
    обр.ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения);    

    //Если ИдентификаторКоманды = "ВыполнитьПроведениеДокументов" Тогда
    //    ВыполнитьПроведениеДокументов(ПараметрыВыполнения);        
    //КонецЕсли; 
    
КонецПроцедуры

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

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения) Экспорт

    //Адрес = "D:\ПроведениеДокументов.epf";
    //обр = ВнешниеОбработки.Создать(Адрес, БезопасныйРежим());
    //обр.ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыВыполнения);    

    Если ИдентификаторКоманды = "ВыполнитьПроведениеДокументов" Тогда
        ВыполнитьПроведениеДокументов(ПараметрыВыполнения);        
    КонецЕсли; 
    
КонецПроцедуры

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

См. также

Комментарии
1. Призрак (davdykin) 16 04.01.17 20:57 Сейчас в теме
Спасибо, познавательно.
2. Капитан Немо (capitan) 550 07.01.17 12:41 Сейчас в теме
Посмотрел статью, подумал - зачем так сложно? :)
Если ваша обработка может просто стартовать с диска D:\ПроведениеДокументов.epf
так и стартуйте ее с диска и отлаживайте
В чем профит запихивания во внешние обработки ?

А проблема отладки внешних обработок в том, что они свои настройки хранят в базе.
Ее вы этим финтом не решаете
3. Алексей Ермилов (Alex_E) 1527 07.01.17 13:17 Сейчас в теме
Всё, что можно запустить через Файл - Открыть отлаживается тупо и без выкрутасов.....
4. Роман Уничкин (unichkin) 396 07.01.17 23:06 Сейчас в теме
(2) (3)
Есть такая малость... Те параметры, которые передает этой самой обработке источник)) Через файл\открыть вы их не получите, разве что сами где-нибудь забьете. Кроме этого сама отладка ведется именно по контексту - открыл объект которому назначена обработка и выполняю команду... И сразу торможусь в конфигураторе на точке останова.И вижу весь отладочный контекст. Захотел - для одного объекта команду выполнил, захотел - для другого. ничего не перевыбирая, ничего не переписывая, а сразу. Больше возможностей для проверки.
5. Роман Уничкин (unichkin) 396 07.01.17 23:07 Сейчас в теме
(2)
В чем профит запихивания во внешние обработки ?

Обращу ваше внимание на тему статьи - "Отладка дополнительных обработок БСП", а не просто внешних обработок. О профите от помещения в внешние обработки речи не идет. Если изначально делаем назначаемую\глобальную обработку для БСП - так будет проще отлаживать, чем через файл\открыть.
6. Olga Kazakevich (ok521) 18 12.01.17 17:33 Сейчас в теме
Метод хороший, для отладки внешних печатных форм - то, что нужно. Позволяет цеплять обработку к нужному объекту без всяких дополнительных ухищрений. Подходит и для серверного метода, и для клиентского.
7. Александр Попков (pas) 46 16.01.17 13:44 Сейчас в теме
Если в подключаемой обработке есть форма с командными кнопками, то отладчик не заходит в процедуры формы. Видимо, ваш код необходимо выполнять до захода в форму.
8. Роман Уничкин (unichkin) 396 18.01.17 15:57 Сейчас в теме
(7) надо понимать, откуда форма открывается. Тут ведь происходит точечная отладка - т.е. конкретный метод выполняем через внешнюю обработку. Ну переопределите открытие формы - в ПриОткрытии подключайте внешнюю обработку, открывайте ее форму, от исходной отказывайтесь. Все аналогично.
Оставьте свое сообщение