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

Added automatic creation of predefined elements #144

Merged
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions docs/ПредопределенныеЗначения.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,51 @@
КонецПроцедуры
```

## Уникальность предопределенных элементов

Для обеспечения целостности данных и управления предопределёнными значениями реализован механизм контроля изменений. Он основан на вычислении хеша с использованием алгоритма **MD5**, учёте пометки на удаление, ручных изменений и проверке уникальности идентификаторов.

### Основные этапы проверки
1. **Первоначальная проверка уникальности идентификаторов:**
Copy link
Member

Choose a reason for hiding this comment

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

Кстати а это в оповещениях учтено? Или только если нужно разрешить конфликт?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

- На этапе инициализации идентификаторы всех элементов проверяются на уникальность.
- Если обнаружены коллизии (дублирующиеся идентификаторы), будет выдано сообщение об ошибке, и такие элементы будут пропущены.
2. **Хеш и состояние элемента:**
- Хеш вычисляется для каждого элемента и сохраняется в регистре **состояний предопределённых элементов**.
Copy link
Member

Choose a reason for hiding this comment

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

Нужно написать на основании каких данных формируется хэш - что там не учитываются изменяемые реквизиты

Copy link
Contributor Author

Choose a reason for hiding this comment

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

- Если элемент изменяется в пользовательском режиме, устанавливается флаг **ручное изменение:**
- Такой элемент исключается из проверки хеша при последующих обновлениях.
3. **Обработка элементов с пометкой на удаление:**
- Если элемент помечен на удаление и его хеш отличается от нового:
- Значения элемента обновляются данными из кода.
- Пометка на удаление автоматически снимается.
- Если элемент не помечен на удаление и его хеш отличается от нового:
- Формируется уведомление о конфликте для дальнейшего разрешения.
Copy link
Member

Choose a reason for hiding this comment

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

Нужно описать пример конфликта и его решения

Copy link
Contributor Author

Choose a reason for hiding this comment

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


## Автоматическое создание новых элементов

Для автоматизации процесса заполнения предопределенных элементов необходимо модифицировать/добавить в расширение общий модуль **``ОбщегоНазначенияПереопределяемый``**. В процедуре **``ПриДобавленииСерверныхОповещений``** требуется добавить новое серверное оповещение.

**Пример кода для подключения через расширение**

```BSL
&После("ПриДобавленииСерверныхОповещений")
Процедура пбп_ПриДобавленииСерверныхОповещений(Оповещения)

// Создаем новое серверное оповещение для предопределённых значений
Оповещение = СерверныеОповещения.НовоеСерверноеОповещение("пбп_ПредопределенныеЗначения");

// Указываем модуль для получения и отправки сообщений
Оповещение.ИмяМодуляОтправки = ""; // В данном случае используется рег. задание для отправки
Оповещение.ИмяМодуляПолучения = "пбп_ПредопределенныеЗначенияСлужебныйКлиент";

// Настраиваем периодичность проверки (в секундах)
Оповещение.ПериодПроверки = 300;

// Добавляем новое оповещение в список оповещений
Оповещения.Вставить(Оповещение.Имя, Оповещение);

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

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

В модуле **пбп_ПредопределенныеЗначенияПереопределяемый** значения добавляются через метод **Добавить()** коллекции **Результат**, которая представляет собой таблицу предопределённых значений. Каждая новая запись в этой таблице может быть настроена как группа путём установки свойства ЭтоГруппа в значение Истина.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,15 @@

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

// Заполнение предопределенных элементов, с выводом серверного оповещения при возникновении конфликтов.
//
Процедура ЗаполнениеПредопределенныхЭлементов() Экспорт

пбп_ОбщегоНазначенияСлужебный.ПриНачалеВыполненияРегламентногоЗадания(
Метаданные.РегламентныеЗадания.пбп_ЗаполнениеПредопределенныхЭлементов);

пбп_ПредопределенныеЗначения.ЗаполнениеПредопределенныхЭлементов(Истина);

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

#КонецОбласти
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@
Процедура ПриДобавленииПодсистемы(Описание) Экспорт

Описание.Имя = "ПроектнаяБиблиотекаПодсистем";
Описание.Версия = "1.0.3.12";
Описание.Версия = "1.0.4.13";

// Требуется библиотека стандартных подсистем.
Описание.ТребуемыеПодсистемы.Добавить("СтандартныеПодсистемы");
Expand Down Expand Up @@ -126,14 +126,7 @@

Процедура НачальноеЗаполнениеПредопределенныхЭлементов() Экспорт

Типы = Метаданные.ОпределяемыеТипы.пбп_ПредопределенныеВсеСсылкиПереопределяемый.Тип.Типы();

Для Каждого Тип Из Типы Цикл
ПолноеИмя = Метаданные.НайтиПоТипу(Тип).ПолноеИмя();
Менеджер = пбп_ОбщегоНазначенияСлужебный.МенеджерОбъектаПоПолномуИмени(ПолноеИмя);

