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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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

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

Обращу ваше внимание на тему статьи - "Отладка дополнительных обработок БСП", а не просто внешних обработок. О профите от помещения в внешние обработки речи не идет. Если изначально делаем назначаемую\глобальную обработку для БСП - так будет проще отлаживать, чем через файл\открыть.
3. Алексей Ермилов (Alex_E) 1641 07.01.17 13:17 Сейчас в теме
Всё, что можно запустить через Файл - Открыть отлаживается тупо и без выкрутасов.....
red80; user599011_nusmancrb; +2 Ответить
6. Olga Kazakevich (ok521) 21 12.01.17 17:33 Сейчас в теме
Метод хороший, для отладки внешних печатных форм - то, что нужно. Позволяет цеплять обработку к нужному объекту без всяких дополнительных ухищрений. Подходит и для серверного метода, и для клиентского.
7. Александр Попков (pas) 46 16.01.17 13:44 Сейчас в теме
Если в подключаемой обработке есть форма с командными кнопками, то отладчик не заходит в процедуры формы. Видимо, ваш код необходимо выполнять до захода в форму.
8. Роман Уничкин (unichkin) 766 18.01.17 15:57 Сейчас в теме
(7) надо понимать, откуда форма открывается. Тут ведь происходит точечная отладка - т.е. конкретный метод выполняем через внешнюю обработку. Ну переопределите открытие формы - в ПриОткрытии подключайте внешнюю обработку, открывайте ее форму, от исходной отказывайтесь. Все аналогично.
9. Сергей Старых (tormozit) 4569 05.10.17 09:04 Сейчас в теме
В инструментах разработчика в вариантах Расширение и Подсистема есть инструмент "Отладка внешних обработок БСП". Он позволяет отлаживать внешние отчеты и обработки из справочника БСП в натуральном виде в заданном каталоге с минимумом манимпуляций.
Прикрепленные файлы:
unichkin; +1 Ответить
10. Сергей Старых (tormozit) 4569 14.11.17 16:20 Сейчас в теме
(9) Обнаружил, что в БСП 2.4 изменился внутренний механизм работы с внутренними событиями. На нем я не нашел как заставить работать инструмент "Отладка внешних обработок БСП" из ИР (перенаправлять создание внешних обработок в файлы).
11. binx (binx) 08.12.17 10:02 Сейчас в теме
я обычно создаю форму, создаю на ней реквизиты и поля для требуемых параметров. Отлаживаю потом переписываю на работу как доп. обработки.
немного это времени занимает.
12. Роман Уничкин (unichkin) 766 08.12.17 15:31 Сейчас в теме
(11)
немного это времени занимает

- много. И оно не надо. При таком подходе вы лишены контекста разработки, отладка идет от эмуляции окружения.
13. binx (binx) 08.12.17 18:51 Сейчас в теме
контекста разработки я себя не лишаю, и время набить несколько параметров не проблема.
я не против вашего метода. Я делюсь своим.
14. Роман Уничкин (unichkin) 766 08.12.17 22:21 Сейчас в теме
(13) я понимаю) Но я против вашего, и делюсь этим) Поскольку сам проходил этот этап - и могу сказать, что это "идеальный газ". Отладка по контексту помогает выявить большое количество ошибок, о которых вы и не узнаете если будете все параметры эмулировать через отладочную форму. Конечно, все еще от конфы зависит, от ситуации. Но лично у меня скорость\качество разработки улучшились.
15. binx (binx) 09.12.17 10:59 Сейчас в теме
вопрос, ваш метод будет работать в клиент-серверном варианте?
17. Роман Уничкин (unichkin) 766 09.12.17 14:03 Сейчас в теме
16. binx (binx) 09.12.17 11:00 Сейчас в теме
И о каком контексте вы все время говорите кроме передаваемых в обработку параметров?
18. Роман Уничкин (unichkin) 766 09.12.17 14:07 Сейчас в теме
(16) Я имею в виду что запуск обработки \ отчета происходит по пользовательскому событию. Вы будете открывать обработку в режиме предприятия, забивать параметры, нажимать на кнопку. Я буду открывать документ, вызывать команду из его формы - все также, как делает пользователь. При этом мне не понадобится перезапускать 1С, или переоткрывать инициализирующую форму - у меня есть одна команда, например для заполнения табличной части. Я вызываю ее, при этом всю разработку веду в внешней обработке.
19. binx (binx) 09.12.17 17:48 Сейчас в теме
в клиент серверном варианте кто должна лежать обработка?
20. Роман Уничкин (unichkin) 766 09.12.17 20:35 Сейчас в теме
В каталоге, доступном пользователю 1С. На локальной машине с этим проблем обычно не возникает, если разнесены - сделайте шару.
21. Иван Карло (johnnyshut23) 09.12.17 22:30 Сейчас в теме
Оставьте свое сообщение