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

Feature/predefined id unique check 92 #118

Merged
merged 14 commits into from
Oct 18, 2024
24 changes: 19 additions & 5 deletions docs/ПредопределенныеЗначения.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,21 @@
## Описание подсистемы

По стандартам разработки поиск ссылочных объектов в программном коде по наименованию, коду, гуиду и т.д. не рекомендуется. Для возможности получения ссылок из программного кода предлагается использовать элементы плана видов характеристик. Чтобы избежать необходимости реструктуризации при добавлении новых элементов в ПВХ, формирование иерархии и элементов делается программно и обновляется в пользовательском режиме. Получение элементов стандартизируется через общий модуль с возможностью кэширования.
При коментировании или удалении из кода предопределенных элементов и последующем перезаполнении, элемент будет помечен на удаление, включая все его подчиненные элементы.
При коментировании или удалении из кода предопределенных элементов и последующем перезаполнении, элемент будет помечен на удаление, включая все его подчиненные элементы.

## Первоначальное заполнение

Для того чтобы автоматизировать процесс первоначального заполнения предопределенных элементов, необходимо модифицировать/добавить в расширение общий модуль **ПодсистемыКонфигурацииПереопределяемый**.
В процедуре ``ПриДобавленииПодсистем`` прописать вызов процедуры библиотеки ``пбп_ОбновлениеИнформационнойБазыПБП.ПриДобавленииПодсистем``. Затем выполнить первый запуск - будет выполнен обработчик первоначального заполнения предопределенных элементов.

```BSL
&После("ПриДобавленииПодсистем")
Процедура пбп_ПриДобавленииПодсистем(МодулиПодсистем)

пбп_ОбновлениеИнформационнойБазыПБП.ПриДобавленииПодсистем(МодулиПодсистем);

КонецПроцедуры
```

## Добавление новых элементов

Expand All @@ -14,7 +28,7 @@

Пример добавления нового элемента в модуле пбп_ПредопределенныеЗначенияПереопределяемый:

```1C (BSL)
```BSL
Функция ПредопределенныеЗначения() Экспорт

Результат = ТаблицаПредопределенных();
Expand All @@ -36,7 +50,7 @@

Пример добавления новой группы в модуле пбп_ПредопределенныеЗначенияПереопределяемый:

```1C (BSL)
```BSL
Функция ПредопределенныеЗначения() Экспорт

Результат = ТаблицаПредопределенных();
Expand Down Expand Up @@ -84,7 +98,7 @@

Пример получения множественного результата:

```1C (BSL)
```BSL
Функция ПолучитьДанныеАвторизации()

ДанныеАвторизации = Новый Структура("Логин, Пароль");
Expand All @@ -103,7 +117,7 @@

Пример получения единичного результата:

```1C (BSL)
```BSL
Функция ЗаписыватьДанныеСтандартнымСпособом(ПроверяемаяДата)

Результат = пбп_ОбщегоНазначенияСервер.ПолучитьПредопределенноеЗначение("ДатаНачалаЗаписиВРегистры", Истина);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,20 @@
КонецЕсли;
КонецЕсли;

ДополнительныеСвойства.Вставить("ЭтоНовый", ЭтоНовый());

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

Процедура ПриЗаписи(Отказ)

Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

Если Не пбп_ОбщегоНазначенияСлужебныйКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, "ЭтоНовый", Ложь) Тогда
пбп_ОбщегоНазначенияСервер.ОбработатьСуществующийПредопределенныйЭлемент(ЭтотОбъект);
КонецЕсли;

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

#КонецОбласти // ОбработчикиСобытий
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
</Button>
</ChildItems>
</AutoCommandBar>
<Events>
<Event name="NotificationProcessing">ОбработкаОповещения</Event>
</Events>
<ChildItems>
<UsualGroup name="СписокКомпоновщикНастроекПользовательскиеНастройки" id="1">
<Title>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,23 @@

