Даже не знаю, в какую ветку было бы это более правильно засунуть.. Поэтому сюда, благо пока из использующего функционала в решении вопроса темы сообщения больше всего пробовал использовать Formex.

.
Итак, задача состоит в том, чтобы иметь возможность при необходимости вызывать УЖЕ имеющуюся в глобальнике функцию из ВНЕШНЕГО файла, если она там описана. Если не описана - то использоваться должна функция, описанная в глобальном модуле конфигурации.
Задача возникла из-за необходимости внедрить измененный процесс в уже существующей конфигурации и по возможности отлаживать его во время внедрения (без остановки торгового процесса и выхода всех из конфигурации. Сложность в том, что неизвестно есть ли эта функция или нет во внешнем файле, хотелось бы как-то проверить ее существование и тогда уже вызывать или нет + в том, что 1с сообщает об ошибке, если видит вызов несуществующей функции (syntax error).
Выход в тем, чтобы держать эту функцию постоянно во внешнем файле не подходит из-за разных соображений (секурность, наличие постоянного кода во внешнем файле для просмотра и тп). Вот как я попробовал решить эти вопросы:
Пробовал просто тупо описать во внешнем файле уже существующую и описанную в глобальнике функцию второй раз (так-же, c теми же параметрами и словом Экспорт) - загружает, не выдает ошибок, но реально везде, где используется эта функция, выполняется функция из глобальника. ОбновитьДанныеМетодовГлобальногоМодуля() тоже не приносит результатов.
Надумал пока что следующее:
1) При загрузке глобального модуля
глдопФункции=""; (переменная, описанная в глобальном модуле)
Попытка
Сервис = СоздатьОбъект("Сервис");
глДопМодуль = Сервис.ДобавитьГлобальныйМодуль("#ЗагрузитьИзФайла headmod.prm");
глдопФункции="headmod,";
Исключение
КонецПопытки;
Если глдопФункции<>"" Тогда
Попытка
тмп=Шаблон("[глДопПриначалеРаботыСистемы()]");
глдопФункции=глдопФункции+тмп;
Исключение
КонецПопытки;
КонецЕсли;
2) в той самой функции ГЛОБАЛЬНОГО модуля дописать блок тестирующей существование внешней функции-дубля, если есть - передаем ей управление.
Функция ентРасчета = "",ТабВиртРезерва = "",фл=0) Экспорт
Попытка
Если Найти(глдопФункции,"глРазыменоватьГлавныйАртикул")<>0 Тогда
тмп="";
тмп=Число(Шаблон("[глДопРазыменоватьГлавныйАртикул(РазыменуемыйЭлемент,Количество,Склад,ТабТоваров,МоментРасчета,ТабВиртРезерва,фл)]"));
Возврат тмп;
КонецЕсли;
Исключение
КонецПопытки;
[...] далее текст функции
3) во внешнем файле (headmod.prm) всегда должна быть описана функция, возвращающая признак использования внешних функций:
=== headmod.prm ====
Функция глДопПриначалеРаботыСистемы() Экспорт
Возврат "глРазыменоватьГлавныйАртикул";
КонецФункции
// и есс-но сама функция глобального модуля с изменениями и другим названием:
Функция МоментРасчета = "",ТабВиртРезерва = "",фл=0) Экспорт // фл=1 строгое соответствие
[...] далее текст функции
Во всем этом мне не нравится...
1) Необходимость изменения текста исходной функции в глобальнике. Ну, чувствую, от этого не избавиться, если вдруг такой функционал по замене не появится в Formexe.
2) Если кто-то из разработчиков случайно забудет и сохранит файл headmod.prm без функции глДопПриначалеРаботыСистемы, в окно сообщений 1с ВСЕГДА выдастся ошибка, это некрасиво. Пробовал избежать этого с помощью использования вместо функции Шаблон([ модуля:
тмп=СоздатьОбъект("ВыполняемыйМодуль");
;
тмп.КомпилироватьМодуль();
тмп.ВыполнитьМодуль();
а так же с использованием метода КомпилироватьИВыполнитьМодуль - все равно, выдается сообщение "== syntax error".
1с++ я занимаюсь совсем недавно, может быть я не знаю чего-нибудь про обработку т.н. "exception", с помощью которых можно было бы избавиться от сообщения?
Копал так-же в сторону функционала Событие_НеобработаннаяОшибка, обычные ошибки она "ловит" на лету, ошибки же, возникающие внутри Шаблона и ВыполняемогоМодуля - нет (точнее, при выполняемом модуле сперва показывается сообщение "== syntax error", а затем уже срабатывает событие).
Есть ли у кого мысли по этому поводу, направления, о которых можно поразмыслить?