пбп_ПредопределенныеЗначения.ИнициализироватьПредопределенныеЗначения(Менеджер);
КонецЦикла;
пбп_ПредопределенныеЗначения.ЗаполнениеПредопределенныхЭлементов();

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,47 @@
РегистрыСведений.пбп_СостоянияПредопределенныхЭлементов.СоздатьЗаписьРегистра(Объект, ЭтоГруппа, КлючиХеша);
КонецПроцедуры

// Заполнение предопределенных элементов, с возможностью серверного оповещения
// о существующих конфликтах при создании элементов.
//
// Параметры:
// ОтправитьСерверноеОповещение - Булево - В случае необходимости оповещения пользователей, установить флаг в Истину.
//
Процедура ЗаполнениеПредопределенныхЭлементов(ОтправитьСерверноеОповещение = Ложь) Экспорт

Типы = Метаданные.ОпределяемыеТипы.пбп_ПредопределенныеВсеСсылкиПереопределяемый.Тип.Типы();

Для Каждого Тип Из Типы Цикл
ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип);
ПолноеИмя = ОбъектМетаданных.ПолноеИмя();

Менеджер = пбп_ОбщегоНазначенияСлужебный.МенеджерОбъектаПоПолномуИмени(ПолноеИмя);

Если Не ОтправитьСерверноеОповещение Тогда
ИнициализироватьПредопределенныеЗначения(Менеджер);
Продолжить;
КонецЕсли;

ПредставлениеОбъекта = ?(ПустаяСтрока(ОбъектМетаданных.ПредставлениеОбъекта),
ОбъектМетаданных.Синоним,
ОбъектМетаданных.ПредставлениеОбъекта);

ТаблицаКонфликтныхЭлементов = ИнициализироватьПредопределенныеЗначения(Менеджер);

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

пбп_СерверныеОповещенияСлужебный.ОтправитьСерверноеОповещение(
"пбп_ПредопределенныеЗначения",
Результат,
Неопределено);
КонецЕсли;
КонецЦикла;

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

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Добавьте обработку ошибок в новую процедуру!

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

 Для Каждого Тип Из Типы Цикл
+    Попытка
         ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип);
         ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
         
         Менеджер = пбп_ОбщегоНазначенияСлужебный.МенеджерОбъектаПоПолномуИмени(ПолноеИмя);
         
         Если Не ОтправитьСерверноеОповещение Тогда
             ИнициализироватьПредопределенныеЗначения(Менеджер);
             Продолжить;
         КонецЕсли;
+    Исключение
+        пбп_ОбщегоНазначенияСлужебный.СообщитьПользователю(
+            СтрШаблон("Ошибка при обработке типа %1: %2", Тип, ОписаниеОшибки()));
+        Продолжить;
+    КонецПопытки;
 КонецЦикла;
📝 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
// Заполнение предопределенных элементов, с возможностью серверного оповещения
// о существующих конфликтах при создании элементов.
//
// Параметры:
// ОтправитьСерверноеОповещение - Булево - В случае необходимости оповещения пользователей, установить флаг в Истину.
//
Процедура ЗаполнениеПредопределенныхЭлементов(ОтправитьСерверноеОповещение = Ложь) Экспорт
Типы = Метаданные.ОпределяемыеТипы.пбп_ПредопределенныеВсеСсылкиПереопределяемый.Тип.Типы();
Для Каждого Тип Из Типы Цикл
ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип);
ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
Менеджер = пбп_ОбщегоНазначенияСлужебный.МенеджерОбъектаПоПолномуИмени(ПолноеИмя);
Если Не ОтправитьСерверноеОповещение Тогда
ИнициализироватьПредопределенныеЗначения(Менеджер);
Продолжить;
КонецЕсли;
ПредставлениеОбъекта = ?(ПустаяСтрока(ОбъектМетаданных.ПредставлениеОбъекта),
ОбъектМетаданных.Синоним,
ОбъектМетаданных.ПредставлениеОбъекта);
ТаблицаКонфликтныхЭлементов = ИнициализироватьПредопределенныеЗначения(Менеджер);
Если ЗначениеЗаполнено(ТаблицаКонфликтныхЭлементов) Тогда
Результат = Новый Структура;
Результат.Вставить("ИмяОбъектаМетаданных", ПолноеИмя);
Результат.Вставить("ПредставлениеОбъекта", ПредставлениеОбъекта);
пбп_СерверныеОповещенияСлужебный.ОтправитьСерверноеОповещение(
"пбп_ПредопределенныеЗначения",
Результат,
Неопределено);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Заполнение предопределенных элементов, с возможностью серверного оповещения
// о существующих конфликтах при создании элементов.
//
// Параметры:
// ОтправитьСерверноеОповещение - Булево - В случае необходимости оповещения пользователей, установить флаг в Истину.
//
Процедура ЗаполнениеПредопределенныхЭлементов(ОтправитьСерверноеОповещение = Ложь) Экспорт
Типы = Метаданные.ОпределяемыеТипы.пбп_ПредопределенныеВсеСсылкиПереопределяемый.Тип.Типы();
Для Каждого Тип Из Типы Цикл
Попытка
ОбъектМетаданных = Метаданные.НайтиПоТипу(Тип);
ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
Менеджер = пбп_ОбщегоНазначенияСлужебный.МенеджерОбъектаПоПолномуИмени(ПолноеИмя);
Если Не ОтправитьСерверноеОповещение Тогда
ИнициализироватьПредопределенныеЗначения(Менеджер);
Продолжить;
КонецЕсли;
ПредставлениеОбъекта = ?(ПустаяСтрока(ОбъектМетаданных.ПредставлениеОбъекта),
ОбъектМетаданных.Синоним,
ОбъектМетаданных.ПредставлениеОбъекта);
ТаблицаКонфликтныхЭлементов = ИнициализироватьПредопределенныеЗначения(Менеджер);
Если ЗначениеЗаполнено(ТаблицаКонфликтныхЭлементов) Тогда
Результат = Новый Структура;
Результат.Вставить("ИмяОбъектаМетаданных", ПолноеИмя);
Результат.Вставить("ПредставлениеОбъекта", ПредставлениеОбъекта);
пбп_СерверныеОповещенияСлужебный.ОтправитьСерверноеОповещение(
"пбп_ПредопределенныеЗначения",
Результат,
Неопределено);
КонецЕсли;
Исключение
пбп_ОбщегоНазначенияСлужебный.СообщитьПользователю(
СтрШаблон("Ошибка при обработке типа %1: %2", Тип, ОписаниеОшибки()));
Продолжить;
КонецПопытки;
КонецЦикла;
КонецПроцедуры


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

