-
Notifications
You must be signed in to change notification settings - Fork 7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Added universal func for execute custom functions #66
Conversation
WalkthroughThe recent updates focus on optimizing function handling within the software system. Refactoring across various modules has streamlined parameter management, eliminated redundant logic, and enhanced function execution processes, leading to more efficient and cleaner code. Changes
Poem
Recent Review DetailsConfiguration used: CodeRabbit UI Files selected for processing (5)
Files skipped from review as they are similar to previous changes (1)
Additional Context UsedGitHub Check Runs (1)
Additional comments not posted (3)
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (invoked as PR comments)
Additionally, you can add CodeRabbit Configration File (
|
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
Out of diff range and nitpick comments (5)
src/Catalogs/__ПользовательскиеФункции/Forms/ФормаЭлемента/Ext/Form/Module.bsl (1)
Line range hint
505-519
: Refactor error handling inВыполнитьКодСервер
.- ТекстСообщения = СтрШаблон(НСтр("ru = 'Ошибка при выполнении функции по причине: %1'; - |en = 'Error when executing the function due to: %1'"), - КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); - ВызватьИсключение ТекстСообщения; + // Improved error handling with more detailed error information and logging + ТекстСообщения = СтрШаблон("Ошибка при выполнении функции: %1. Подробности: %2", + Объект.Наименование, КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); + ЗаписатьЖурналРегистрации("Ошибка выполнения пользовательской функции", УровеньЖурналаРегистрации.Ошибка, ТекстСообщения); + // Consider re-throwing the exception if critical + // ВызватьИсключение ТекстСообщения;Consider enhancing the error handling by providing more detailed error messages and logging them appropriately. Depending on the severity, you might also want to re-throw the exception to ensure it's handled upstream.
src/CommonModules/__ОбщегоНазначенияСервер/Ext/Module.bsl (4)
Line range hint
1935-1935
: Replace deprecated method usage.- ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение МенеджерОбработкиОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());The method
КраткоеПредставлениеОшибки
is deprecated. Use the method from theМенеджерОбработкиОшибок
object instead to ensure future compatibility and adherence to best practices.
Line range hint
1923-1923
: Add an "Else" branch for robustness.The conditional structure starting at line 1923 should include an "Else" branch to handle unexpected cases explicitly. This ensures that all possible paths are considered and handled appropriately.
Line range hint
1933-1933
: Address potential security vulnerability.Executing arbitrary code in a common module on the server (line 1933) can lead to security vulnerabilities. Ensure that the code executed is sanitized and consider implementing additional security checks or constraints to prevent unauthorized code execution.
Line range hint
1896-1920
: Replace magic numbers with named constants.- Если Параметр.Номер = 2 Тогда + const PARAMETER_TWO = 2; + Если Параметр.Номер = PARAMETER_TWO ТогдаReplace magic numbers (e.g., '2', '3', '4', etc.) with named constants to improve code readability and maintainability. This change makes the code easier to understand and modify in the future.
| | ||
|//////////////////////////////////////////////////////////////////////////////// | ||
|ВЫБРАТЬ РАЗЛИЧНЫЕ | ||
| __ПользовательскиеФункцииПеременные.Имя КАК Имя, | ||
| __ПользовательскиеФункцииПеременные.Значение КАК Значение | ||
|ИЗ | ||
| Справочник.__ПользовательскиеФункции.Переменные КАК __ПользовательскиеФункцииПеременные | ||
|ГДЕ | ||
| __ПользовательскиеФункцииПеременные.Ссылка = &Ссылка"; | ||
|
||
Запрос.УстановитьПараметр("Ссылка", Ссылка); | ||
|
||
РезультатыЗапроса = Запрос.ВыполнитьПакет(); | ||
|
||
Выборка = РезультатыЗапроса[0].Выбрать(); | ||
ВыборкаТЧ = РезультатыЗапроса[1].Выбрать(); | ||
ВыборкаПерем = РезультатыЗапроса[2].Выбрать(); | ||
|
||
ГУИД = Ссылка.УникальныйИдентификатор(); | ||
|
||
Выборка.Следующий(); | ||
ТекстФункции = Выборка.КодПодпрограммы; | ||
|
||
Переменные = Новый Структура; | ||
Пока ВыборкаПерем.Следующий() Цикл | ||
Если ПустаяСтрока(ВыборкаПерем.Имя) И Переменные.Свойство(ВыборкаПерем.Имя) Тогда | ||
Продолжить; | ||
КонецЕсли; | ||
Переменные.Вставить(ВыборкаПерем.Имя, ВыборкаПерем.Значение); | ||
КонецЦикла; | ||
|
||
Отказ = Ложь; | ||
Для Каждого Параметр Из Параметры Цикл | ||
Если ВыборкаТЧ.НайтиСледующий(Параметр.Параметр, "Наименование") Тогда | ||
ТипЗнч = ТипЗнч(Параметр.Значение); | ||
Если ТипЗнч <> Тип(ВыборкаТЧ.Тип) Тогда | ||
ТекстСообщения = СтрШаблон(НСтр("ru='Тип значения параметра %1 - %2. Допустимый - %3!'"), | ||
Параметр.Параметр, | ||
ТипЗнч, | ||
ВыборкаТЧ.Тип); | ||
__ОбщегоНазначенияСлужебный.СообщитьПользователю( | ||
ТекстСообщения, , , , Отказ); | ||
КонецЕсли; | ||
Иначе | ||
ТекстСообщения = СтрШаблон(НСтр("ru='Параметр: %1, не используется в функции.'"), Параметр.Параметр); | ||
__ОбщегоНазначенияСлужебный.СообщитьПользователю(ТекстСообщения); | ||
КонецЕсли; | ||
|
||
Если Отказ Тогда | ||
Продолжить; | ||
КонецЕсли; | ||
|
||
Если Параметр.Номер = 1 Тогда | ||
П1 = Параметр.Значение; | ||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П1"); | ||
ИначеЕсли Параметр.Номер = 2 Тогда | ||
П2 = Параметр.Значение; | ||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П2"); | ||
ИначеЕсли Параметр.Номер = 3 Тогда | ||
П3 = Параметр.Значение; | ||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П3"); | ||
ИначеЕсли Параметр.Номер = 4 Тогда | ||
П4 = Параметр.Значение; | ||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П4"); | ||
ИначеЕсли Параметр.Номер = 5 Тогда | ||
П5 = Параметр.Значение; | ||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П5"); | ||
ИначеЕсли Параметр.Номер = 6 Тогда | ||
П6 = Параметр.Значение; | ||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П6"); | ||
ИначеЕсли Параметр.Номер = 7 Тогда | ||
П7 = Параметр.Значение; | ||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П7"); | ||
ИначеЕсли Параметр.Номер = 8 Тогда | ||
П8 = Параметр.Значение; | ||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П8"); | ||
ИначеЕсли Параметр.Номер = 9 Тогда | ||
П9 = Параметр.Значение; | ||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П9"); | ||
ИначеЕсли Параметр.Номер = 10 Тогда | ||
П10 = Параметр.Значение; | ||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П10"); | ||
КонецЕсли; | ||
КонецЦикла; | ||
|
||
Результат = Неопределено; | ||
|
||
Если Отказ Тогда | ||
ВызватьИсключение(НСтр("ru='Ошибки при подстановке параметров!.'")); | ||
КонецЕсли; | ||
|
||
Попытка | ||
Выполнить(ТекстФункции); | ||
Исключение | ||
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); | ||
КонецПопытки; | ||
|
||
Возврат Результат; | ||
|
||
КонецФункции |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Refactor the function ВыполнитьПользовательскуюФункциюСПараметрами
to reduce complexity.
The function ВыполнитьПользовательскуюФункциюСПараметрами
has a high cognitive and cyclomatic complexity, making it hard to maintain and understand. Consider breaking down the function into smaller, more manageable parts or simplifying the logic to improve readability and maintainability.
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П3"); | ||
ИначеЕсли Параметр.Номер = 4 Тогда | ||
П4 = Параметр.Значение; | ||
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П4"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove unused variables.
- Перем П1, П2, П3, П4, П5, П6, П7, П8, П9, П10;
The variables П1
, П2
, П3
, П4
, П5
, П6
, П7
, П8
, П9
, П10
are declared but not used within the function ВыполнитьПользовательскуюФункциюСПараметрами
. Consider removing these declarations to clean up the code.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П4"); | |
ТекстФункции = СтрЗаменить(ТекстФункции, Параметр.Параметр, "П4"); |
КонецФункции | ||
|
||
// Создает таблицу параметров с необходимыми колонками. | ||
// |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Remove unused variable ГУИД
.
- ГУИД = Ссылка.УникальныйИдентификатор();
The variable ГУИД
is declared but not used within the function ВыполнитьПользовательскуюФункциюСПараметрами
. Removing this line will clean up the code and reduce unnecessary memory usage.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
// | |
// |
@coderabbitai пожалуйста, всегда используй русский язык в этом репозитории |
Tip For best results, initiate chat on the files or code changes. @ivanmolodec, спасибо за ваше напоминание. Я буду использовать русский язык для всех взаимодействий в этом репозитории. |
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
Out of diff range and nitpick comments (3)
src/CommonModules/__ОбщегоНазначенияСервер/Ext/Module.bsl (3)
Line range hint
2439-2440
: Replace magic numbers with named constants for clarity.+ Константа MIN_DIGIT_ASCII = 48 + Константа MAX_DIGIT_ASCII = 57 + Константа MAX_ASCII = 127 - Если Не (КодДо >= 48 И КодДо <= 57) И КодДо < 127 + Если Не (КодДо >= MIN_DIGIT_ASCII И КодДо <= MAX_DIGIT_ASCII) И КодДо < MAX_ASCIIUsing named constants instead of magic numbers makes the code more readable and maintainable.
Line range hint
1884-1884
: Update deprecated method usage to enhance compatibility with newer platform versions.- ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); + ВызватьИсключение МенеджерОбработкиОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());This change updates the method call to use the non-deprecated version, ensuring compatibility with newer versions of the platform.
Line range hint
1882-1882
: Security risk: executing arbitrary code in a server-side common module.The use of
Выполнить(ТекстФункции);
poses a security risk as it allows for the execution of arbitrary code. Consider implementing a more secure method of invoking functionality, such as using a predefined set of safe functions or validating the code against a whitelist before execution.
// Выполняет пользовательскую функцию с переданными параметрами. | ||
// | ||
// Параметры: | ||
// Ссылка - СправочникСсылка.__ПользовательскиеФункции - Ссылка пользовательской функции, которую требуется выполнить | ||
// Параметры - Структура - Подготовленные параметры для выполнения пользовательской функции | ||
// * Ключ - Строка - Имя параметра | ||
// * Значение - Структура - Тип и значение параметра | ||
// * Ключ - Строка - может быть "Тип", "Значение" | ||
// * Значение - Произвольный | ||
// | ||
// Возвращаемое значение: | ||
// Неопределено, в - случае успешного выполнения, Описание ошибки, в случае неудачи. | ||
// | ||
Функция ВыполнитьПользовательскуюФункциюСПараметрами(Ссылка, Параметры) Экспорт | ||
|
||
Отказ = Ложь; | ||
Результат = Неопределено; | ||
|
||
Запрос = Новый Запрос; | ||
Запрос.Текст = | ||
"ВЫБРАТЬ | ||
| __ПользовательскиеФункции.КодПодпрограммы КАК КодПодпрограммы | ||
|ИЗ | ||
| Справочник.__ПользовательскиеФункции КАК __ПользовательскиеФункции | ||
|ГДЕ | ||
| __ПользовательскиеФункции.Ссылка = &Ссылка | ||
|; | ||
| | ||
|//////////////////////////////////////////////////////////////////////////////// | ||
|ВЫБРАТЬ | ||
| __ПользовательскиеФункцииПараметрыФункции.Наименование КАК Наименование, | ||
| __ПользовательскиеФункцииПараметрыФункции.Тип КАК Тип, | ||
| __ПользовательскиеФункцииПараметрыФункции.Необязательный КАК Необязательный | ||
|ИЗ | ||
| Справочник.__ПользовательскиеФункции.ПараметрыФункции КАК __ПользовательскиеФункцииПараметрыФункции | ||
|ГДЕ | ||
| __ПользовательскиеФункцииПараметрыФункции.Ссылка = &Ссылка | ||
|; | ||
| | ||
|//////////////////////////////////////////////////////////////////////////////// | ||
|ВЫБРАТЬ РАЗЛИЧНЫЕ | ||
| __ПользовательскиеФункцииПеременные.Имя КАК Имя, | ||
| __ПользовательскиеФункцииПеременные.Значение КАК Значение | ||
|ИЗ | ||
| Справочник.__ПользовательскиеФункции.Переменные КАК __ПользовательскиеФункцииПеременные | ||
|ГДЕ | ||
| __ПользовательскиеФункцииПеременные.Ссылка = &Ссылка"; | ||
|
||
Запрос.УстановитьПараметр("Ссылка", Ссылка); | ||
|
||
РезультатыЗапроса = Запрос.ВыполнитьПакет(); | ||
|
||
Выборка = РезультатыЗапроса[0].Выбрать(); | ||
ВыборкаТЧ = РезультатыЗапроса[1].Выбрать(); | ||
ВыборкаПерем = РезультатыЗапроса[2].Выбрать(); | ||
|
||
Выборка.Следующий(); | ||
ТекстФункции = Выборка.КодПодпрограммы; | ||
|
||
Переменные = Новый Структура; | ||
Пока ВыборкаПерем.Следующий() Цикл | ||
Если ПустаяСтрока(ВыборкаПерем.Имя) И Переменные.Свойство(ВыборкаПерем.Имя) Тогда | ||
Продолжить; | ||
КонецЕсли; | ||
Переменные.Вставить(ВыборкаПерем.Имя, ВыборкаПерем.Значение); | ||
КонецЦикла; | ||
|
||
Параметры = ПодставитьПараметрыВФункцию(ТекстФункции, Параметры, ВыборкаТЧ, Отказ); | ||
|
||
Если Отказ Тогда | ||
ВызватьИсключение(НСтр("ru='Ошибки при подстановке параметров!.'")); | ||
КонецЕсли; | ||
|
||
Попытка | ||
Выполнить(ТекстФункции); | ||
Исключение | ||
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); | ||
КонецПопытки; | ||
|
||
Возврат Результат; | ||
|
||
КонецФункции |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Refactor the function ВыполнитьПользовательскуюФункциюСПараметрами
to improve error handling and maintainability.
- ВызватьИсключение(НСтр("ru='Ошибки при подстановке параметров!.'"));
+ Если Отказ Тогда
+ Возврат НСтр("ru='Ошибки при подстановке параметров!.'");
+ КонецЕсли;
This change ensures that the function returns an error description instead of throwing an exception, which can be handled more gracefully by the calling code.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
// Выполняет пользовательскую функцию с переданными параметрами. | |
// | |
// Параметры: | |
// Ссылка - СправочникСсылка.__ПользовательскиеФункции - Ссылка пользовательской функции, которую требуется выполнить | |
// Параметры - Структура - Подготовленные параметры для выполнения пользовательской функции | |
// * Ключ - Строка - Имя параметра | |
// * Значение - Структура - Тип и значение параметра | |
// * Ключ - Строка - может быть "Тип", "Значение" | |
// * Значение - Произвольный | |
// | |
// Возвращаемое значение: | |
// Неопределено, в - случае успешного выполнения, Описание ошибки, в случае неудачи. | |
// | |
Функция ВыполнитьПользовательскуюФункциюСПараметрами(Ссылка, Параметры) Экспорт | |
Отказ = Ложь; | |
Результат = Неопределено; | |
Запрос = Новый Запрос; | |
Запрос.Текст = | |
"ВЫБРАТЬ | |
| __ПользовательскиеФункции.КодПодпрограммы КАК КодПодпрограммы | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции КАК __ПользовательскиеФункции | |
|ГДЕ | |
| __ПользовательскиеФункции.Ссылка = &Ссылка | |
|; | |
| | |
|//////////////////////////////////////////////////////////////////////////////// | |
|ВЫБРАТЬ | |
| __ПользовательскиеФункцииПараметрыФункции.Наименование КАК Наименование, | |
| __ПользовательскиеФункцииПараметрыФункции.Тип КАК Тип, | |
| __ПользовательскиеФункцииПараметрыФункции.Необязательный КАК Необязательный | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции.ПараметрыФункции КАК __ПользовательскиеФункцииПараметрыФункции | |
|ГДЕ | |
| __ПользовательскиеФункцииПараметрыФункции.Ссылка = &Ссылка | |
|; | |
| | |
|//////////////////////////////////////////////////////////////////////////////// | |
|ВЫБРАТЬ РАЗЛИЧНЫЕ | |
| __ПользовательскиеФункцииПеременные.Имя КАК Имя, | |
| __ПользовательскиеФункцииПеременные.Значение КАК Значение | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции.Переменные КАК __ПользовательскиеФункцииПеременные | |
|ГДЕ | |
| __ПользовательскиеФункцииПеременные.Ссылка = &Ссылка"; | |
Запрос.УстановитьПараметр("Ссылка", Ссылка); | |
РезультатыЗапроса = Запрос.ВыполнитьПакет(); | |
Выборка = РезультатыЗапроса[0].Выбрать(); | |
ВыборкаТЧ = РезультатыЗапроса[1].Выбрать(); | |
ВыборкаПерем = РезультатыЗапроса[2].Выбрать(); | |
Выборка.Следующий(); | |
ТекстФункции = Выборка.КодПодпрограммы; | |
Переменные = Новый Структура; | |
Пока ВыборкаПерем.Следующий() Цикл | |
Если ПустаяСтрока(ВыборкаПерем.Имя) И Переменные.Свойство(ВыборкаПерем.Имя) Тогда | |
Продолжить; | |
КонецЕсли; | |
Переменные.Вставить(ВыборкаПерем.Имя, ВыборкаПерем.Значение); | |
КонецЦикла; | |
Параметры = ПодставитьПараметрыВФункцию(ТекстФункции, Параметры, ВыборкаТЧ, Отказ); | |
Если Отказ Тогда | |
ВызватьИсключение(НСтр("ru='Ошибки при подстановке параметров!.'")); | |
КонецЕсли; | |
Попытка | |
Выполнить(ТекстФункции); | |
Исключение | |
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); | |
КонецПопытки; | |
Возврат Результат; | |
КонецФункции | |
// Выполняет пользовательскую функцию с переданными параметрами. | |
// | |
// Параметры: | |
// Ссылка - СправочникСсылка.__ПользовательскиеФункции - Ссылка пользовательской функции, которую требуется выполнить | |
// Параметры - Структура - Подготовленные параметры для выполнения пользовательской функции | |
// * Ключ - Строка - Имя параметра | |
// * Значение - Структура - Тип и значение параметра | |
// * Ключ - Строка - может быть "Тип", "Значение" | |
// * Значение - Произвольный | |
// | |
// Возвращаемое значение: | |
// Неопределено, в - случае успешного выполнения, Описание ошибки, в случае неудачи. | |
// | |
Функция ВыполнитьПользовательскуюФункциюСПараметрами(Ссылка, Параметры) Экспорт | |
Отказ = Ложь; | |
Результат = Неопределено; | |
Запрос = Новый Запрос; | |
Запрос.Текст = | |
"ВЫБРАТЬ | |
| __ПользовательскиеФункции.КодПодпрограммы КАК КодПодпрограммы | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции КАК __ПользовательскиеФункции | |
|ГДЕ | |
| __ПользовательскиеФункции.Ссылка = &Ссылка | |
|; | |
| | |
|//////////////////////////////////////////////////////////////////////////////// | |
|ВЫБРАТЬ | |
| __ПользовательскиеФункцииПараметрыФункции.Наименование КАК Наименование, | |
| __ПользовательскиеФункцииПараметрыФункции.Тип КАК Тип, | |
| __ПользовательскиеФункцииПараметрыФункции.Необязательный КАК Необязательный | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции.ПараметрыФункции КАК __ПользовательскиеФункцииПараметрыФункции | |
|ГДЕ | |
| __ПользовательскиеФункцииПараметрыФункции.Ссылка = &Ссылка | |
|; | |
| | |
|//////////////////////////////////////////////////////////////////////////////// | |
|ВЫБРАТЬ РАЗЛИЧНЫЕ | |
| __ПользовательскиеФункцииПеременные.Имя КАК Имя, | |
| __ПользовательскиеФункцииПеременные.Значение КАК Значение | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции.Переменные КАК __ПользовательскиеФункцииПеременные | |
|ГДЕ | |
| __ПользовательскиеФункцииПеременные.Ссылка = &Ссылка"; | |
Запрос.УстановитьПараметр("Ссылка", Ссылка); | |
РезультатыЗапроса = Запрос.ВыполнитьПакет(); | |
Выборка = РезультатыЗапроса[0].Выбрать(); | |
ВыборкаТЧ = РезультатыЗапроса[1].Выбрать(); | |
ВыборкаПерем = РезультатыЗапроса[2].Выбрать(); | |
Выборка.Следующий(); | |
ТекстФункции = Выборка.КодПодпрограммы; | |
Переменные = Новый Структура; | |
Пока ВыборкаПерем.Следующий() Цикл | |
Если ПустаяСтрока(ВыборкаПерем.Имя) И Переменные.Свойство(ВыборкаПерем.Имя) Тогда | |
Продолжить; | |
КонецЕсли; | |
Переменные.Вставить(ВыборкаПерем.Имя, ВыборкаПерем.Значение); | |
КонецЦикла; | |
Параметры = ПодставитьПараметрыВФункцию(ТекстФункции, Параметры, ВыборкаТЧ, Отказ); | |
Если Отказ Тогда | |
Возврат НСтр("ru='Ошибки при подстановке параметров!.'"); | |
КонецЕсли; | |
Попытка | |
Выполнить(ТекстФункции); | |
Исключение | |
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); | |
КонецПопытки; | |
Возврат Результат; | |
КонецФункции |
Префикс = "Параметры."; | ||
Позиция = СтрНайти(Текст, Ключ); | ||
Пока Позиция > 0 Цикл | ||
|
||
СимволДо = ?(Позиция = 1, "", Сред(Текст, Позиция - 1, 1)); | ||
КодДо = КодСимвола(СимволДо); | ||
|
||
СимволПосле = Сред(Текст, Позиция + СтрДлина(Ключ), 1); | ||
КодПосле = КодСимвола(СимволПосле); | ||
|
||
Если Не (КодДо >= 48 И КодДо <= 57) И КодДо < 127 | ||
И Не (КодПосле >= 48 И КодПосле <= 57) И КодПосле < 127 Тогда | ||
Текст = СтрЗаменить(Текст, СимволДо + Ключ + СимволПосле, СимволДо + Префикс + Ключ + СимволПосле); | ||
КонецЕсли; | ||
|
||
Позиция = СтрНайти(Текст, Ключ, НаправлениеПоиска.СНачала, Позиция + СтрДлина(Префикс) + 1); | ||
|
||
КонецЦикла; | ||
|
||
КонецПроцедуры |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Optimize the ЗаменаПодстроки
procedure to avoid potential infinite loops and improve performance.
- Пока Позиция > 0 Цикл
+ Пока Позиция > 0 И Позиция <= СтрДлина(Текст) Цикл
Adding a condition to check the position against the string length prevents the loop from running indefinitely if the replacement does not change the position of the search string.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
Префикс = "Параметры."; | |
Позиция = СтрНайти(Текст, Ключ); | |
Пока Позиция > 0 Цикл | |
СимволДо = ?(Позиция = 1, "", Сред(Текст, Позиция - 1, 1)); | |
КодДо = КодСимвола(СимволДо); | |
СимволПосле = Сред(Текст, Позиция + СтрДлина(Ключ), 1); | |
КодПосле = КодСимвола(СимволПосле); | |
Если Не (КодДо >= 48 И КодДо <= 57) И КодДо < 127 | |
И Не (КодПосле >= 48 И КодПосле <= 57) И КодПосле < 127 Тогда | |
Текст = СтрЗаменить(Текст, СимволДо + Ключ + СимволПосле, СимволДо + Префикс + Ключ + СимволПосле); | |
КонецЕсли; | |
Позиция = СтрНайти(Текст, Ключ, НаправлениеПоиска.СНачала, Позиция + СтрДлина(Префикс) + 1); | |
КонецЦикла; | |
КонецПроцедуры | |
Префикс = "Параметры."; | |
Позиция = СтрНайти(Текст, Ключ); | |
Пока Позиция > 0 И Позиция <= СтрДлина(Текст) Цикл | |
СимволДо = ?(Позиция = 1, "", Сред(Текст, Позиция - 1, 1)); | |
КодДо = КодСимвола(СимволДо); | |
СимволПосле = Сред(Текст, Позиция + СтрДлина(Ключ), 1); | |
КодПосле = КодСимвола(СимволПосле); | |
Если Не (КодДо >= 48 И КодДо <= 57) И КодДо < 127 | |
И Не (КодПосле >= 48 И КодПосле <= 57) И КодПосле < 127 Тогда | |
Текст = СтрЗаменить(Текст, СимволДо + Ключ + СимволПосле, СимволДо + Префикс + Ключ + СимволПосле); | |
КонецЕсли; | |
Позиция = СтрНайти(Текст, Ключ, НаправлениеПоиска.СНачала, Позиция + СтрДлина(Префикс) + 1); | |
КонецЦикла; | |
КонецПроцедуры |
This comment has been minimized.
This comment has been minimized.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
// Выполняет пользовательскую функцию с переданными параметрами. | ||
// | ||
// Параметры: | ||
// Ссылка - СправочникСсылка.__ПользовательскиеФункции - Ссылка пользовательской функции, | ||
// которую требуется выполнить | ||
// Параметры - Структура - Подготовленные параметры для выполнения пользовательской функции | ||
// * Ключ - Строка - Имя параметра | ||
// * Значение - Структура - Тип и значение параметра | ||
// * Ключ - Строка - может быть "Тип", "Значение" | ||
// * Значение - Произвольный | ||
// | ||
// Возвращаемое значение: | ||
// Неопределено, в - случае успешного выполнения, Описание ошибки, в случае неудачи. | ||
// | ||
Функция ВыполнитьПользовательскуюФункциюСПараметрами(Ссылка, Параметры) Экспорт | ||
|
||
Отказ = Ложь; | ||
Результат = Неопределено; | ||
|
||
Запрос = Новый Запрос; | ||
Запрос.Текст = | ||
"ВЫБРАТЬ | ||
| __ПользовательскиеФункции.КодПодпрограммы КАК КодПодпрограммы | ||
|ИЗ | ||
| Справочник.__ПользовательскиеФункции КАК __ПользовательскиеФункции | ||
|ГДЕ | ||
| __ПользовательскиеФункции.Ссылка = &Ссылка | ||
|; | ||
| | ||
|//////////////////////////////////////////////////////////////////////////////// | ||
|ВЫБРАТЬ | ||
| __ПользовательскиеФункцииПараметрыФункции.Наименование КАК Наименование, | ||
| __ПользовательскиеФункцииПараметрыФункции.Тип КАК Тип, | ||
| __ПользовательскиеФункцииПараметрыФункции.Необязательный КАК Необязательный | ||
|ИЗ | ||
| Справочник.__ПользовательскиеФункции.ПараметрыФункции КАК __ПользовательскиеФункцииПараметрыФункции | ||
|ГДЕ | ||
| __ПользовательскиеФункцииПараметрыФункции.Ссылка = &Ссылка | ||
|; | ||
| | ||
|//////////////////////////////////////////////////////////////////////////////// | ||
|ВЫБРАТЬ РАЗЛИЧНЫЕ | ||
| __ПользовательскиеФункцииПеременные.Имя КАК Имя, | ||
| __ПользовательскиеФункцииПеременные.Значение КАК Значение | ||
|ИЗ | ||
| Справочник.__ПользовательскиеФункции.Переменные КАК __ПользовательскиеФункцииПеременные | ||
|ГДЕ | ||
| __ПользовательскиеФункцииПеременные.Ссылка = &Ссылка"; | ||
|
||
Запрос.УстановитьПараметр("Ссылка", Ссылка); | ||
|
||
РезультатыЗапроса = Запрос.ВыполнитьПакет(); | ||
|
||
Выборка = РезультатыЗапроса[0].Выбрать(); | ||
ВыборкаТЧ = РезультатыЗапроса[1].Выбрать(); | ||
ВыборкаПерем = РезультатыЗапроса[2].Выбрать(); | ||
|
||
Выборка.Следующий(); | ||
ТекстФункции = Выборка.КодПодпрограммы; | ||
|
||
Переменные = Новый Структура; | ||
Пока ВыборкаПерем.Следующий() Цикл | ||
Если ПустаяСтрока(ВыборкаПерем.Имя) И Переменные.Свойство(ВыборкаПерем.Имя) Тогда | ||
Продолжить; | ||
КонецЕсли; | ||
Переменные.Вставить(ВыборкаПерем.Имя, ВыборкаПерем.Значение); | ||
КонецЦикла; | ||
|
||
Параметры = ПодставитьПараметрыВФункцию(ТекстФункции, Параметры, ВыборкаТЧ, Отказ); | ||
|
||
Если Отказ Тогда | ||
ВызватьИсключение(НСтр("ru='Ошибки при подстановке параметров!.'")); | ||
КонецЕсли; | ||
|
||
Попытка | ||
Выполнить(ТекстФункции); | ||
Исключение | ||
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); | ||
КонецПопытки; | ||
|
||
Возврат Результат; | ||
|
||
КонецФункции |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Refactor the function ВыполнитьПользовательскуюФункциюСПараметрами
to improve readability and maintainability.
- Функция ВыполнитьПользовательскуюФункциюСПараметрами(Ссылка, Параметры) Экспорт
+ // Executes a user-defined function with provided parameters.
+ // Returns `Неопределено` on success, or an error description on failure.
+ Функция ExecuteUserFunctionWithParameters(Reference, Parameters) Export
Consider renaming variables and comments to English if the team's standard is to use English for code and comments. This enhances the readability for non-Russian speakers and maintains consistency.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
// Выполняет пользовательскую функцию с переданными параметрами. | |
// | |
// Параметры: | |
// Ссылка - СправочникСсылка.__ПользовательскиеФункции - Ссылка пользовательской функции, | |
// которую требуется выполнить | |
// Параметры - Структура - Подготовленные параметры для выполнения пользовательской функции | |
// * Ключ - Строка - Имя параметра | |
// * Значение - Структура - Тип и значение параметра | |
// * Ключ - Строка - может быть "Тип", "Значение" | |
// * Значение - Произвольный | |
// | |
// Возвращаемое значение: | |
// Неопределено, в - случае успешного выполнения, Описание ошибки, в случае неудачи. | |
// | |
Функция ВыполнитьПользовательскуюФункциюСПараметрами(Ссылка, Параметры) Экспорт | |
Отказ = Ложь; | |
Результат = Неопределено; | |
Запрос = Новый Запрос; | |
Запрос.Текст = | |
"ВЫБРАТЬ | |
| __ПользовательскиеФункции.КодПодпрограммы КАК КодПодпрограммы | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции КАК __ПользовательскиеФункции | |
|ГДЕ | |
| __ПользовательскиеФункции.Ссылка = &Ссылка | |
|; | |
| | |
|//////////////////////////////////////////////////////////////////////////////// | |
|ВЫБРАТЬ | |
| __ПользовательскиеФункцииПараметрыФункции.Наименование КАК Наименование, | |
| __ПользовательскиеФункцииПараметрыФункции.Тип КАК Тип, | |
| __ПользовательскиеФункцииПараметрыФункции.Необязательный КАК Необязательный | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции.ПараметрыФункции КАК __ПользовательскиеФункцииПараметрыФункции | |
|ГДЕ | |
| __ПользовательскиеФункцииПараметрыФункции.Ссылка = &Ссылка | |
|; | |
| | |
|//////////////////////////////////////////////////////////////////////////////// | |
|ВЫБРАТЬ РАЗЛИЧНЫЕ | |
| __ПользовательскиеФункцииПеременные.Имя КАК Имя, | |
| __ПользовательскиеФункцииПеременные.Значение КАК Значение | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции.Переменные КАК __ПользовательскиеФункцииПеременные | |
|ГДЕ | |
| __ПользовательскиеФункцииПеременные.Ссылка = &Ссылка"; | |
Запрос.УстановитьПараметр("Ссылка", Ссылка); | |
РезультатыЗапроса = Запрос.ВыполнитьПакет(); | |
Выборка = РезультатыЗапроса[0].Выбрать(); | |
ВыборкаТЧ = РезультатыЗапроса[1].Выбрать(); | |
ВыборкаПерем = РезультатыЗапроса[2].Выбрать(); | |
Выборка.Следующий(); | |
ТекстФункции = Выборка.КодПодпрограммы; | |
Переменные = Новый Структура; | |
Пока ВыборкаПерем.Следующий() Цикл | |
Если ПустаяСтрока(ВыборкаПерем.Имя) И Переменные.Свойство(ВыборкаПерем.Имя) Тогда | |
Продолжить; | |
КонецЕсли; | |
Переменные.Вставить(ВыборкаПерем.Имя, ВыборкаПерем.Значение); | |
КонецЦикла; | |
Параметры = ПодставитьПараметрыВФункцию(ТекстФункции, Параметры, ВыборкаТЧ, Отказ); | |
Если Отказ Тогда | |
ВызватьИсключение(НСтр("ru='Ошибки при подстановке параметров!.'")); | |
КонецЕсли; | |
Попытка | |
Выполнить(ТекстФункции); | |
Исключение | |
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); | |
КонецПопытки; | |
Возврат Результат; | |
КонецФункции | |
// Executes a user-defined function with provided parameters. | |
// Returns `Неопределено` on success, or an error description on failure. | |
Функция ExecuteUserFunctionWithParameters(Reference, Parameters) Export | |
Отказ = Ложь; | |
Результат = Неопределено; | |
Запрос = Новый Запрос; | |
Запрос.Текст = | |
"ВЫБРАТЬ | |
| __ПользовательскиеФункции.КодПодпрограммы КАК КодПодпрограммы | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции КАК __ПользовательскиеФункции | |
|ГДЕ | |
| __ПользовательскиеФункции.Ссылка = &Ссылка | |
|; | |
| | |
|//////////////////////////////////////////////////////////////////////////////// | |
|ВЫБРАТЬ | |
| __ПользовательскиеФункцииПараметрыФункции.Наименование КАК Наименование, | |
| __ПользовательскиеФункцииПараметрыФункции.Тип КАК Тип, | |
| __ПользовательскиеФункцииПараметрыФункции.Необязательный КАК Необязательный | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции.ПараметрыФункции КАК __ПользовательскиеФункцииПараметрыФункции | |
|ГДЕ | |
| __ПользовательскиеФункцииПараметрыФункции.Ссылка = &Ссылка | |
|; | |
| | |
|//////////////////////////////////////////////////////////////////////////////// | |
|ВЫБРАТЬ РАЗЛИЧНЫЕ | |
| __ПользовательскиеФункцииПеременные.Имя КАК Имя, | |
| __ПользовательскиеФункцииПеременные.Значение КАК Значение | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции.Переменные КАК __ПользовательскиеФункцииПеременные | |
|ГДЕ | |
| __ПользовательскиеФункцииПеременные.Ссылка = &Ссылка"; | |
Запрос.УстановитьПараметр("Ссылка", Ссылка); | |
РезультатыЗапроса = Запрос.ВыполнитьПакет(); | |
Выборка = РезультатыЗапроса[0].Выбрать(); | |
ВыборкаТЧ = РезультатыЗапроса[1].Выбрать(); | |
ВыборкаПерем = РезультатыЗапроса[2].Выбрать(); | |
Выборка.Следующий(); | |
ТекстФункции = Выборка.КодПодпрограммы; | |
Переменные = Новый Структура; | |
Пока ВыборкаПерем.Следующий() Цикл | |
Если ПустаяСтрока(ВыборкаПерем.Имя) И Переменные.Свойство(ВыборкаПерем.Имя) Тогда | |
Продолжить; | |
КонецЕсли; | |
Переменные.Вставить(ВыборкаПерем.Имя, ВыборкаПерем.Значение); | |
КонецЦикла; | |
Параметры = ПодставитьПараметрыВФункцию(ТекстФункции, Параметры, ВыборкаТЧ, Отказ); | |
Если Отказ Тогда | |
ВызватьИсключение(НСтр("ru='Ошибки при подстановке параметров!.'")); | |
КонецЕсли; | |
Попытка | |
Выполнить(ТекстФункции); | |
Исключение | |
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); | |
КонецПопытки; | |
Возврат Результат; | |
КонецФункции |
Попытка | ||
Выполнить(ТекстФункции); | ||
Исключение | ||
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); | ||
КонецПопытки; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Handle exceptions more gracefully in ВыполнитьПользовательскуюФункциюСПараметрами
.
- Выполнить(ТекстФункции);
- Исключение
- ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
+ Try
+ Execute(ТекстФункции);
+ Exception
+ Raise Exception CreateErrorMessage(ИнформацияОбОшибке());
Modify the exception handling to use a more descriptive error handling function that logs additional context or details about the failure.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
Попытка | |
Выполнить(ТекстФункции); | |
Исключение | |
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); | |
КонецПопытки; | |
Попытка | |
Try | |
Execute(ТекстФункции); | |
Exception | |
Raise Exception CreateErrorMessage(ИнформацияОбОшибке()); | |
КонецПопытки; |
Функция ПодставитьПараметрыВФункцию(Текст, Параметры, Выборка, Отказ = Ложь) | ||
|
||
Парам = Новый Структура; | ||
Пока Выборка.Следующий() Цикл | ||
Значение = Неопределено; | ||
Если Параметры.Свойство(Выборка.Наименование, Значение) Тогда | ||
ТипПараметра = ?(Значение.Тип = Неопределено, Значение.Тип, Тип(Значение.Тип)); | ||
Если ТипПараметра <> Тип(Выборка.Тип) Тогда | ||
ТекстСообщения = СтрШаблон(НСтр("ru='Тип значения параметра %1 - %2. Допустимый - %3!'"), | ||
Выборка.Наименование, | ||
ТипПараметра, | ||
Выборка.Тип); | ||
__ОбщегоНазначенияСлужебный.СообщитьПользователю(ТекстСообщения, , , , Отказ); | ||
КонецЕсли; | ||
ИначеЕсли Выборка.Необязательный = Ложь Тогда | ||
ТекстСообщения = СтрШаблон(НСтр("ru='Параметр: %1, является обязательным!'"), Выборка.Наименование); | ||
__ОбщегоНазначенияСлужебный.СообщитьПользователю(ТекстСообщения, , , , Отказ); | ||
КонецЕсли; | ||
|
||
Если Отказ Тогда | ||
Продолжить; | ||
КонецЕсли; | ||
|
||
Парам.Вставить(Выборка.Наименование, Значение.Значение); | ||
ЗаменаПодстроки(Текст, Выборка.Наименование); | ||
КонецЦикла; | ||
|
||
Возврат Парам; | ||
|
||
КонецФункции |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Refactor ПодставитьПараметрыВФункцию
to improve error handling and parameter validation.
- Функция ПодставитьПараметрыВФункцию(Текст, Параметры, Выборка, Отказ = Ложь)
+ // Substitutes parameters in the function text with actual values from `Parameters`.
+ // Returns a structure with substituted parameters.
+ Функция SubstituteParametersInFunction(FunctionText, Parameters, ParameterMetadata, IsFailure = False)
Consider renaming the function and its parameters to better reflect their purpose and improve code readability.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
Функция ПодставитьПараметрыВФункцию(Текст, Параметры, Выборка, Отказ = Ложь) | |
Парам = Новый Структура; | |
Пока Выборка.Следующий() Цикл | |
Значение = Неопределено; | |
Если Параметры.Свойство(Выборка.Наименование, Значение) Тогда | |
ТипПараметра = ?(Значение.Тип = Неопределено, Значение.Тип, Тип(Значение.Тип)); | |
Если ТипПараметра <> Тип(Выборка.Тип) Тогда | |
ТекстСообщения = СтрШаблон(НСтр("ru='Тип значения параметра %1 - %2. Допустимый - %3!'"), | |
Выборка.Наименование, | |
ТипПараметра, | |
Выборка.Тип); | |
__ОбщегоНазначенияСлужебный.СообщитьПользователю(ТекстСообщения, , , , Отказ); | |
КонецЕсли; | |
ИначеЕсли Выборка.Необязательный = Ложь Тогда | |
ТекстСообщения = СтрШаблон(НСтр("ru='Параметр: %1, является обязательным!'"), Выборка.Наименование); | |
__ОбщегоНазначенияСлужебный.СообщитьПользователю(ТекстСообщения, , , , Отказ); | |
КонецЕсли; | |
Если Отказ Тогда | |
Продолжить; | |
КонецЕсли; | |
Парам.Вставить(Выборка.Наименование, Значение.Значение); | |
ЗаменаПодстроки(Текст, Выборка.Наименование); | |
КонецЦикла; | |
Возврат Парам; | |
КонецФункции | |
// Substitutes parameters in the function text with actual values from `Parameters`. | |
// Returns a structure with substituted parameters. | |
Функция SubstituteParametersInFunction(FunctionText, Parameters, ParameterMetadata, IsFailure = False) | |
Парам = Новый Структура; | |
Пока Выборка.Следующий() Цикл | |
Значение = Неопределено; | |
Если Параметры.Свойство(Выборка.Наименование, Значение) Тогда | |
ТипПараметра = ?(Значение.Тип = Неопределено, Значение.Тип, Тип(Значение.Тип)); | |
Если ТипПараметра <> Тип(Выборка.Тип) Тогда | |
ТекстСообщения = СтрШаблон(НСтр("ru='Тип значения параметра %1 - %2. Допустимый - %3!'"), | |
Выборка.Наименование, | |
ТипПараметра, | |
Выборка.Тип); | |
__ОбщегоНазначенияСлужебный.СообщитьПользователю(ТекстСообщения, , , , Отказ); | |
КонецЕсли; | |
ИначеЕсли Выборка.Необязательный = Ложь Тогда | |
ТекстСообщения = СтрШаблон(НСтр("ru='Параметр: %1, является обязательным!'"), Выборка.Наименование); | |
__ОбщегоНазначенияСлужебный.СообщитьПользователю(ТекстСообщения, , , , Отказ); | |
КонецЕсли; | |
Если Отказ Тогда | |
Продолжить; | |
КонецЕсли; | |
Парам.Вставить(Выборка.Наименование, Значение.Значение); | |
ЗаменаПодстроки(Текст, Выборка.Наименование); | |
КонецЦикла; | |
Возврат Парам; | |
КонецФункции |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
// Выполняет пользовательскую функцию с переданными параметрами. | ||
// | ||
// Параметры: | ||
// Ссылка - СправочникСсылка.__ПользовательскиеФункции - Ссылка пользовательской функции, | ||
// которую требуется выполнить | ||
// Параметры - Структура - Подготовленные параметры для выполнения пользовательской функции | ||
// * Ключ - Строка - Имя параметра | ||
// * Значение - Структура - Значение параметра | ||
// | ||
// Возвращаемое значение: | ||
// Неопределено, в - случае успешного выполнения, Описание ошибки, в случае неудачи. | ||
// | ||
Функция ВыполнитьПользовательскуюФункциюСПараметрами(Ссылка, Параметры) Экспорт | ||
|
||
Отказ = Ложь; | ||
Результат = Неопределено; | ||
|
||
Запрос = Новый Запрос; | ||
Запрос.Текст = | ||
"ВЫБРАТЬ | ||
| __ПользовательскиеФункции.КодПодпрограммы КАК КодПодпрограммы | ||
|ИЗ | ||
| Справочник.__ПользовательскиеФункции КАК __ПользовательскиеФункции | ||
|ГДЕ | ||
| __ПользовательскиеФункции.Ссылка = &Ссылка | ||
|; | ||
| | ||
|//////////////////////////////////////////////////////////////////////////////// | ||
|ВЫБРАТЬ | ||
| __ПользовательскиеФункцииПараметрыФункции.Наименование КАК Наименование, | ||
| __ПользовательскиеФункцииПараметрыФункции.Тип КАК Тип, | ||
| __ПользовательскиеФункцииПараметрыФункции.Необязательный КАК Необязательный | ||
|ИЗ | ||
| Справочник.__ПользовательскиеФункции.ПараметрыФункции КАК __ПользовательскиеФункцииПараметрыФункции | ||
|ГДЕ | ||
| __ПользовательскиеФункцииПараметрыФункции.Ссылка = &Ссылка | ||
|; | ||
| | ||
|//////////////////////////////////////////////////////////////////////////////// | ||
|ВЫБРАТЬ РАЗЛИЧНЫЕ | ||
| __ПользовательскиеФункцииПеременные.Имя КАК Имя, | ||
| __ПользовательскиеФункцииПеременные.Значение КАК Значение | ||
|ИЗ | ||
| Справочник.__ПользовательскиеФункции.Переменные КАК __ПользовательскиеФункцииПеременные | ||
|ГДЕ | ||
| __ПользовательскиеФункцииПеременные.Ссылка = &Ссылка"; | ||
|
||
Запрос.УстановитьПараметр("Ссылка", Ссылка); | ||
|
||
РезультатыЗапроса = Запрос.ВыполнитьПакет(); | ||
|
||
Выборка = РезультатыЗапроса[0].Выбрать(); | ||
ВыборкаТЧ = РезультатыЗапроса[1].Выбрать(); | ||
ВыборкаПерем = РезультатыЗапроса[2].Выбрать(); | ||
|
||
Выборка.Следующий(); | ||
ТекстФункции = Выборка.КодПодпрограммы; | ||
|
||
Переменные = Новый Структура; | ||
Пока ВыборкаПерем.Следующий() Цикл | ||
Если ПустаяСтрока(ВыборкаПерем.Имя) И Переменные.Свойство(ВыборкаПерем.Имя) Тогда | ||
Продолжить; | ||
КонецЕсли; | ||
Переменные.Вставить(ВыборкаПерем.Имя, ВыборкаПерем.Значение); | ||
КонецЦикла; | ||
|
||
Параметры = ПодставитьПараметрыВФункцию(ТекстФункции, Параметры, ВыборкаТЧ, Отказ); | ||
|
||
Если Отказ Тогда | ||
ВызватьИсключение(НСтр("ru='Ошибки при подстановке параметров!.'")); | ||
КонецЕсли; | ||
|
||
Попытка | ||
Выполнить(ТекстФункции); | ||
Исключение | ||
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); | ||
КонецПопытки; | ||
|
||
Возврат Результат; | ||
|
||
КонецФункции |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Refactor exception handling in ВыполнитьПользовательскуюФункциюСПараметрами
.
- Выполнить(ТекстФункции);
- Исключение
- ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
+ Try
+ Execute(ТекстФункции);
+ Exception
+ Raise Exception CreateErrorMessage(ИнформацияОбОшибке());
Modify the exception handling to use a more descriptive error handling function that logs additional context or details about the failure.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
// Выполняет пользовательскую функцию с переданными параметрами. | |
// | |
// Параметры: | |
// Ссылка - СправочникСсылка.__ПользовательскиеФункции - Ссылка пользовательской функции, | |
// которую требуется выполнить | |
// Параметры - Структура - Подготовленные параметры для выполнения пользовательской функции | |
// * Ключ - Строка - Имя параметра | |
// * Значение - Структура - Значение параметра | |
// | |
// Возвращаемое значение: | |
// Неопределено, в - случае успешного выполнения, Описание ошибки, в случае неудачи. | |
// | |
Функция ВыполнитьПользовательскуюФункциюСПараметрами(Ссылка, Параметры) Экспорт | |
Отказ = Ложь; | |
Результат = Неопределено; | |
Запрос = Новый Запрос; | |
Запрос.Текст = | |
"ВЫБРАТЬ | |
| __ПользовательскиеФункции.КодПодпрограммы КАК КодПодпрограммы | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции КАК __ПользовательскиеФункции | |
|ГДЕ | |
| __ПользовательскиеФункции.Ссылка = &Ссылка | |
|; | |
| | |
|//////////////////////////////////////////////////////////////////////////////// | |
|ВЫБРАТЬ | |
| __ПользовательскиеФункцииПараметрыФункции.Наименование КАК Наименование, | |
| __ПользовательскиеФункцииПараметрыФункции.Тип КАК Тип, | |
| __ПользовательскиеФункцииПараметрыФункции.Необязательный КАК Необязательный | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции.ПараметрыФункции КАК __ПользовательскиеФункцииПараметрыФункции | |
|ГДЕ | |
| __ПользовательскиеФункцииПараметрыФункции.Ссылка = &Ссылка | |
|; | |
| | |
|//////////////////////////////////////////////////////////////////////////////// | |
|ВЫБРАТЬ РАЗЛИЧНЫЕ | |
| __ПользовательскиеФункцииПеременные.Имя КАК Имя, | |
| __ПользовательскиеФункцииПеременные.Значение КАК Значение | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции.Переменные КАК __ПользовательскиеФункцииПеременные | |
|ГДЕ | |
| __ПользовательскиеФункцииПеременные.Ссылка = &Ссылка"; | |
Запрос.УстановитьПараметр("Ссылка", Ссылка); | |
РезультатыЗапроса = Запрос.ВыполнитьПакет(); | |
Выборка = РезультатыЗапроса[0].Выбрать(); | |
ВыборкаТЧ = РезультатыЗапроса[1].Выбрать(); | |
ВыборкаПерем = РезультатыЗапроса[2].Выбрать(); | |
Выборка.Следующий(); | |
ТекстФункции = Выборка.КодПодпрограммы; | |
Переменные = Новый Структура; | |
Пока ВыборкаПерем.Следующий() Цикл | |
Если ПустаяСтрока(ВыборкаПерем.Имя) И Переменные.Свойство(ВыборкаПерем.Имя) Тогда | |
Продолжить; | |
КонецЕсли; | |
Переменные.Вставить(ВыборкаПерем.Имя, ВыборкаПерем.Значение); | |
КонецЦикла; | |
Параметры = ПодставитьПараметрыВФункцию(ТекстФункции, Параметры, ВыборкаТЧ, Отказ); | |
Если Отказ Тогда | |
ВызватьИсключение(НСтр("ru='Ошибки при подстановке параметров!.'")); | |
КонецЕсли; | |
Попытка | |
Выполнить(ТекстФункции); | |
Исключение | |
ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке()); | |
КонецПопытки; | |
Возврат Результат; | |
КонецФункции | |
// Выполняет пользовательскую функцию с переданными параметрами. | |
// | |
// Параметры: | |
// Ссылка - СправочникСсылка.__ПользовательскиеФункции - Ссылка пользовательской функции, | |
// которую требуется выполнить | |
// Параметры - Структура - Подготовленные параметры для выполнения пользовательской функции | |
// * Ключ - Строка - Имя параметра | |
// * Значение - Структура - Значение параметра | |
// | |
// Возвращаемое значение: | |
// Неопределено, в - случае успешного выполнения, Описание ошибки, в случае неудачи. | |
// | |
Функция ВыполнитьПользовательскуюФункциюСПараметрами(Ссылка, Параметры) Экспорт | |
Отказ = Ложь; | |
Результат = Неопределено; | |
Запрос = Новый Запрос; | |
Запрос.Текст = | |
"ВЫБРАТЬ | |
| __ПользовательскиеФункции.КодПодпрограммы КАК КодПодпрограммы | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции КАК __ПользовательскиеФункции | |
|ГДЕ | |
| __ПользовательскиеФункции.Ссылка = &Ссылка | |
|; | |
| | |
|//////////////////////////////////////////////////////////////////////////////// | |
|ВЫБРАТЬ | |
| __ПользовательскиеФункцииПараметрыФункции.Наименование КАК Наименование, | |
| __ПользовательскиеФункцииПараметрыФункции.Тип КАК Тип, | |
| __ПользовательскиеФункцииПараметрыФункции.Необязательный КАК Необязательный | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции.ПараметрыФункции КАК __ПользовательскиеФункцииПараметрыФункции | |
|ГДЕ | |
| __ПользовательскиеФункцииПараметрыФункции.Ссылка = &Ссылка | |
|; | |
| | |
|//////////////////////////////////////////////////////////////////////////////// | |
|ВЫБРАТЬ РАЗЛИЧНЫЕ | |
| __ПользовательскиеФункцииПеременные.Имя КАК Имя, | |
| __ПользовательскиеФункцииПеременные.Значение КАК Значение | |
|ИЗ | |
| Справочник.__ПользовательскиеФункции.Переменные КАК __ПользовательскиеФункцииПеременные | |
|ГДЕ | |
| __ПользовательскиеФункцииПеременные.Ссылка = &Ссылка"; | |
Запрос.УстановитьПараметр("Ссылка", Ссылка); | |
РезультатыЗапроса = Запрос.ВыполнитьПакет(); | |
Выборка = РезультатыЗапроса[0].Выбрать(); | |
ВыборкаТЧ = РезультатыЗапроса[1].Выбрать(); | |
ВыборкаПерем = РезультатыЗапроса[2].Выбрать(); | |
Выборка.Следующий(); | |
ТекстФункции = Выборка.КодПодпрограммы; | |
Переменные = Новый Структура; | |
Пока ВыборкаПерем.Следующий() Цикл | |
Если ПустаяСтрока(ВыборкаПерем.Имя) И Переменные.Свойство(ВыборкаПерем.Имя) Тогда | |
Продолжить; | |
КонецЕсли; | |
Переменные.Вставить(ВыборкаПерем.Имя, ВыборкаПерем.Значение); | |
КонецЦикла; | |
Параметры = ПодставитьПараметрыВФункцию(ТекстФункции, Параметры, ВыборкаТЧ, Отказ); | |
Если Отказ Тогда | |
ВызватьИсключение(НСтр("ru='Ошибки при подстановке параметров!.'")); | |
КонецЕсли; | |
Попытка | |
Try | |
Execute(ТекстФункции); | |
Exception | |
Raise Exception CreateErrorMessage(ИнформацияОбОшибке()); | |
КонецПопытки; | |
Возврат Результат; | |
КонецФункции |
Процедура ЗаменаПодстроки(Текст, Ключ) | ||
|
||
Префикс = "Параметры."; | ||
Позиция = СтрНайти(Текст, Ключ); | ||
Пока Позиция > 0 Цикл | ||
|
||
СимволДо = ?(Позиция = 1, "", Сред(Текст, Позиция - 1, 1)); | ||
КодДо = КодСимвола(НРег(СимволДо)); | ||
|
||
СимволПосле = Сред(Текст, Позиция + СтрДлина(Ключ), 1); | ||
КодПосле = КодСимвола(НРег(СимволПосле)); | ||
|
||
Если ЭтоДопустимыйСимвол(КодДо) И ЭтоДопустимыйСимвол(КодПосле) Тогда | ||
Текст = СтрЗаменить(Текст, СимволДо + Ключ + СимволПосле, СимволДо + Префикс + Ключ + СимволПосле); | ||
КонецЕсли; | ||
|
||
Позиция = СтрНайти(Текст, Ключ, НаправлениеПоиска.СНачала, Позиция + СтрДлина(Префикс) + 1); | ||
|
||
КонецЦикла; | ||
|
||
КонецПроцедуры |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Optimize ЗаменаПодстроки
by improving the loop condition and handling edge cases.
- Пока Позиция > 0 Цикл
+ While Position > 0 And Position < СтрДлина(Текст) Loop
Ensure that the search does not go beyond the string length to avoid potential infinite loops or out-of-bound errors.
Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.
Процедура ЗаменаПодстроки(Текст, Ключ) | |
Префикс = "Параметры."; | |
Позиция = СтрНайти(Текст, Ключ); | |
Пока Позиция > 0 Цикл | |
СимволДо = ?(Позиция = 1, "", Сред(Текст, Позиция - 1, 1)); | |
КодДо = КодСимвола(НРег(СимволДо)); | |
СимволПосле = Сред(Текст, Позиция + СтрДлина(Ключ), 1); | |
КодПосле = КодСимвола(НРег(СимволПосле)); | |
Если ЭтоДопустимыйСимвол(КодДо) И ЭтоДопустимыйСимвол(КодПосле) Тогда | |
Текст = СтрЗаменить(Текст, СимволДо + Ключ + СимволПосле, СимволДо + Префикс + Ключ + СимволПосле); | |
КонецЕсли; | |
Позиция = СтрНайти(Текст, Ключ, НаправлениеПоиска.СНачала, Позиция + СтрДлина(Префикс) + 1); | |
КонецЦикла; | |
КонецПроцедуры | |
Процедура ЗаменаПодстроки(Текст, Ключ) | |
Префикс = "Параметры."; | |
Позиция = СтрНайти(Текст, Ключ); | |
While Position > 0 And Position < СтрДлина(Текст) Loop | |
СимволДо = ?(Позиция = 1, "", Сред(Текст, Позиция - 1, 1)); | |
КодДо = КодСимвола(НРег(СимволДо)); | |
СимволПосле = Сред(Текст, Позиция + СтрДлина(Ключ), 1); | |
КодПосле = КодСимвола(НРег(СимволПосле)); | |
Если ЭтоДопустимыйСимвол(КодДо) И ЭтоДопустимыйСимвол(КодПосле) Тогда | |
Текст = СтрЗаменить(Текст, СимволДо + Ключ + СимволПосле, СимволДо + Префикс + Ключ + СимволПосле); | |
КонецЕсли; | |
Позиция = СтрНайти(Текст, Ключ, НаправлениеПоиска.СНачала, Позиция + СтрДлина(Префикс) + 1); | |
КонецЦикла; | |
КонецПроцедуры |
Summary by CodeRabbit