#Область ОбработчикиСобытийФормы

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если ИмяСобытия = "ОбновитьСписокПредопределенных" Тогда
Элементы.Список.Обновить();
КонецЕсли;
Comment on lines +26 to +28
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Consider adding error handling for the list update

While updating the list with Элементы.Список.Обновить();, it's advisable to include error handling to manage potential exceptions that may occur during the update process. This ensures robustness and improves user experience in case of unexpected issues.

Apply this diff to add basic error handling:

Если ИмяСобытия = "ОбновитьСписокПредопределенных" Тогда
+   Попытка
        Элементы.Список.Обновить();
+   Исключение
+       // Обработка ошибки обновления списка
+       Предупреждение("Ошибка обновления списка предопределенных значений.");
+   КонецПопытки;
КонецЕсли;
📝 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. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Если ИмяСобытия = "ОбновитьСписокПредопределенных" Тогда
Элементы.Список.Обновить();
КонецЕсли;
Если ИмяСобытия = "ОбновитьСписокПредопределенных" Тогда
Попытка
Элементы.Список.Обновить();
Исключение
// Обработка ошибки обновления списка
Предупреждение("Ошибка обновления списка предопределенных значений.");
КонецПопытки;
КонецЕсли;


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

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаСервереБезКонтекста
Процедура ЗаполнитьПредопределенныеНаСервере()
пбп_ПредопределенныеЗначения.ИнициализироватьПредопределенныеЗначения(Справочники.пбп_ИнтеграционныеПотоки);
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПредопределенные(Команда)

ЗаполнитьПредопределенныеНаСервере();
пбп_ПредопределенныеЗначенияКлиент.СоздатьОбновитьПредопределенныеЗначения(ЭтотОбъект);

Элементы.Список.Обновить();

Comment on lines +39 to 42
Copy link

Choose a reason for hiding this comment

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

💡 Codebase verification

Incomplete refactoring detected: Old server-side method still referenced.

The method ЗаполнитьПредопределенныеНаСервере is still present in Module.bsl, indicating that the refactoring to client-side processing may be incomplete. Additionally, there are multiple implementations of СоздатьОбновитьПредопределенныеЗначения, which could lead to maintenance challenges.

  • Ensure that all references to ЗаполнитьПредопределенныеНаСервере are removed or appropriately replaced.
  • Review the implementations of СоздатьОбновитьПредопределенныеЗначения to consolidate and prevent redundancy.
🔗 Analysis chain

Verify the completeness and security of the client-side implementation.

The change from server-side to client-side processing of predefined values is a significant alteration. While this can improve performance by reducing server calls, it's crucial to ensure that all scenarios are properly handled and that there are no security implications.

Please address the following points:

  1. Confirm that пбп_ПредопределенныеЗначенияКлиент.СоздатьОбновитьПредопределенныеЗначения(ЭтотОбъект) covers all use cases previously handled by ЗаполнитьПредопределенныеНаСервере().
  2. Verify that moving this logic to the client side doesn't introduce any security vulnerabilities.
  3. Ensure that any side effects or additional logic that might have been present in the server-side method are accounted for in the new implementation.
  4. Consider adding error handling to manage potential failures during the client-side operation.

To assist in verifying the changes, you can run the following script to check for any remaining references to the old server-side method and to locate the implementation of the new client-side method:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for references to old method and locate new method implementation

# Search for any remaining references to ЗаполнитьПредопределенныеНаСервере
echo "Checking for references to ЗаполнитьПредопределенныеНаСервере:"
rg --type bsl "ЗаполнитьПредопределенныеНаСервере"

# Locate the implementation of СоздатьОбновитьПредопределенныеЗначения
echo "Locating implementation of СоздатьОбновитьПредопределенныеЗначения:"
rg --type bsl "Процедура СоздатьОбновитьПредопределенныеЗначения"

Length of output: 695


Script:

#!/bin/bash
# Description: Check for references to ЗаполнитьПредопределенныеНаСервере and locate implementation of СоздатьОбновитьПредопределенныеЗначения in .bsl files