#Область СлужебныеПроцедурыИФункции
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.16">
<CommonModule uuid="adfac3a1-5e05-4ed6-bb3c-9b1cb6533f85">
<Properties>
<Name>пбп_ПредопределенныеЗначенияСлужебныйКлиент</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Предопределенные значения служебный клиент</v8:content>
</v8:item>
<v8:item>
<v8:lang>en</v8:lang>
<v8:content>Working with dialogues server</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Global>false</Global>
<ClientManagedApplication>true</ClientManagedApplication>
<Server>false</Server>
<ExternalConnection>false</ExternalConnection>
<ClientOrdinaryApplication>false</ClientOrdinaryApplication>
<ServerCall>false</ServerCall>
<Privileged>false</Privileged>
<ReturnValuesReuse>DontUse</ReturnValuesReuse>
</Properties>
</CommonModule>
</MetaDataObject>
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// Библиотека проектных подсистем для упрощения разработки архитектуры на 1С: Предприятие 8,
// включая доработку типовых конфигураций.
//
// Copyright First BIT company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// URL: https://github.com/firstBitSportivnaya/PSSL/
//

#Область СлужебныйПрограммныйИнтерфейс

// См. СтандартныеПодсистемыКлиент.ПриПолученииСерверногоОповещения.
Процедура ПриПолученииСерверногоОповещения(ИмяОповещения, Результат) Экспорт

Если ТипЗнч(Результат) = Тип("Структура") Тогда
Текст = пбп_СтроковыеФункцииСлужебныйКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Существуют конфликты предопределенных элементов ''%1'''"),
Результат.ПредставлениеОбъекта);
Пояснение = пбп_СтроковыеФункцииСлужебныйКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Разрешить конфликты предопределенных элементов ''%1'''"),
Результат.ПредставлениеОбъекта);

ПоказатьОповещениеПользователя(
Текст,
НавигационнаяСсылкаОбъекта(Результат.ИмяОбъектаМетаданных),
Пояснение,
БиблиотекаКартинок.ДиалогВосклицание,
СтатусОповещенияПользователя.Важное,
"КонфликтыПредопределенныхЭлементов_" + Результат.ИмяОбъектаМетаданных);
КонецЕсли;

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

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

#Область СлужебныеПроцедурыИФункции

// Возвращает навигационную ссылку для оповещений.
//
// Параметры:
// ИмяОбъекта - Строка - Полное имя объекта метаданных
//
// Возвращаемое значение:
// Строка - навигационная ссылка
//
Функция НавигационнаяСсылкаОбъекта(ИмяОбъекта)
Возврат "e1cib/list/" + ИмяОбъекта;
КонецФункции

#КонецОбласти
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.16">
<CommonModule uuid="24649f7c-7f4c-4bd4-af89-56164a1d2963">
<Properties>
<Name>пбп_СерверныеОповещения</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Серверные оповещения (пбп)</v8:content>
</v8:item>
</Synonym>
<Comment/>
<Global>false</Global>
<ClientManagedApplication>false</ClientManagedApplication>
<Server>true</Server>
<ExternalConnection>true</ExternalConnection>
<ClientOrdinaryApplication>true</ClientOrdinaryApplication>
<ServerCall>false</ServerCall>
<Privileged>false</Privileged>
<ReturnValuesReuse>DontUse</ReturnValuesReuse>
</Properties>
</CommonModule>
</MetaDataObject>
Loading
Loading