Тот, кто сталкивался с процессом внесения изменений знает, насколько это малоприятное занятие, при том что на этапе отладки изменения могут понадобиться достаточно частые, т.к. воссоздать все возможные проблемы на этапе первоначальной разработки практически нереально. Использование внешних обработок отчасти решает проблему, однако стандартные механизмы УПП имеют ограничения: в частности внешняя обработка не возвращает никаких значений. Обычно проблема решается двумя путями:
либо код функции размещается внутри конфигурации со всеми вытекающими проблемами, когда его нужно исправить, либо многократно дублируется, что тоже не слишком удобно.
Однако, как оказалось, научить внешнюю обработку возвращать вычисленное значение совсем несложно. Для этого внутри конфигурации нам потребуется функция-посредник и объект-хранилище для внешних обработок. В случае с УПП в качестве хранилища нас вполне устраивает справочник "Внешние обработки", его и будем использовать.
Функцию-посредник нужно разместить в одном из общих модулей по вашему вкусу. (При этом не забываем, что тонкий клиент непосредственно обратиться к справочнику-хранилищу не в состоянии, а возможность работы с файлами, а следовательно и внешними обработками, на сервере может быть ограничена фантазией его администратора, но вполне возможна)
//Наименование - имя обработки в справочнике
//Параметры вызова - передаваемые в обработку параметры
Функция ВызватьВнешнююОбработку(Наименование, ПараметрыВызова=неопределено) Экспорт
СсылкаНаОбъект = Справочники.ВнешниеОбработки.НайтиПоНаименованию(Наименование);
Если не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
Сообщить("Обработка не найдена");
Возврат неопределено;
КонецЕсли;
ЭтоОбработка = ?(СсылкаНаОбъект.ВидОбработки = Перечисления.ВидыДополнительныхВнешнихОбработок.Обработка, Истина, Ложь);
Если НЕ ЭтоОбработка Тогда
Возврат неопределено;
КонецЕсли;
ИмяФайла = ПолучитьИмяВременногоФайла();
ДвоичныеДанные = СсылкаНаОбъект.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанные.Записать(ИмяФайла);
Попытка
Обработка = ВнешниеОбработки.Создать(ИмяФайла);
ЗначениеИзОбработки = Обработка.ВычислитьЗначение(ПараметрыВызова);
Исключение
Сообщить ("Выбранный файл не является внешней обработкой,
|поврежден, либо функция вызвана неверно.");
КонецПопытки;
УдалитьФайлы(ИмяФайла);
Возврат ЗначениеИзОбработки;
КонецФункции
Теперь, чтобы обратиться к внешней обработке, содержащей интересующую нас функцию в ее модуле объекта размещаем экспортную функцию, для нашего примера:
Функция ВычислитьЗначение(ПараметрыВызова) Экспорт
//Выполняем полезные действия
Возврат ПолученноеЗначение;
КонецФункции