Экспресс-отладка дополнительных отчетов и обработок
Еще никогда отладка дополнительных обработок не была такой простой.
- Описание
- Подробнее
Описание

Бочка меда
После публикации пришлось самому испытать свои доработки и стало понятно как сделать жизнь еще легче (например, чтобы для отладки в новых базах не приходилось каждый раз создавать доп реквизит и не указывать путь к доп обработке вручную). Теперь для отладки после подключения расширения нужно всего:
1) загрузить нужную обработку для отладки из каталога, который доступен пользователю сервера 1С;
2) установить Режим отладки в доп обработке.
Чтобы отладка заработала в вашей конфигурации:
1. Добавьте в расширение общий модуль ИнтеграцияПодсистемБСП
&Перед("ПриСозданииВнешнейОбработки")
Процедура _ПриСозданииВнешнейОбработки(Знач Ссылка, СтандартнаяОбработка, Результат)
_СоздатьВнешнююОбработку(Ссылка, СтандартнаяОбработка, Результат, Ложь)
КонецПроцедуры
&Перед("ПриПодключенииВнешнейОбработки")
Процедура _ПриПодключенииВнешнейОбработки(Знач Ссылка, СтандартнаяОбработка, Результат)
_СоздатьВнешнююОбработку(Ссылка, СтандартнаяОбработка, Результат);
КонецПроцедуры
Процедура _СоздатьВнешнююОбработку(Знач Ссылка, СтандартнаяОбработка, Результат, ТолькоИмя = Истина)
РеквизитыОбработки = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "Публикация, Вид");
Если РеквизитыОбработки.Публикация =
Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.РежимОтладки Тогда
ПутьКФайлу = "";
ЗначенияСвойств = УправлениеСвойствами.ЗначенияСвойств(Ссылка, Истина,,
ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(
ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "_ПутьКФайлуВнешнейОбработки")));
Если ЗначениеЗаполнено(ЗначенияСвойств) Тогда
Файл = Новый Файл(ЗначенияСвойств[0].Значение);
Если Файл.Существует() Тогда
ПутьКФайлу = Файл.ПолноеИмя;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ПутьКФайлу) Тогда
СтандартнаяОбработка = Ложь;
// Получение экземпляра объекта.
Если РеквизитыОбработки.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет
ИЛИ РеквизитыОбработки.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда
Менеджер = ВнешниеОтчеты;
Иначе
Менеджер = ВнешниеОбработки;
КонецЕсли;
Обработка = Менеджер.Создать(ПутьКФайлу, Ложь, ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений());
ИспользуемоеИмяФайла = СтрЗаменить(Обработка.ИспользуемоеИмяФайла,"\","/");
Если ЭтоАдресВременногоХранилища(ИспользуемоеИмяФайла) Тогда
УдалитьИзВременногоХранилища(ИспользуемоеИмяФайла);
Обработка = Менеджер.Создать(ПутьКФайлу, Ложь, ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений());
КонецЕсли;
Если ТолькоИмя Тогда
Результат = Обработка.Метаданные().Имя;
Иначе
Результат = Обработка;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
2. чтобы не мучить себя добавлением в каждой новой базе необходимого доп реквизита
Процедура СоздатьПутьКФайлу() Экспорт
Если ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.
НайтиПоРеквизиту("Имя", "_ПутьКФайлуВнешнейОбработки").Пустая() Тогда
Попытка
_ПутьКФайлу = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.СоздатьЭлемент();
_ПутьКФайлу.Наименование = "Путь к файлу внешней обработки";
_ПутьКФайлу.ТипЗначения = Новый ОписаниеТипов("Строка");
_ПутьКФайлу.Виден = Истина;
_ПутьКФайлу.Доступен = Истина;
_ПутьКФайлу.Заголовок = "Путь к файлу внешней обработки";
_ПутьКФайлу.ЗаголовокЯзык1 = _ПутьКФайлу.Заголовок;
_ПутьКФайлу.ЗаголовокЯзык2 = _ПутьКФайлу.Заголовок;
_ПутьКФайлу.Имя = "_ПутьКФайлуВнешнейОбработки";
_ПутьКФайлу.ИдентификаторДляФормул = _ПутьКФайлу.Имя;
_ПутьКФайлу.НаборСвойств = Справочники.НаборыДополнительныхРеквизитовИСведений.НайтиПоНаименованию("Дополнительные отчеты и обработки");
_ПутьКФайлу.ВидСвойств = Перечисления.ВидыСвойств.ДополнительныеРеквизиты;
СтрокаН = _ПутьКФайлу.ЗависимостиДополнительныхРеквизитов.Добавить();
СтрокаН.ЗависимоеСвойство = "Виден";
СтрокаН.НаборСвойств = _ПутьКФайлу.НаборСвойств;
СтрокаН.Реквизит = "Публикация";
СтрокаН.Условие = "Равно";
СтрокаН.Значение = Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.РежимОтладки;
_ПутьКФайлу.Записать();
НаборСвойств = _ПутьКФайлу.НаборСвойств.ПолучитьОбъект();
СтрокаН = НаборСвойств.ДополнительныеРеквизиты.Добавить();
СтрокаН.Свойство = _ПутьКФайлу.Ссылка;
СтрокаН.ИмяПредопределенногоНабора = "Справочник_ДополнительныеОтчетыИОбработки";
НаборСвойств.Записать();
Исключение
ОбщегоНазначения.СообщитьПользователю(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Ложка дёгтя
Заметил, что если в рамках одного сеанса будет подключена внешняя обработка типовыми механизмами БСП, то при пересоздании обработки из файла с таким же именем будет использоваться первоначально подключенная. При отладке это нужно учитывать.
Экспресс-отладка дополнительных отчетов и обработок
Расширение: 1) помогает быстро отладить дополнительные отчеты и обработки, указав только путь к файлу; 2) не изменяет структуру метаданных конфигурации; 3) содержит минимум доработок типовых конфигураций.
- Описание
- Подробнее
Описание
На Инфостарте уже есть подобные публикации. Данное решение сделано с минимумом изменений типовых конфигураций. Все изменения приведены для ERP 2.5.17.155 и УТ 11.5.17.155. Для использования отладки в дополнительных отчетах и обработках нужно подменить файл, хранящийся в справочнике, на указанный нами файл. Попробуем сделать это максимально просто.
1. Изменяем ОбщийМодуль.ДополнительныеОтчетыИОбработки
&ИзменениеИКонтроль("ПодключитьВнешнююОбработку")
Функция _ПодключитьВнешнююОбработку(Ссылка)
//...
ПараметрыЗапуска = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "БезопасныйРежим, ХранилищеОбработки");
#Вставка //++
_РежимОтладки = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Публикация") =
Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.РежимОтладки;
_ПутьКФайлу = "";
Если _РежимОтладки Тогда
ЗначенияСвойств = УправлениеСвойствами.ЗначенияСвойств(Ссылка, Истина,,
ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(
ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоРеквизиту("Имя", "_ПутьКФайлуВнешнейОбработки")));
Если ЗначениеЗаполнено(ЗначенияСвойств) Тогда
Файл = Новый Файл(ЗначенияСвойств[0].Значение);
Если Файл.Существует() Тогда
_ПутьКФайлу = Файл.ПолноеИмя;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(_ПутьКФайлу) Тогда
АдресВоВременномХранилище = _ПутьКФайлу;
Иначе
#КонецВставки //--
АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ПараметрыЗапуска.ХранилищеОбработки.Получить());
#Вставка //++
КонецЕсли;
#КонецВставки //--
//...
#Вставка //++
Если ЭтоАдресВременногоХранилища(АдресВоВременномХранилище) Тогда
#КонецВставки //--
ИмяОбработки = Менеджер.Подключить(АдресВоВременномХранилище, , Истина,
ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений());
ВнешнийОбъект = Менеджер.Создать(ИмяОбработки);
СведенияОВнешнейОбработке = ВнешнийОбъект.СведенияОВнешнейОбработке();
Если (Не СведенияОВнешнейОбработке.БезопасныйРежим Или ЕстьРазрешения)
И Не БезопасныйРежим Тогда
// Повторное подключение в небезопасном режиме, если разрешено.
ИмяОбработки = Менеджер.Подключить(АдресВоВременномХранилище, , БезопасныйРежим,
ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений());
КонецЕсли;
#Вставка //++
Иначе
ИмяОбработки = Новый Структура("Имя, БезопасныйРежим, ЗащитаОтОпасныхДействий", АдресВоВременномХранилище, БезопасныйРежим);
КонецЕсли;
#КонецВставки //--
//...
КонецФункции
&ИзменениеИКонтроль("ОбъектВнешнейОбработки")
Функция _ОбъектВнешнейОбработки(Ссылка)
//...
#Вставка //++
Если ТипЗнч(ИмяОбработки) = Тип("Структура") Тогда
Возврат Менеджер.Создать(ИмяОбработки.Имя, ИмяОбработки.БезопасныйРежим, ?(ИмяОбработки.Свойство("ЗащитаОтОпасныхДействий"), ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений(), Неопределено));
КонецЕсли;
#КонецВставки //--
Возврат Менеджер.Создать(ИмяОбработки);
КонецФункции
2. Изменяем ОбщийМодуль.ДополнительныеОтчетыИОбработкиВызовСервера
&ИзменениеИКонтроль("ПодключитьВнешнююОбработку")
Функция _ПодключитьВнешнююОбработку(Ссылка)
#Удаление //++
Возврат ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(Ссылка);
#КонецУдаления //--
#Вставка //++
Результат = ДополнительныеОтчетыИОбработки.ПодключитьВнешнююОбработку(Ссылка);
Если ТипЗнч(Результат) = Тип("Структура") Тогда
// Получение экземпляра объекта.
Вид = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, "Вид");
Если Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.Отчет
ИЛИ Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет Тогда
Менеджер = ВнешниеОтчеты;
Иначе
Менеджер = ВнешниеОбработки;
КонецЕсли;
Обработка = Менеджер.Создать(Результат.Имя, Результат.БезопасныйРежим, ?(Результат.Свойство("ЗащитаОтОпасныхДействий"), ОбщегоНазначения.ОписаниеЗащитыБезПредупреждений(), Неопределено));
Результат = Обработка.Метаданные().Имя;
КонецЕсли;
Возврат Результат
#КонецВставки //--
КонецФункции
3. Устанавливаем вид публикации Режим отладки и указываем путь к файлу

В прикрепленных файлах расширений в общих макетах содержится подробная инструкция для настройки отладки.
Другие публикации:

