Когда я начал серьезно заниматься разработкой внешних обработок на продажу, столкнулся с проблемой — если в обработке используется функция СведенияОВнешнейОбработке, то она не запускается в конфигурациях без БСП, выдаются ошибки вида:
{ВнешняяОбработка.УдалениеПомеченныхОбъектов.МодульОбъекта(2,25)}: Переменная не определена (ДополнительныеОтчетыИОбработки)
ПараметрыРегистрации = <<?>>ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(СтандартныеПодсистемыСервер.ВерсияБиблиотеки()); (Проверка: Сервер)
{ВнешняяОбработка.УдалениеПомеченныхОбъектов.МодульОбъекта(2,82)}: Переменная не определена (СтандартныеПодсистемыСервер)
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(<<?>>СтандартныеПодсистемыСервер.ВерсияБиблиотеки()); (Проверка: Сервер)
{ВнешняяОбработка.УдалениеПомеченныхОбъектов.МодульОбъекта(4,29)}: Переменная не определена (ДополнительныеОтчетыИОбработкиКлиентСервер)
ПараметрыРегистрации.Вид = <<?>>ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка(); (Проверка: Сервер)
{ВнешняяОбработка.УдалениеПомеченныхОбъектов.МодульОбъекта(11,26)}: Переменная не определена (ДополнительныеОтчетыИОбработкиКлиентСервер)
Команда.Использование = <<?>>ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(); (Проверка: Сервер)
{ВнешняяОбработка.УдалениеПомеченныхОбъектов.МодульОбъекта(14,15)}: Переменная не определена (РаботаВБезопасномРежиме)
Разрешение = <<?>>РаботаВБезопасномРежиме.РазрешениеНаИспользованиеКаталогаВременныхФайлов(Ложь,Истина,"Тест"); (Проверка: Сервер)
Проблема в том, что в таких конфигурациях нет модулей БСП.
Некоторое время я решал проблему тем, что добавлял в такие конфигурации пустые общие модули с необходимыми именами. Хотел даже написать расширение, состоящее исключительно из таких модулей.
Но всегда хотелось, чтобы обработка была универсальной и запускалась во всех конфигурациях.
Я искал решение проблемы и нашел в обсуждениях, что можно получать общий модуль через Вычислить, например так:
Вычислить("ДополнительныеОтчетыИОбработкиКлиентСервер")
Это хороший способ, задача решается, но возникает новая проблема — такой код не пройдет аудит во Fresh, т.к. там запрещены вызовы Вычислить.
А хотелось решения раз и навсегда. Чтобы не делать для Fresh отдельную версию обработку.
Ранее единственным способом сохранить универсальность обработки было собственное объявление структуры параметров регистрации:
В итоге 11 февраля 2024 года мне пришла в голову идея, как это организовать, классическим способом обмана компилятора.
Функция СведенияОВнешнейОбработке() Экспорт
//Инъекция от Гения 1С для компиляции функции в конфигурациях без БСП https://geniy1s.ru/odna-obrabotka-dlya-bsp-netlenok-i-fresh
Если ложь Тогда
ДополнительныеОтчетыИОбработки = Неопределено;
РаботаВБезопасномРежиме = Неопределено;
ДополнительныеОтчетыИОбработкиКлиентСервер = Неопределено;
СтандартныеПодсистемыСервер = Неопределено;
КонецЕсли;
...
Возврат ПараметрыРегистрации;
КонецФункции
Рекомендую применять в своих обработках, которые планируется применять не только в БСП!
Кстати, изначально мне пришел в голову такой код:
Попытка
ОбщегоНазначения = ОбщегоНазначения;
Исключение
КонецПопытки;
Но в комментариях на Инфостарте мне предложили более красивую его версию, которую я тут и применил:
Если ложь Тогда
ОбщегоНазначения = Неопределено;
КонецЕсли;
Слава Богу, еще одной головной болью в 1С стало меньше!