# Search for any remaining references to ЗаполнитьПредопределенныеНаСервере in .bsl files
echo "Checking for references to ЗаполнитьПредопределенныеНаСервере in .bsl files:"
rg --glob '*.bsl' "ЗаполнитьПредопределенныеНаСервере"

# Locate the implementation of СоздатьОбновитьПредопределенныеЗначения in .bsl files
echo "Locating implementation of СоздатьОбновитьПредопределенныеЗначения in .bsl files:"
rg --glob '*.bsl' "Процедура СоздатьОбновитьПредопределенныеЗначения"

Length of output: 1138

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий

Процедура ПередЗаписью(Отказ)

Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

ДополнительныеСвойства.Вставить("ЭтоНовый", ЭтоНовый());

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

Процедура ПриЗаписи(Отказ)

Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

Если Не пбп_ОбщегоНазначенияСлужебныйКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, "ЭтоНовый", Ложь) Тогда
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Suggestion: Use 'СуществуетСвойство' method for clarity

For better readability and to directly check the existence of the "ЭтоНовый" property, consider using the СуществуетСвойство method of the ДополнительныеСвойства structure:

Если Не ДополнительныеСвойства.СуществуетСвойство("ЭтоНовый") Тогда

This makes the code more intuitive and eliminates the need for the external utility function.

Apply this diff to implement the suggestion:

-	Если Не пбп_ОбщегоНазначенияСлужебныйКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, "ЭтоНовый", Ложь) Тогда
+	Если Не ДополнительныеСвойства.СуществуетСвойство("ЭтоНовый") Тогда

пбп_ОбщегоНазначенияСервер.ОбработатьСуществующийПредопределенныйЭлемент(ЭтотОбъект);
КонецЕсли;

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

#КонецОбласти

#КонецЕсли
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
</Button>
</ChildItems>
</AutoCommandBar>
<Events>
<Event name="NotificationProcessing">ОбработкаОповещения</Event>
</Events>
<ChildItems>
<UsualGroup name="СписокКомпоновщикНастроекПользовательскиеНастройки" id="1">
<Title>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,23 @@

#Область ОбработчикиСобытийФормы

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если ИмяСобытия = "ОбновитьСписокПредопределенных" Тогда
Элементы.Список.Обновить();
КонецЕсли;

КонецПроцедуры
Comment on lines +24 to +30
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Use constants for event names to improve maintainability

In the procedure ОбработкаОповещения, the event name "ОбновитьСписокПредопределенных" is hard-coded as a string literal. To enhance code maintainability and reduce the risk of typos, consider defining a constant for the event name.

You can define the event name as a constant at the module level:

Перем ИмяСобытияОбновитьСписокПредопределенных;

&НаКлиенте
Процедура ПриОткрытии()
    ИмяСобытияОбновитьСписокПредопределенных = "ОбновитьСписокПредопределенных";
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = ИмяСобытияОбновитьСписокПредопределенных Тогда
        Элементы.Список.Обновить();
    КонецЕсли;
КонецПроцедуры

This approach improves readability and makes it easier to manage event names throughout the codebase.


#КонецОбласти

#Область ОбработчикиКомандФормы

&НаСервереБезКонтекста
Процедура ЗаполнитьПредопределенныеНаСервере()
пбп_ПредопределенныеЗначения.ИнициализироватьПредопределенныеЗначения(Справочники.пбп_ИнтегрируемыеСистемы);
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПредопределенные(Команда)

ЗаполнитьПредопределенныеНаСервере();
пбп_ПредопределенныеЗначенияКлиент.СоздатьОбновитьПредопределенныеЗначения(ЭтотОбъект);

Элементы.Список.Обновить();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,20 @@
ИмяОбъекта = Неопределено;
КонецЕсли;

ДополнительныеСвойства.Вставить("ЭтоНовый", ЭтоНовый());

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

