Skip to content
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

Настройки отбора компоновки данных #50

Merged
merged 11 commits into from
Apr 23, 2024

Conversation

perlusha
Copy link
Contributor

@perlusha perlusha commented Apr 18, 2024

Добавлен справочник настройки отбора объектов для создания и хранения отбора компоновки данных для произвольных объектов конфигурации. Добавлены функции для работы с XML в модуль ОбщегоНазначения

Summary by CodeRabbit

  • New Features

    • Introduced a new system for managing settings related to object selection, enhancing user interaction with metadata objects.
    • Added roles for editing and reading object selection settings, supporting multilingual synonyms.
    • Implemented new functionalities for XML serialization and deserialization to enhance data handling.
  • Documentation

    • Added documentation on retrieving data based on selection settings, facilitating better understanding of the new functionalities.

… отбора компоновки данных для произвольных объектов конфигурации. Добавлены функции для работы с XML в модуль ОбщегоНазначения

This comment has been minimized.

@ivanmolodec ivanmolodec added the new function Новая функциональность label Apr 18, 2024
@ivanmolodec
Copy link
Member

@coderabbitai review in Russian

Copy link

coderabbitai bot commented Apr 19, 2024

@ivanmolodec, спасибо за запрос на рецензию. Я проанализировал изменения в пулл-реквесте, которые касаются добавления новых функций для работы с XML и настройки отбора компоновки данных. Вот мои замечания:

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

  2. Локализация: В коде присутствует поддержка локализации (русский и английский языки), что является хорошей практикой для международных приложений. Убедитесь, что все новые строки и тексты корректно отображаются в обоих языках.

  3. Структура и организация кода: Код хорошо структурирован и разделен на модули, что облегчает его понимание и поддержку. Однако, стоит проверить, нет ли избыточного кода или возможности для его оптимизации.

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

Пожалуйста, учтите эти замечания при дальнейшей работе над проектом. Если у вас есть дополнительные вопросы или нужна дополнительная помощь, не стесняйтесь обращаться.

Analysis chain
Scripts executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Find files related to the new directory for data layout selection settings and XML functions in the general-purpose module.
fd 'ОбщегоНазначения' --exec cat {}
fd 'настройки отбора компоновки данных' --exec cat {}

Length of output: 20308

Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link

coderabbitai bot commented Apr 19, 2024

Walkthrough

This update brings a new catalog for managing object selection settings, complete with associated forms and modules for data manipulation and display. Roles for editing and reading these settings are defined, enhancing security and access management. Additionally, XML serialization functions are added to a common module, and subsystems are updated to include new functionalities.

Changes

File Path Change Summary
src/Catalogs/__НастройкиОтбораОбъектов... Introduces a new catalog for object selection settings, including manager modules and forms for metadata object selection and element forms.
src/Roles/... Adds new roles for editing and reading object selection settings, along with rights management in XML files.
src/CommonModules/__ОбщегоНазначенияСервер/Ext/Module.bsl Adds XML serialization and deserialization functions.
src/Configuration.xml Updates the configuration to include new roles and catalog.
src/Subsystems/__ПользовательскиеФункции.xml Updates subsystems to reference the new catalog.
docs/ПолучениеДанныхПоНастройкеОбора.md Documents the function for retrieving data based on selection settings.

🐇✨
A hop, a skip, a code deploy,
Changes big and small, oh joy!
New settings to select and toy,
In XML, we now employ.
Cheers to data, without alloy!


