Одна обработка для БСП, Нетленок и 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С стало меньше!

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *