Одна обработка для БСП, Нетленок и Fresh!
Когда я начал серьезно заниматься разработкой внешних обработок на продажу, столкнулся с проблемой — если в обработке используется функция СведенияОВнешнейОбработке, то она не запускается в конфигурациях без БСП, выдаются ошибки вида:
{ВнешняяОбработка.УдалениеПомеченныхОбъектов.МодульОбъекта(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С стало меньше!
Свежие комментарии