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

См. также

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

21.05.2024    21031    dimanich70    81    

145

Универсальные функции Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

18.03.2024    4153    3    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

12.02.2024    19321    atdonya    24    

58

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    5598    ke.92@mail.ru    16    

65

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    15087    YA_418728146    7    

169

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    3668    57    progmaster    8    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    18613    172    sapervodichka    112    

135
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. timeforlive 16 13.02.24 08:32 Сейчас в теме
Интересное решение, но не понял как решается отсутствие общих модулей БСП. Тема не раскрыта.
Но плюс поставлю
Дмитрий74Чел; HystriX; +2 Ответить
3. laperuz 47 13.02.24 08:41 Сейчас в теме
(1)Она не решается. Автор просто инициализирует переменные, которые совпадают с именами общих модулей, чтобы платформа не ругалась на отсутствующие общие модули.
7. fixin 4275 13.02.24 08:53 Сейчас в теме
(3) да, обман компилятора
2. ixijixi 1922 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 4275 13.02.24 08:52 Сейчас в теме
(2) вот ровно об этом и написано в статье, как раз про вычислить
13. RocKeR_13 1366 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 1366 14.02.24 11:13 Сейчас в теме
(15) Аппелировать к стандартам бесполезно?)
17. laperuz 47 14.02.24 11:17 Сейчас в теме
(16)Некому аппелировать, до живого аудитора же не доходит дело:)
А писать в поддержку - это долго, вряд ли кто-то будет заморачиваться
18. RocKeR_13 1366 14.02.24 11:18 Сейчас в теме
5. ixijixi 1922 13.02.24 08:45 Сейчас в теме
(4) Да я уже вижу) Не проснулся еще видимо >_<
Версия автора лучше, возьму на вооружение.
8. ixijixi 1922 13.02.24 08:56 Сейчас в теме
Потестил вариант, неплохо. Наткнулся на неочевидный недостаток: если объявить псевдо-общий модуль (ДополнительныеОтчетыИОбработки = Неопределено), то по F12 переходить будет, но не в выбранную процедуру, а в начало общего модуля.
9. fixin 4275 13.02.24 08:59 Сейчас в теме
(8) ну, этим можно пожертвовать
10. ixijixi 1922 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 4275 13.02.24 10:01 Сейчас в теме
(11) Цитирую ответ на ваш вопрос из статьи:

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

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


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

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

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