Процедура ПриЗаписи(Отказ)

Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

Если Не пбп_ОбщегоНазначенияСлужебныйКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, "ЭтоНовый", Ложь) Тогда
пбп_ОбщегоНазначенияСервер.ОбработатьСуществующийПредопределенныйЭлемент(ЭтотОбъект);
КонецЕсли;

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

#КонецОбласти // ОбработчикиСобытий
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
</Button>
</ChildItems>
</AutoCommandBar>
<Events>
<Event name="NotificationProcessing">ОбработкаОповещения</Event>
</Events>
<ChildItems>
<UsualGroup name="СписокКомпоновщикНастроекПользовательскиеНастройки" id="1">
<Title>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,23 @@

#Область ОбработчикиСобытийФормы

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если ИмяСобытия = "ОбновитьСписокПредопределенных" Тогда
Элементы.Список.Обновить();
КонецЕсли;

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

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаСервереБезКонтекста
Процедура ЗаполнитьПредопределенныеНаСервере()
пбп_ПредопределенныеЗначения.ИнициализироватьПредопределенныеЗначения(Справочники.пбп_НастройкиИнтеграции);
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПредопределенные(Команда)

ЗаполнитьПредопределенныеНаСервере();
пбп_ПредопределенныеЗначенияКлиент.СоздатьОбновитьПредопределенныеЗначения(ЭтотОбъект);

Элементы.Список.Обновить();

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий

Процедура ПередЗаписью(Отказ)

Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

ДополнительныеСвойства.Вставить("ЭтоНовый", ЭтоНовый());

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

Процедура ПриЗаписи(Отказ)

Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

Если Не пбп_ОбщегоНазначенияСлужебныйКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, "ЭтоНовый", Ложь) Тогда
пбп_ОбщегоНазначенияСервер.ОбработатьСуществующийПредопределенныйЭлемент(ЭтотОбъект);
КонецЕсли;

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

#КонецОбласти

#КонецЕсли
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
</Button>
</ChildItems>
</AutoCommandBar>
<Events>
<Event name="NotificationProcessing">ОбработкаОповещения</Event>
</Events>
<ChildItems>
<UsualGroup name="СписокКомпоновщикНастроекПользовательскиеНастройки" id="1">
<Title>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,23 @@

#Область ОбработчикиСобытийФормы

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если ИмяСобытия = "ОбновитьСписокПредопределенных" Тогда
Элементы.Список.Обновить();
КонецЕсли;

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

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаСервереБезКонтекста
Процедура ЗаполнитьПредопределенныеНаСервере()
пбп_ПредопределенныеЗначения.ИнициализироватьПредопределенныеЗначения(Справочники.пбп_ТипСоответствияОбъектовИБ);
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьПредопределенные(Команда)

ЗаполнитьПредопределенныеНаСервере();
пбп_ПредопределенныеЗначенияКлиент.СоздатьОбновитьПредопределенныеЗначения(ЭтотОбъект);

Элементы.Список.Обновить();

Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,30 @@


#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ОбработчикиСобытий

Процедура ПередЗаписью(Отказ)

Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

ДополнительныеСвойства.Вставить("ЭтоНовый", ЭтоНовый());

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

Процедура ПриЗаписи(Отказ)

Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;

Если Не пбп_ОбщегоНазначенияСлужебныйКлиентСервер.СвойствоСтруктуры(ДополнительныеСвойства, "ЭтоНовый", Ложь) Тогда
пбп_ОбщегоНазначенияСервер.ОбработатьСуществующийПредопределенныйЭлемент(ЭтотОбъект);
КонецЕсли;

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

#КонецОбласти

#КонецЕсли
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
</ChildItems>
</AutoCommandBar>
<Events>
<Event name="NotificationProcessing">ОбработкаОповещения</Event>
<Event name="OnCreateAtServer">ПриСозданииНаСервере</Event>
</Events>
<ChildItems>
Expand Down
Loading
Loading