Постановка задачи
Предположим, что мы дорабатываем базу с очень тяжелой конфигурацией. Сохранение и/или перезапуск после сохранения выполняются продолжительное время.
Пусть есть модуль менеджера некоторого объекта в нашей конфигурации. В этом модуле менеджера есть экспортный метод, из которого вызываются остальные процедуры.
Необходимо доработать этот модуль менеджера. При этом требуется минимизировать количество перезапусков базы после каждого внесения изменения в код в процессе отладки.
Суть решения
- Скопируем весь код модуля менеджера во внешнюю обработку
- Добавим возможность переадресовывать вызовы экспортных методов модуля менеджера во внешнюю обработку (максимально простым способом)
- Переадресацию будем включать/отключать из отладчика с помощью механизма остановки по условию
Шаг 1.
Предлагаю добавить в начало метода, который является точкой входа, следующий код:
// Модуль менеджера некоторого объекта конфигурации
Процедура Печать(Параметры) Экспорт
// ++ отладка
Перем Отладчик;
Если Отладчик <> Неопределено Тогда
Отладчик.Печать(Параметры);
Возврат;
КонецЕсли;
// -- отладка
Сообщить("Это вызов из модуля менеджера");
КонецПроцедуры
Шаг 2.
Далее создаем служебную универсальную внешнюю обработку, например, в какой-нибудь папке на сервере. Назовем ее Отладчик.epf
.
В этой обработке опишем короткую универсальную экспортную функцию примерно следующего содержания:
// Модуль обработки Отладчик.epf
Функция УстановитьМодульОтладки(Отладчик, ИмяМодуля) Экспорт
Отладчик = ВнешниеОбработки.Создать(ПутьКВнешнейОбработке(ИмяМодуля), Ложь);
Возврат Ложь;
КонецФункции
Функция ПутьКВнешнейОбработке(ИмяМодуля)
Возврат ТекущийКаталог() + ИмяМодуля+ ".epf";
КонецФункции
Функция ТекущийКаталог() Экспорт
Файл = Новый Файл(ЭтотОбъект.ИспользуемоеИмяФайла);
Возврат Файл.Путь;
КонецФункции
Шаг 3.
Создадим внешнюю обработку, в которой будем писать наш код. Копируем в модуль объекта этой обработки код из модуля менеджера полностью.
Сохраним ее в той же папке, что и Отладчик.epf
. Зададим для этой обработки имя, например, такое Обработки.ПечатьСчета.МодульМенеджера.epf
.
// модуль объекта внешней обработки Обработки.ПечатьСчета.МодульМенеджера.epf
Процедура Печать(Параметры) Экспорт
// ++ отладка
Перем Отладчик;
Если Отладчик <> Неопределено Тогда
Отладчик.Печать(Параметры);
Возврат;
КонецЕсли;
// -- отладка
// ++ исправили
//Сообщить("Это вызов из модуля менеджера");
Сообщить("Это вызов из внешней обработки");
// -- исправили
КонецПроцедуры
Шаг 4.
В модуле менеджера ставим точку останова по условию. В условие прописываем следующий код:
ВнешниеОбработки.Создать("C:\Отладка\Отладчик.epf", Ложь).УстановитьМодульОтладки(Отладчик, "Обработки.ПечатьСчета.МодульМенеджера")
Шаг 5.
Запускаем тестовый пример. В точке останова будет вызвана проверка условия. При этом в переменную Отладчик
присвоится объект созданной внешней обработки Обработки.ПечатьСчета.МодульМенеджера.epf
. Это приведет к тому, что условие Если Отладчик <> Неопределено Тогда
выполнится, и вызов будет переадресован во внешнюю обработку.
Шаг 6.
Дорабатываем и отлаживаем код во внешней обработке, при этом не тратим время на перезапуск после каждого сохранения.
После окончания доработок - заменяем код в модуле менеджера на код из внешней обработки (полностью).
Не забываем отключить точки останова по условию.
Перед помещением в хранилище можно удалить отладочную часть в модуле менеджера.
Область применения
Таким способом можно отлаживать и дорабатывать модули менеджеров любых объектов и общие модули (серверные).
Для отладки модулей объектов используется похожая технология, но при этом имеется ряд нюансов и ограничений.
Файлы
Прикладываю внешнюю обработку Отладчик.epf, которая кроме описанной выше функции имеет еще несколько полезных возможностей. В том числе умеет создавать пустую обработку-шаблон с именем, соответствующим дорабатываемому объекту
Обработка открывается в режиме управляемого и обычного приложения в любой конфигурации.
Тестировалась на платформе 8.3 в режиме совместимости с 8.2.13. То есть должна работать под 8.2 и 8.3