Recent Review Details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits Files that changed from the base of the PR and between 828dc42 and 6690154.
Files ignored due to path filters (1)
  • docs/images/НастройкиОтбораОбъектов.png is excluded by !**/*.png
Files selected for processing (1)
  • docs/ПолучениеДанныхПоНастройкеОтбора.md (1 hunks)
Additional Context Used
LanguageTool (1)
docs/ПолучениеДанныхПоНастройкеОтбора.md (1)

Near line 5: Добавьте пробел между предложениями.
Context: ...и объекта метаданных (пример - Документ.ПоступлениеТоваровУслуг) и отбор компоновки данных. Пример пол...


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?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger a review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

Comment on lines +2242 to +2249
Функция ЗначениеВСтрокуXML(Значение) Экспорт

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение, НазначениеТипаXML.Явное);

Возврат ЗаписьXML.Закрыть();
КонецФункции
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider adding error handling in ЗначениеВСтрокуXML to manage potential serialization issues.

Comment on lines +2260 to +2266
Функция ЗначениеИзСтрокиXML(СтрокаXML) Экспорт

ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(СтрокаXML);

Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
КонецФункции
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider adding error handling in ЗначениеИзСтрокиXML to manage potential deserialization issues.

Comment on lines 11 to 12
ЭтаФорма.ЗакрыватьПриВыборе = Истина;
ЭтаФорма.ЗакрыватьПриЗакрытииВладельца = Истина;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replace deprecated property usage for better future compatibility.

- ЭтаФорма.ЗакрыватьПриВыборе = Истина;
- ЭтаФорма.ЗакрыватьПриЗакрытииВладельца = Истина;
+ ЭтотОбъект.ЗакрыватьПриВыборе = Истина;
+ ЭтотОбъект.ЗакрыватьПриЗакрытииВладельца = Истина;

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.

Suggested change
ЭтаФорма.ЗакрыватьПриВыборе = Истина;
ЭтаФорма.ЗакрыватьПриЗакрытииВладельца = Истина;
ЭтотОбъект.ЗакрыватьПриВыборе = Истина;
ЭтотОбъект.ЗакрыватьПриЗакрытииВладельца = Истина;

Comment on lines 24 to 292
ПодчиненныеСтроки = СтрокаРС.ПолучитьЭлементы();

Для Каждого РС Из МетаданныеРС Цикл
НоваяСтрока = ПодчиненныеСтроки.Добавить();
НоваяСтрока.Поле = РС.Синоним;
НоваяСтрока.ИдентификаторПоля = РС.Имя;
НоваяСтрока.ТипЗначения = "РегистрСведений";
КонецЦикла;
КонецЕсли;

Если СписокТипов.НайтиПоЗначению("РегистрыНакопления") <> Неопределено Тогда
//Выводим Регистры накопления
МетаданныеРН = Метаданные.РегистрыНакопления;
СтрокаРН = СтрокиДерева.Добавить();
СтрокаРН.Поле = "Регистры накопления";
СтрокаРН.ТипЗначения = "РегистрНакопления";
СтрокаРН.Служебное = Истина;

ПодчиненныеСтроки = СтрокаРН.ПолучитьЭлементы();

Для Каждого РН Из МетаданныеРН Цикл
НоваяСтрока = ПодчиненныеСтроки.Добавить();
НоваяСтрока.Поле = РН.Синоним;
НоваяСтрока.ИдентификаторПоля = РН.Имя;
НоваяСтрока.ТипЗначения = "РегистрНакопления";
КонецЦикла;
КонецЕсли;

Если СписокТипов.НайтиПоЗначению("РегистрыБухгалтерии") <> Неопределено Тогда
//Выводим Регистры бухгалтерии
МетаданныеРБ = Метаданные.РегистрыБухгалтерии;
СтрокаРБ = СтрокиДерева.Добавить();
СтрокаРБ.Поле = "Регистры бухгалтерии";
СтрокаРБ.ТипЗначения = "РегистрБухгалтерии";
СтрокаРБ.Служебное = Истина;

ПодчиненныеСтроки = СтрокаРБ.ПолучитьЭлементы();

Для Каждого РБ Из МетаданныеРБ Цикл
НоваяСтрока = ПодчиненныеСтроки.Добавить();
НоваяСтрока.Поле = РБ.Синоним;
НоваяСтрока.ИдентификаторПоля = РБ.Имя;
НоваяСтрока.ТипЗначения = "РегистрБухгалтерии";
КонецЦикла;
КонецЕсли;

Если СписокТипов.НайтиПоЗначению("РегистрыРасчета") <> Неопределено Тогда
//Выводим Регистры расчета
МетаданныеРР = Метаданные.РегистрыРасчета;
СтрокаРР = СтрокиДерева.Добавить();
СтрокаРР.Поле = "Регистры расчета";
СтрокаРР.ТипЗначения = "РегистрРасчета";
СтрокаРР.Служебное = Истина;

ПодчиненныеСтроки = СтрокаРР.ПолучитьЭлементы();

Для Каждого РР Из МетаданныеРР Цикл
НоваяСтрока = ПодчиненныеСтроки.Добавить();
НоваяСтрока.Поле = РР.Синоним;
НоваяСтрока.ИдентификаторПоля = РР.Имя;
НоваяСтрока.ТипЗначения = "РегистрРасчета";
КонецЦикла;
КонецЕсли;

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

ПодчиненныеСтроки = СтрокаБП.ПолучитьЭлементы();

Для Каждого БП Из МетаданныеБП Цикл
НоваяСтрока = ПодчиненныеСтроки.Добавить();
НоваяСтрока.Поле = БП.Синоним;
НоваяСтрока.ИдентификаторПоля = БП.Имя;
НоваяСтрока.ТипЗначения = "БизнесПроцесс";
КонецЦикла;
КонецЕсли;

Если СписокТипов.НайтиПоЗначению("Задачи") <> Неопределено Тогда
//Выводим Задачи
МетаданныеЗадачи = Метаданные.Задачи;
СтрокаЗадачи = СтрокиДерева.Добавить();
СтрокаЗадачи.Поле = "Задачи";
СтрокаЗадачи.ТипЗначения = "Задача";
СтрокаЗадачи.Служебное = Истина;

ПодчиненныеСтроки = СтрокаЗадачи.ПолучитьЭлементы();

Для Каждого Задача Из МетаданныеЗадачи Цикл
НоваяСтрока = ПодчиненныеСтроки.Добавить();
НоваяСтрока.Поле = Задача.Синоним;
НоваяСтрока.ИдентификаторПоля = Задача.Имя;
НоваяСтрока.ТипЗначения = "Задача";
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reduce the cognitive complexity and length of the ВывестиОбъекты procedure.

The procedure ВывестиОбъекты is quite lengthy and complex. Consider breaking it down into smaller, more manageable functions. Each block handling a specific type (e.g., "Справочники", "Документы") could be refactored into its own function to improve readability and maintainability.

Comment on lines 96 to 102
//РеквизитУниверсальныйОтчет = Отчет.Реквизиты.Найти("УниверсальныйОтчет");
//Если РеквизитУниверсальныйОтчет <> Неопределено Тогда
НоваяСтрока = ПодчиненныеСтроки.Добавить();
НоваяСтрока.Поле = Отчет.Синоним;
НоваяСтрока.ИдентификаторПоля = Отчет.Имя;
НоваяСтрока.ТипЗначения = "Отчет";
//КонецЕсли;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove commented-out code blocks to clean up the codebase.

- //РеквизитУниверсальныйОтчет = Отчет.Реквизиты.Найти("УниверсальныйОтчет");
- //Если РеквизитУниверсальныйОтчет <> Неопределено Тогда
- //КонецЕсли;

Commented code should be removed unless it is intended to be used in the near future. It can cause confusion and clutter in the codebase.


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.

Suggested change
//РеквизитУниверсальныйОтчет = Отчет.Реквизиты.Найти("УниверсальныйОтчет");
//Если РеквизитУниверсальныйОтчет <> Неопределено Тогда
НоваяСтрока = ПодчиненныеСтроки.Добавить();
НоваяСтрока.Поле = Отчет.Синоним;
НоваяСтрока.ИдентификаторПоля = Отчет.Имя;
НоваяСтрока.ТипЗначения = "Отчет";
//КонецЕсли;
НоваяСтрока = ПодчиненныеСтроки.Добавить();
НоваяСтрока.Поле = Отчет.Синоним;
НоваяСтрока.ИдентификаторПоля = Отчет.Имя;
НоваяСтрока.ТипЗначения = "Отчет";

Comment on lines 124 to 129
//Если СписокТипов.НайтиПоЗначению("ВнешниеОбработки") <> Неопределено Тогда
// //Выводим Внешние обработки
// НоваяСтрока = СтрокиДерева.Добавить();
// НоваяСтрока.Поле = "Внешняя обработка";
// НоваяСтрока.ТипЗначения = "ВнешняяОбработка";
//КонецЕсли;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove commented-out code blocks to clean up the codebase.

- //Если СписокТипов.НайтиПоЗначению("ВнешниеОбработки") <> Неопределено Тогда
- //	//Выводим Внешние обработки
- //	НоваяСтрока = СтрокиДерева.Добавить();
- //	НоваяСтрока.Поле = "Внешняя обработка";
- //	НоваяСтрока.ТипЗначения = "ВнешняяОбработка";
- //КонецЕсли;

Commented code should be removed unless it is intended to be used in the near future. It can cause confusion and clutter in the codebase.


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.

Suggested change
//Если СписокТипов.НайтиПоЗначению("ВнешниеОбработки") <> Неопределено Тогда
// //Выводим Внешние обработки
// НоваяСтрока = СтрокиДерева.Добавить();
// НоваяСтрока.Поле = "Внешняя обработка";
// НоваяСтрока.ТипЗначения = "ВнешняяОбработка";
//КонецЕсли;

Comment on lines 318 to 322
//ДеревоСортировки.Строки.Сортировать("Поле Возр");
//
//Для Каждого СтрокаДерева Из ДеревоСортировки.Строки Цикл
// СортироватьДерево(СтрокаДерева);
//КонецЦикла;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove commented-out code blocks to clean up the codebase.

- //ДеревоСортировки.Строки.Сортировать("Поле Возр");
- //
- //Для Каждого СтрокаДерева Из ДеревоСортировки.Строки Цикл
- //	СортироватьДерево(СтрокаДерева);
- //КонецЦикла;

Commented code should be removed unless it is intended to be used in the near future. It can cause confusion and clutter in the codebase.


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.

Suggested change
//ДеревоСортировки.Строки.Сортировать("Поле Возр");
//
//Для Каждого СтрокаДерева Из ДеревоСортировки.Строки Цикл
// СортироватьДерево(СтрокаДерева);
//КонецЦикла;

Copy link
Member

@ivanmolodec ivanmolodec left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправить ошибки синтаксис чека и дымового теста

This comment has been minimized.

This comment has been minimized.

Copy link

@coderabbitai coderabbitai bot left a 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

Comment on lines 12 to 13
<v8:lang>en</v8:lang>
<v8:content>Editing user-defined functions</v8:content>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The English translation seems incorrect as it mentions "Editing user-defined functions" which does not align with the Russian version. Please correct it to match the intended functionality.

Comment on lines 12 to 13
<v8:lang>en</v8:lang>
<v8:content>Editing user-defined functions</v8:content>
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The English translation seems incorrect as it mentions "Editing user-defined functions" which does not align with the Russian version. Please correct it to match the intended functionality.

This comment has been minimized.

This comment has been minimized.

Copy link

@coderabbitai coderabbitai bot left a 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

Comment on lines 6 to 26
//Процедура заполняет компоновщик настроек для выбранного объекта метаданных
Процедура ИнициализироватьКомпоновщик(КомпоновщикНастроек, ОбъектМетаданных, ДополнительнаяСтрока = "") Экспорт

ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ " + ОбъектМетаданных + " " + ДополнительнаяСтрока;

СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
ИсточникДанных.Имя = "ИсточникДанных1";
ИсточникДанных.ТипИсточникаДанных = "Local";

НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
НаборДанных.Имя = "НаборДанных1";
НаборДанных.ИсточникДанных = ИсточникДанных.Имя;
НаборДанных.Запрос = ТекстЗапроса;

АдресКомпоновки = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Новый УникальныйИдентификатор);
КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресКомпоновки));
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

КонецПроцедуры
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sanitize input parameters to prevent SQL injection.

Consider sanitizing the input parameters ОбъектМетаданных and ДополнительнаяСтрока to ensure that the dynamically constructed data query string is safe from SQL injection vulnerabilities.

Comment on lines 4 to 22
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТекущийОбъект = Параметры.ТекущийОбъект;
ТипТекущегоОбъекта = Параметры.ТипТекущегоОбъекта;

ВидОперации = Параметры.ВидОперации;
СписокКоллекций = Параметры.СписокКоллекций;
ВыводитьТЧОбъектов = Параметры.ВыводитьТЧОбъектов;

ЗакрыватьПриВыборе = Истина;
ЗакрыватьПриЗакрытииВладельца = Истина;

Если ВидОперации = "ВыборОбъекта" Тогда
ВывестиОбъекты();
ИначеЕсли ВидОперации = "ВыборКартинки" Тогда
ВывестиКартинки();
КонецЕсли;

КонецПроцедуры
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add an 'else' branch to handle unexpected operation types.

The conditional logic in the function ПриСозданииНаСервере lacks an 'else' branch. Consider adding one to handle unexpected operation types and ensure that all cases are covered.

This comment has been minimized.

This comment has been minimized.

This comment has been minimized.

Copy link

@coderabbitai coderabbitai bot left a 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

Comment on lines +11 to +15
МодульОбщегоНазначения = __ОбщегоНазначенияСервер.ОбщийМодуль("ОбщегоНазначения", "__ОбщегоНазначенияСервер");
ОтборКомпоновки = МодульОбщегоНазначения.ЗначениеИзСтрокиXML(Объект.Отбор);
Компоновщик.Настройки.Отбор.Элементы.Очистить();
Справочники.__НастройкиОтбораОбъектов.СкопироватьЭлементыОтбора(Компоновщик.Настройки.Отбор, ОтборКомпоновки);

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ensure the XML string handling in ЗначениеИзСтрокиXML is secure against XML injection attacks.

- ОтборКомпоновки = МодульОбщегоНазначения.ЗначениеИзСтрокиXML(Объект.Отбор);
+ ОтборКомпоновки = МодульОбщегоНазначения.ЗащищенноеЗначениеИзСтрокиXML(Объект.Отбор);

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.

Suggested change
МодульОбщегоНазначения = __ОбщегоНазначенияСервер.ОбщийМодуль("ОбщегоНазначения", "__ОбщегоНазначенияСервер");
ОтборКомпоновки = МодульОбщегоНазначения.ЗначениеИзСтрокиXML(Объект.Отбор);
Компоновщик.Настройки.Отбор.Элементы.Очистить();
Справочники.__НастройкиОтбораОбъектов.СкопироватьЭлементыОтбора(Компоновщик.Настройки.Отбор, ОтборКомпоновки);
МодульОбщегоНазначения = __ОбщегоНазначенияСервер.ОбщийМодуль("ОбщегоНазначения", "__ОбщегоНазначенияСервер");
ОтборКомпоновки = МодульОбщегоНазначения.ЗащищенноеЗначениеИзСтрокиXML(Объект.Отбор);
Компоновщик.Настройки.Отбор.Элементы.Очистить();
Справочники.__НастройкиОтбораОбъектов.СкопироватьЭлементыОтбора(Компоновщик.Настройки.Отбор, ОтборКомпоновки);


ПараметрыФормы.Вставить("СписокКоллекций", СписокКоллекций);

ОткрытьФорму("Справочник.__НастройкиОтбораОбъектов.Форма.ФормаВыбораОбъектаМетаданных", ПараметрыФормы, Элементы.ОбъектМетаданных);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The line length exceeds the maximum allowed limit of 120 characters. Consider breaking the line for better 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.

Suggested change
ОткрытьФорму("Справочник.__НастройкиОтбораОбъектов.Форма.ФормаВыбораОбъектаМетаданных", ПараметрыФормы, Элементы.ОбъектМетаданных);
ОткрытьФорму(
"Справочник.__НастройкиОтбораОбъектов.Форма.ФормаВыбораОбъектаМетаданных",
ПараметрыФормы,
Элементы.ОбъектМетаданных
);

ВывестиОбъекты();
ИначеЕсли ВидОперации = "ВыборКартинки" Тогда
ВывестиКартинки();
КонецЕсли;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Если...Тогда...ИначеЕсли... construct should include an Иначе branch to handle unexpected ВидОперации values.

- КонецЕсли;
+ Иначе
+   СообщитьПользователю("Неизвестный тип операции: " + ВидОперации);
+ КонецЕсли;

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.

Suggested change
КонецЕсли;
Иначе
СообщитьПользователю("Неизвестный тип операции: " + ВидОперации);
КонецЕсли;

Comment on lines +14 to +16
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ " + ОбъектМетаданных;

Copy link

@coderabbitai coderabbitai bot Apr 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The query text should be constructed safely to prevent SQL injection. Use parameterized queries or query builders.

- ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ " + ОбъектМетаданных;
+ ТекстЗапроса = СтроковыйКонструкторЗапроса("ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ ", ОбъектМетаданных);

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.

Suggested change
ТекстЗапроса =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ " + ОбъектМетаданных;
ТекстЗапроса = СтроковыйКонструкторЗапроса("ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ ", ОбъектМетаданных);

Copy link
Contributor Author

@perlusha perlusha Apr 23, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, i'm not familiar with this function СтроковыйКонструкторЗапроса, are you sure it exists?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I apologize for the confusion, СтроковыйКонструкторЗапроса is not a standard function in BSL. It seems I made an error in suggesting it. In BSL, to safely construct SQL queries and prevent SQL injection, you should use parameterized queries or the query builder provided by the platform.

Here's an example of how you can modify the query construction to use parameterized queries:

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ &ОбъектМетаданных";
Запрос.УстановитьПараметр("ОбъектМетаданных", ОбъектМетаданных);
ТекстЗапроса = Запрос.Текст;

This method uses the Запрос object to set up a query with parameters, which helps in preventing SQL injection by separating the data (parameter values) from the code (SQL query). Please let me know if you need further assistance with this!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So sorry, but it doesn't work like that, the name of the table can't be a parameter.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@perlusha, you are absolutely right; the table name cannot be parameterized in SQL queries, which is a common limitation. To ensure the safety of dynamically constructed SQL queries where the table name is variable, you can implement a validation step against a predefined list of allowed table names. Here's how you could modify the procedure to include this safety check:

// Предполагаем, что у нас есть функция, которая возвращает разрешенные имена таблиц
Функция ПолучитьРазрешенныеИменаТаблиц() Экспорт
    Возврат Новый Массив Из {"Документ.ПоступлениеТоваровУслуг", "Документ.ВыпискаБанка"}; // Пример
КонецФункции

Процедура ИнициализироватьКомпоновщик(КомпоновщикНастроек, Знач ОбъектМетаданных) Экспорт
    Если Не ПолучитьРазрешенныеИменаТаблиц().Содержит(ОбъектМетаданных) Тогда
        ВызватьИсключение "Недопустимое имя объекта метаданных";
    КонецЕсли;
    
    ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ " + ОбъектМетаданных;
КонецПроцедуры

This approach checks if the metadata object name is in the list of allowed names before constructing the query. It helps prevent SQL injection by ensuring that only valid, expected table names are used in the query. Please let me know if this solution works for you or if you need further modifications!

This comment has been minimized.

…учения таблицы значений по заданной настройке отбора на сервере.

This comment has been minimized.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Out of diff range and nitpick comments (1)
docs/ПолучениеДанныхПоНастройкеОтбора.md (1)

15-21: Ensure proper error handling in the function ПолучитьДанные.

While the function is simple, adding error handling could prevent runtime exceptions from unhandled errors, especially when interacting with external systems or databases.

@@ -0,0 +1,23 @@
# Подсистема ПользовательскиеФункции
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вроде подсистема не так называется) И ещё ты забыл ссылку в readme добавить. И добавь, пожалуйста, скриншот как выглядит сам элемент справочника

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Подсистема та, забыл название справочника приписать. Для картинок, наверное, лучше отдельную папку в docs сделать?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Подсистема та, забыл название справочника приписать. Для картинок, наверное, лучше отдельную папку в docs сделать?

А, я понял, ты же отнес этот объект к подсистеме пользовательских функций. Тогда надо как-то отдельно указать что это не именно пользовательские функции, а составляющая часть
Для картинок да, можно создать папку docs/img

…оздал подпапку в docs для хранения картинок, добавил туда скриншот с примером элемента справочника.
Copy link

Passed

Analysis Details

6 Issues

  • Bug 0 Bugs
  • Vulnerability 0 Vulnerabilities
  • Code Smell 6 Code Smells

Coverage and Duplications

  • Coverage No coverage information (0.00% Estimated after merge)
  • Duplications 0.00% Duplicated Code (0.90% Estimated after merge)

Project ID: PSSL

View in SonarQube

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Out of diff range and nitpick comments (3)
docs/ПолучениеДанныхПоНастройкеОтбора.md (3)

5-5: Add a space between sentences for better readability.


27-27: Ensure fenced code blocks are surrounded by blank lines for proper Markdown formatting.


1-1: Clarify that the "ПользовательскиеФункции" subsystem includes the "Настройки отбора объектов" as a component, not as standalone user functions, to avoid confusion.

@ivanmolodec ivanmolodec merged commit 6c2833f into develop Apr 23, 2024
4 checks passed
@ivanmolodec ivanmolodec deleted the objects_filter branch April 23, 2024 11:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
new function Новая функциональность
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Добавить справочник с настройками отборов
3 participants