Одна обработка для БСП, Нетленок и Fresh!

13.02.24

Разработка - Универсальные функции

Придумал красивый способ, как оформлять сведения о внешней обработке, чтобы эти сведения не мешали запуску обработки на конфигурациях без БСП и при этом проходили аудит 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С стало меньше!

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Загрузка и выгрузка в Excel Универсальные функции Программист 1С:Предприятие 8 Россия Бесплатно (free)

Описанный ниже подход позволяет в три шага заполнять формулы в Excel файлы, вне зависимости от ОС сервера (MS Windows Server или Linux). Подход подразумевает отказ от работы с COM-объектом в пользу работы через "объектную модель документа" (DOM).

30.10.2025    4107    Abysswalker    10    

46

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

Порой необходимо временно отключить расширение 1С, не удаляя его, чтобы не потерять данные. Но в этом случае при каждом запуске всем будет лезть уведомление о неактивном расширении, хотя очевидно, это техническая информация, которой не стоит лишний раз пугать пользователей.

14.05.2025    7660    DeerCven    15    

61

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    52621    dimanich70    84    

174

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    7664    7    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    67109    atdonya    31    

72

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    9590    ke.92@mail.ru    17    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. timeforlive 17 13.02.24 08:32 Сейчас в теме
Интересное решение, но не понял как решается отсутствие общих модулей БСП. Тема не раскрыта.
Но плюс поставлю
Дмитрий74Чел; HystriX; +2 Ответить
3. laperuz 47 13.02.24 08:41 Сейчас в теме
(1)Она не решается. Автор просто инициализирует переменные, которые совпадают с именами общих модулей, чтобы платформа не ругалась на отсутствующие общие модули.
7. fixin 4330 13.02.24 08:53 Сейчас в теме
(3) да, обман компилятора
2. ixijixi 2134 13.02.24 08:36 Сейчас в теме
Функция СведенияОВнешнейОбработке() Экспорт
	
	Модуль = МодульБСП("ДополнительныеОтчетыИОбработки");
	
	Если Модуль <> Неопределено Тогда
		
		ПараметрыРегистрации = Модуль.СведенияОВнешнейОбработке("3.1.5.274");
		
		ПараметрыРегистрации.Вид				= МодульБСП().ВидОбработкиСозданиеСвязанныхОбъектов();
		ПараметрыРегистрации.Информация			= НСтр("ru = 'Обработка для заполнения реквизитов и табличных частей документов по указанным документам-основаниям. ©2017-2024, https://infostart.ru/1c/tools/1076025/'");
		ПараметрыРегистрации.Версия				= "2.2";
		
		Возврат ПараметрыРегистрации;
		
	КонецЕсли;
	
КонецФункции

Функция МодульБСП(ИмяМодуля = "ДополнительныеОтчетыИОбработкиКлиентСервер")
	
	Модуль = Метаданные.ОбщиеМодули.Найти(ИмяМодуля);
	Если Модуль <> Неопределено Тогда
		Возврат Вычислить(ИмяМодуля);
	КонецЕсли;
	
КонецФункции
Показать

Апдейт. Разместил код, а потом увидел в нем Вычислить)) Не пройдет аудит.
4. laperuz 47 13.02.24 08:42 Сейчас в теме
(2)Аудит во фреше не пройдет из-за "Вычислить"
Светлый ум; fixin; +2 Ответить
6. fixin 4330 13.02.24 08:52 Сейчас в теме
(2) вот ровно об этом и написано в статье, как раз про вычислить
13. RocKeR_13 1467 13.02.24 10:20 Сейчас в теме
(2) Источник - https://its.1c.ru/db/v8std/content/770/hdoc
2. Для исключения описанных уязвимостей, нужно в серверных процедурах и функциях вызов методов Выполнить или Вычислить предварять включением безопасного режима:

УстановитьБезопасныйРежим(Истина);
Выполнить Алгоритм;

В режиме сервиса, включение безопасного режима должно учитывать разделение данных, т.е. приведенный выше пример необходимо доработать следующим образом:

УстановитьБезопасныйРежим(Истина);

Для каждого ИмяРазделителя Из РазделителиКонфигурации() Цикл
УстановитьБезопасныйРежимРазделенияДанных(ИмяРазделителя, Истина);
КонецЦикла;

Выполнить Алгоритм;
Показать


