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

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

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

Перерыв весь интернет не смог найти простого способа сохранить отчет с большим числом строк в формате Excel. Везде предлагалось писать процедуры построчной записи, ADO, COMSafeArray и прочее. Метод же, используемый во всех найденный публикациях "Результат.Записать(ИмяФайла,ТипФайлаТабличногоДокумента.XLSX)", не работает при большом числе строк. Публикация http://infostart.ru/public/77128/ натолкнула на простую идею, которую и реализовал.

07.08.2014    43293    den_valley    15    

46

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

Небольшая функция, возвращающая таблицу значений со всеми датами за период. Интервал дат можно задать любой: Секунда, Минута, Час, День, Неделя, Месяц, Квартал, Полугодие, Год.

1 стартмани

14.06.2014    57738    46    mtv:)    13    

51

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

Обработка созданная с целью представить реализованный мной алгоритм сравнения строк. Реализована на 1С 8.1, однако будет работать и на более поздних версиях.

1 стартмани

15.05.2014    30796    80    bahbah    16    

64

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

Как сделать воспроизведение звука в 1С без внешних компонентов? Решаем средствами интернета. Для тонкого, толстого и web-клиента.

1 стартмани

30.12.2013    103945    285    sikuda    37    

56

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

Описан способ внеконтекстного вызова методов объекта обработки (отчета) в управляемой форме для выполнения некоторых действий или возврата результатов каких-то вычислений, зависящих только от значений переданных методу параметров. Обсуждена применимость предлагаемого способа. Предлагаются способы обхода ограничений для случая запуска обработки в фоновом задании.

1 стартмани

16.12.2013    67515    12    yuraos    35    

103

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

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

10.12.2013    158949    Draconus    47    

71

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

Отладка внешних печатных форм для тонкого клиента без дополнительных обработок.

10.12.2013    31147    rutadmeen    43    

57

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

Загрузка с сервера, автоматическое масштабирование, увеличение-уменьшение, поворот. На примере просмотра фотографии сделанных торговыми агентами через систему приема заявок МОБИ-С. UPD: при вставке кода процедуры УстановитьТекстHTMLСФото не вставился собственно html код, исправил

1 стартмани

28.11.2013    30373    29    anig99    9    

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