А так тоже аудит не пройдет?)
15. laperuz 47 14.02.24 05:11 Сейчас в теме
(13)Сейчас во фреше двухэтапный аудит, сначала автоматический, потом еще человеком.
В автоматическом режиме там проверка на наличие "Вычислить()" и "Выполнить()", сразу завернет.
16. RocKeR_13 1467 14.02.24 11:13 Сейчас в теме
(15) Аппелировать к стандартам бесполезно?)
17. laperuz 47 14.02.24 11:17 Сейчас в теме
(16)Некому аппелировать, до живого аудитора же не доходит дело:)
А писать в поддержку - это долго, вряд ли кто-то будет заморачиваться
18. RocKeR_13 1467 14.02.24 11:18 Сейчас в теме
5. ixijixi 2134 13.02.24 08:45 Сейчас в теме
(4) Да я уже вижу) Не проснулся еще видимо >_<
Версия автора лучше, возьму на вооружение.
8. ixijixi 2134 13.02.24 08:56 Сейчас в теме
Потестил вариант, неплохо. Наткнулся на неочевидный недостаток: если объявить псевдо-общий модуль (ДополнительныеОтчетыИОбработки = Неопределено), то по F12 переходить будет, но не в выбранную процедуру, а в начало общего модуля.
9. fixin 4330 13.02.24 08:59 Сейчас в теме
(8) ну, этим можно пожертвовать
10. ixijixi 2134 13.02.24 09:09 Сейчас в теме
(9) Согласен, цена мизерная. Тем более у меня метод СведенияОВнешнейОбработке() прописан в шаблонах, переход по F12 не принципиален.
11. asadroman 13.02.24 09:50 Сейчас в теме
Чем плох такой вариант?:

Функция СведенияОВнешнейОбработке() Экспорт 
// Объявим переменную, в которой мы сохраним и вернем "наружу" необходимые данные 


ПараметрыРегистрации = Новый Структура; 


// Объявим еще одну переменную, которая нам потребуется ниже 


МассивНазначений = Новый Массив; 


// Первый параметр, который мы должны указать - это какой вид обработки системе должна зарегистрировать. 


// Допустимые типы: ДополнительнаяОбработка, ДополнительныйОтчет, ЗаполнениеОбъекта, Отчет, ПечатнаяФорма, СозданиеСвязанныхОбъектов 


ПараметрыРегистрации.Вставить("Вид", "ДополнительнаяОбработка"); 


ПараметрыРегистрации.Вставить("Назначение", МассивНазначений); 


// Теперь зададим имя, под которым ВПФ будет зарегистрирована в справочнике внешних обработок 


ПараметрыРегистрации.Вставить("Наименование", "Выгрузка проводок в БП 2.0"); 


// Зададим право обработке на использование безопасного режима. Более подробно можно узнать в справке к платформе (метод УстановитьБезопасныйРежим) 


ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина); 


// Следующие два параметра играют больше информационную роль, т.е. это то, что будет видеть пользователь в информации к обработке 


ПараметрыРегистрации.Вставить("Версия", "1.0"); 
ПараметрыРегистрации.Вставить("Информация", "Обработка 'Выгрузка проводок в БП 2.0'"); 


// Создадим таблицу команд (подробнее смотрим ниже) 


ТаблицаКоманд = ПолучитьТаблицуКоманд(); 


ДобавитьКоманду(ТаблицаКоманд, 
"Выгрузка проводок в БП 2.0", 
"ВыгрузкапроводоквБП20", 
"ОткрытиеФормы", //Использование. Варианты: "ОткрытиеФормы", "ВызовКлиентскогоМетода", "ВызовСерверногоМетода" 
Ложь,//Показывать оповещение. Варианты Истина, Ложь 
"");//Модификатор 


ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); 


Возврат ПараметрыРегистрации; 


КонецФункции 


Функция ПолучитьТаблицуКоманд() 


Команды = Новый ТаблицаЗначений; 
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); 
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); 
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); 
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево")); 
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка")); 


Возврат Команды; 


КонецФункции 


Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "") 


НоваяКоманда = ТаблицаКоманд.Добавить(); 
НоваяКоманда.Представление = Представление; 
НоваяКоманда.Идентификатор = Идентификатор; 
НоваяКоманда.Использование = Использование; 
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение; 
НоваяКоманда.Модификатор = Модификатор; 


КонецПроцедуры
Показать
12. fixin 4330 13.02.24 10:01 Сейчас в теме
(11) Цитирую ответ на ваш вопрос из статьи:

Ранее единственным способом сохранить универсальность обработки было собственное объявление структуры параметров регистрации:

Но этот способ некрасивый — ведь сведения о внешней обработке имеют смысл только для конфигураций с БСП, но не используются функции БСП для описания внешней обработки


Ну и в целом, количество кода меньше, смотрите какой у вас листинг.
И потом, я не знаю, как Fresh относится к таким "альтрнативным объявлениям".
А что насчет передачи дополнительных прав из модуля РаботаВБезопасном режиме? Например, на работу с временными файлами.

Жаль, картинка не вставилась, там был как раз ваш пример.
14. asadroman 13.02.24 10:20 Сейчас в теме
19. intelbit_vceo 1 21.10.24 12:51 Сейчас в теме
Сергей, добрый день.
Не работают личные сообщения, поэтому пишу сюда.

Вы писали, что переделывали код обработки для сбора суммовых остатков с 41 счета на 90/91 счета. Сможете выложить за стартмани? Я бы взял -- есть такая задача у клиента.
Светлый ум; +1 Ответить
Для отправки сообщения требуется регистрация/авторизация