1
0
mirror of https://github.com/firstBitSportivnaya/PSSL.git synced 2025-08-10 22:21:34 +02:00

add func for create items interactively (#271)

* Add functions for hash calculation and add func for create items interactively

* Update ПредопределенныеЗначения.md
This commit is contained in:
Denis Ushakov
2025-05-27 13:35:53 +03:00
committed by GitHub
parent 9fc599eeea
commit a90c6a7e13
21 changed files with 585 additions and 386 deletions

View File

@@ -5,6 +5,84 @@
По стандартам разработки поиск ссылочных объектов в программном коде по наименованию, коду, гуиду и т.д. не рекомендуется. Для возможности получения ссылок из программного кода предлагается использовать элементы плана видов характеристик. Чтобы избежать необходимости реструктуризации при добавлении новых элементов в ПВХ, формирование иерархии и элементов делается программно и обновляется в пользовательском режиме. Получение элементов стандартизируется через общий модуль с возможностью кэширования.
При коментировании или удалении из кода предопределенных элементов и последующем перезаполнении, элемент будет помечен на удаление, включая все его подчиненные элементы.
## Настройка
> [!NOTE]
> Чтобы подключить объект к подсистеме и обеспечить корректную работу с предопределёнными значениями, выполните следующие шаги:
1. Добавить ссылки на объекты-владельцы (Справочники, ПланыВидовХарактеристик и т.д.) в состав определяемого типа `пбп_ПредопределенныеВсеСсылкиПереопределяемый`.
2. В подключаемом объекте добавить реквизиты:
- **ИдентификаторНастройки** - тип `Строка`
- **ЭтоПредопределенный**[^1] - тип `Булево`
[^1]: Реквизит добавляется в случае, если необходимо создавать предопределенные элементы в пользовательском режиме.
3. В модуле объекта в обработчике `ПередЗаписью` добавить вызов функции `пбп_ПредопределенныеЗначения.ПередЗаписью`.
Пример:
```bsl
Процедура ПередЗаписью(Отказ)
// пбп_ПредопределенныеЗначения
пбп_ПредопределенныеЗначения.ПередЗаписью(ЭтотОбъект, Отказ);
// Конец пбп_ПредопределенныеЗначения
КонецПроцедуры
```
4. В модуле объекта в обработчике `ПриЗаписи` добавить вызов функции `пбп_ПредопределенныеЗначения.ПриЗаписи`.
Пример:
```bsl
Процедура ПриЗаписи(Отказ)
// пбп_ПредопределенныеЗначения
пбп_ПредопределенныеЗначения.ПриЗаписи(ЭтотОбъект, Отказ);
// Конец пбп_ПредопределенныеЗначения
КонецПроцедуры
```
5. Подключить кнопку заполнения в форме списке.
5.1. *Будет добавлено в следующем релизе*. См. подробнее в [#272](https://github.com/firstBitSportivnaya/PSSL/issues/272)
6. В модуле `пбп_ПредопределенныеЗначенияПереопределяемый` добавить процедуру заполнения предопределенных значений `Процедура ПредопределенныеЗначения<ИмяОбъекта>(Таблица) Экспорт`
6.1 Указать имя процедуры в модуле `пбп_ПредопределенныеЗначенияПовтИсп.ФункцииСозданияТаблицПредопределенныхЭлементов`
Пример:
```bsl
Процедура ПредопределенныеЗначенияИнтегрируемыеСистемы(Таблица) Экспорт
// Добавление
НоваяСистема = Таблица.Добавить();
НоваяСистема.Наименование = "Система N";
НоваяСистема.ИдентификаторНастройки = "СистемаN";
// КонецДобавления
КонецПроцедуры
```
7. В модуле `пбп_ПредопределенныеЗначенияПереопределяемый` добавить функцию получения структуры колонок `Функция Колонки<ИмяОбъекта>() Экспорт`
7.1 Указать имя процедуры в модуле `пбп_ПредопределенныеЗначенияПовтИсп.ФункцииПолученияКолонокПредопределенныхЭлементов`
Пример:
```bsl
Функция КолонкиИнтеграционныеПотоки() Экспорт
Колонки = Новый Массив;
// Добавление
Колонки.Добавить("НаправлениеПотока");
Колонки.Добавить("КлючРегламентногоЗадания");
// КонецДобавления
Возврат Колонки;
КонецФункции
```
8. При необходимости расширения ключей хеширования в модуле `пбп_ПредопределенныеЗначенияПереопределяемый` добавить функцию получения структуры колонок `Функция ДобавляемыеПоляДляРасчетаХеша<ИмяОбъекта>() Экспорт`
8.1 Указать имя процедуры в модуле `пбп_ПредопределенныеЗначенияПовтИсп.ФункцииПолученияДобавляемыхПолейДляРасчетаХеша`
Пример:
```bsl
Функция ДобавляемыеПоляДляРасчетаХешаИнтеграционныеПотоки() Экспорт
Колонки = Новый Массив;
// Добавление
Колонки.Добавить("НаправлениеПотока");
Колонки.Добавить("КлючРегламентногоЗадания");
// КонецДобавления
Возврат Колонки;
КонецФункции
```
## Первоначальное заполнение
Для того чтобы автоматизировать процесс первоначального заполнения предопределенных элементов, необходимо модифицировать/добавить в расширение общий модуль **ПодсистемыКонфигурацииПереопределяемый**.

View File

@@ -64,7 +64,9 @@
КонецЕсли;
КонецЕсли;
ДополнительныеСвойства.Вставить("ЭтоНовый", ЭтоНовый());
// пбп_ПредопределенныеЗначения
пбп_ПредопределенныеЗначения.ПередЗаписью(ЭтотОбъект, Отказ);
// Конец пбп_ПредопределенныеЗначения
КонецПроцедуры
@@ -74,7 +76,9 @@
Возврат;
КонецЕсли;
пбп_ОбщегоНазначенияСервер.ОбработатьСуществующийПредопределенныйЭлемент(ЭтотОбъект);
// пбп_ПредопределенныеЗначения
пбп_ПредопределенныеЗначения.ПриЗаписи(ЭтотОбъект, Отказ);
// Конец пбп_ПредопределенныеЗначения
Если ПометкаУдаления И Не ПустаяСтрока(КлючРегламентногоЗадания) Тогда
УдалитьРегламентноеЗаданиеПоКлючу(Ложь);

View File

@@ -28,7 +28,9 @@
Возврат;
КонецЕсли;
ДополнительныеСвойства.Вставить("ЭтоНовый", ЭтоНовый());
// пбп_ПредопределенныеЗначения
пбп_ПредопределенныеЗначения.ПередЗаписью(ЭтотОбъект, Отказ);
// Конец пбп_ПредопределенныеЗначения
КонецПроцедуры
@@ -38,7 +40,9 @@
Возврат;
КонецЕсли;
пбп_ОбщегоНазначенияСервер.ОбработатьСуществующийПредопределенныйЭлемент(ЭтотОбъект);
// пбп_ПредопределенныеЗначения
пбп_ПредопределенныеЗначения.ПриЗаписи(ЭтотОбъект, Отказ);
// Конец пбп_ПредопределенныеЗначения
КонецПроцедуры

View File

@@ -64,7 +64,9 @@
ЗаполнитьРеквизитыНаОснованииЭлементаНаследования(ЭлементНаследования);
КонецЕсли;
ДополнительныеСвойства.Вставить("ЭтоНовый", ЭтоНовый());
// пбп_ПредопределенныеЗначения
пбп_ПредопределенныеЗначения.ПередЗаписью(ЭтотОбъект, Отказ);
// Конец пбп_ПредопределенныеЗначения
Если Не ЭтоНовый() И пбп_ИнтеграцииСлужебный.ПроверитьЭтоИнтеграцияСВнешнимИсточникомДанных(ТипИнтеграции) Тогда
Запрос = Новый Запрос;
@@ -99,7 +101,9 @@
Возврат;
КонецЕсли;
пбп_ОбщегоНазначенияСервер.ОбработатьСуществующийПредопределенныйЭлемент(ЭтотОбъект);
// пбп_ПредопределенныеЗначения
пбп_ПредопределенныеЗначения.ПриЗаписи(ЭтотОбъект, Отказ);
// Конец пбп_ПредопределенныеЗначения
КонецПроцедуры

View File

@@ -28,7 +28,9 @@
Возврат;
КонецЕсли;
ДополнительныеСвойства.Вставить("ЭтоНовый", ЭтоНовый());
// пбп_ПредопределенныеЗначения
пбп_ПредопределенныеЗначения.ПередЗаписью(ЭтотОбъект, Отказ);
// Конец пбп_ПредопределенныеЗначения
КонецПроцедуры
@@ -38,7 +40,9 @@
Возврат;
КонецЕсли;
пбп_ОбщегоНазначенияСервер.ОбработатьСуществующийПредопределенныйЭлемент(ЭтотОбъект);
// пбп_ПредопределенныеЗначения
пбп_ПредопределенныеЗначения.ПриЗаписи(ЭтотОбъект, Отказ);
// Конец пбп_ПредопределенныеЗначения
КонецПроцедуры

View File

@@ -28,7 +28,9 @@
Возврат;
КонецЕсли;
ДополнительныеСвойства.Вставить("ЭтоНовый", ЭтоНовый());
// пбп_ПредопределенныеЗначения
пбп_ПредопределенныеЗначения.ПередЗаписью(ЭтотОбъект, Отказ);
// Конец пбп_ПредопределенныеЗначения
КонецПроцедуры
@@ -38,7 +40,9 @@
Возврат;
КонецЕсли;
пбп_ОбщегоНазначенияСервер.ОбработатьСуществующийПредопределенныйЭлемент(ЭтотОбъект);
// пбп_ПредопределенныеЗначения
пбп_ПредопределенныеЗначения.ПриЗаписи(ЭтотОбъект, Отказ);
// Конец пбп_ПредопределенныеЗначения
КонецПроцедуры

View File

@@ -92,17 +92,13 @@
Поля = Новый СписокЗначений;
ДопПараметры = ПолучитьДополнительныеПараметрыОбработкиЭлементов(Таблица);
МенеджерОбъекта = пбп_Переадресация.МенеджерОбъектаПоПолномуИмени(ИмяФормыВладельца);
ИсключаемыеПоля = пбп_ПредопределенныеЗначенияПереопределяемый.ИсключаемыеПоляДляРасчетаХешаЭлемент();
Ключи = пбп_ПредопределенныеЗначения.КлючиХеша(МенеджерОбъекта);
ДобавляемыеРеквизиты = Новый Структура;
Для Каждого Колонка Из Таблица.Колонки Цикл
Если ИсключаемыеПоля.Свойство(Колонка.Имя) Или СтрНачинаетсяС(Колонка.Имя, "Служебный_") Тогда
Продолжить;
КонецЕсли;
Если Не ДопПараметры.Иерархический И (Колонка.Имя = "ЭтоГруппа" Или Колонка.Имя = "Родитель") Тогда
Если Не Ключи.КлючиХешаЭлемент.Свойство(Колонка.Имя) Тогда
Продолжить;
КонецЕсли;

View File

@@ -74,7 +74,7 @@
Процедура ПриДобавленииПодсистемы(Описание) Экспорт
Описание.Имя = "ПроектнаяБиблиотекаПодсистем";
Описание.Версия = "1.0.8.2";
Описание.Версия = "1.0.9.0";
// Требуется библиотека стандартных подсистем.
Описание.ТребуемыеПодсистемы.Добавить("СтандартныеПодсистемы");

View File

@@ -890,22 +890,6 @@
#КонецОбласти
// Выполняет действия при записи предопределенного элемента.
//
// Параметры:
// Объект - СправочникОбъект, ПланВидовХарактеристикОбъект - предопределенный элемент
// из подсистемы предопределенных элементов
//
Процедура ОбработатьСуществующийПредопределенныйЭлемент(Объект) Экспорт
Если пбп_ПереадресацияКлиентСервер.СвойствоСтруктуры(Объект.ДополнительныеСвойства, "ЭтоНовый", Ложь) Тогда
Возврат;
КонецЕсли;
пбп_ПредопределенныеЗначения.ОбновитьХешПредопределенногоЭлемента(Объект);
КонецПроцедуры
#Область УсловныеВызовы
// Возвращает ссылку на общий модуль или модуль менеджера по имени.

View File

@@ -368,6 +368,40 @@
КонецФункции
// Аналог метода БСП. Возвращает разность массивов. Разностью двух массивов является массив, содержащий
// все элементы первого массива, не существующие во втором массиве.
//
// Параметры:
// Массив - Массив - массив элементов, из которого необходимо выполнить вычитание;
// МассивВычитания - Массив - массив элементов, который будет вычитаться.
//
// Возвращаемое значение:
// Массив - разностью двух массивов.
//
// Пример:
// //А = [1, 3, 5, 7];
// //В = [3, 7, 9];
// Результат = ОбщегоНазначенияКлиентСервер.РазностьМассивов(А, В);
// //Результат = [1, 5];
//
Функция РазностьМассивов(Знач Массив, Знач МассивВычитания) Экспорт
Результат = ПереадресацияМодуляОбщегоНазначенияКлиентСервер();
Если Результат.МодульСуществует Тогда
Возврат Результат.Модуль.РазностьМассивов(Массив, МассивВычитания);
КонецЕсли;
Результат = Новый Массив;
Для Каждого Элемент Из Массив Цикл
Если МассивВычитания.Найти(Элемент) = Неопределено Тогда
Результат.Добавить(Элемент);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область СтроковыеФункцииКлиентСервер

View File

@@ -44,37 +44,48 @@
КонецФункции
// Возвращает ключи хеша на основании массива полей элемента
// Возвращает ключи хеша на основании менеджера объекта.
//
// Параметры:
// Поля - Массив - Поля для формирования ключей хеша
// ЭтоГруппа - Булево - От этого признака зависят исключаемые поля
// МенеджерОбъекта - СправочникМенеджер, ПланВидовХарактеристикМенеджер - Менеджер обрабатываемого объекта.
//
// Возвращаемое значение:
// Структура - Ключи хеша
// * КлючиХешаЭлемент - Структура - Структура ключей хеша для элемента.
// * КлючиХешаГруппа - Структура - Структура ключей хеша для группы.
//
Функция КлючиХешаПредопределенногоЭлемента(Поля, ЭтоГруппа = Ложь) Экспорт
Функция КлючиХеша(МенеджерОбъекта) Экспорт
Если ТипЗнч(Поля) <> Тип("Массив") Или Не ЗначениеЗаполнено(Поля) Тогда
Возврат Новый Структура;
КонецЕсли;
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(МенеджерОбъекта));
мКлючи = Новый Массив;
Поля = пбп_ПредопределенныеЗначенияПереопределяемый.ДобавляемыеСтандартныеПоля();
УдаляемыеСтандартныеПоля = пбп_ПредопределенныеЗначенияПереопределяемый.УдаляемыеСтандартныеПоля();
Если ЭтоГруппа Тогда
ИсключаемыеПоля = пбп_ПредопределенныеЗначенияПереопределяемый.ИсключаемыеПоляДляРасчетаХешаГруппа();
Иначе
ИсключаемыеПоля = пбп_ПредопределенныеЗначенияПереопределяемый.ИсключаемыеПоляДляРасчетаХешаЭлемент();
КонецЕсли;
Поля = пбп_ПереадресацияКлиентСервер.РазностьМассивов(Поля, УдаляемыеСтандартныеПоля);
ДобавляемыеПоля = пбп_ПредопределенныеЗначенияСлужебный.ДобавляемыеПоляОбъектаДляРасчетаХеша(МенеджерОбъекта);
пбп_ПереадресацияКлиентСервер.ДополнитьМассив(Поля, ДобавляемыеПоля);
Ключи = Новый Структура("КлючиХешаЭлемент, КлючиХешаГруппа", Новый Структура, Новый Структура);
Для Каждого Поле Из Поля Цикл
Если ИсключаемыеПоля.Свойство(Поле) Или СтрНачинаетсяС(Поле, "Служебный_") Тогда
Реквизит = ОбъектМетаданных.Реквизиты.Найти(Поле);
ЕстьСтандартныйРеквизит = пбп_ПереадресацияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(
ОбъектМетаданных.СтандартныеРеквизиты,
Поле);
Если Реквизит = Неопределено И Не ЕстьСтандартныйРеквизит Тогда
Продолжить;
КонецЕсли;
мКлючи.Добавить(Поле);
Ключи.КлючиХешаЭлемент.Вставить(Поле);
Если ЕстьСтандартныйРеквизит
Или Реквизит.Использование <> Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента Тогда
Ключи.КлючиХешаГруппа.Вставить(Поле);
КонецЕсли;
КонецЦикла;
Возврат Новый Структура(СтрСоединить(мКлючи, ","));
Возврат Ключи;
КонецФункции
@@ -155,4 +166,69 @@
КонецПроцедуры
// Выполняет действия при записи предопределенного элемента.
//
// Параметры:
// Объект - СправочникОбъект, ПланВидовХарактеристикОбъект - предопределенный элемент
// из подсистемы предопределенных элементов
//
Процедура ОбработатьСуществующийПредопределенныйЭлемент(Объект) Экспорт
Если пбп_ПереадресацияКлиентСервер.СвойствоСтруктуры(Объект.ДополнительныеСвойства, "ЭтоНовый", Ложь) Тогда
Возврат;
КонецЕсли;
ИмяРеквизита = пбп_ПредопределенныеЗначенияСлужебный.ИмяПоляПредопределенности();
Если пбп_ПереадресацияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита)
И Не Объект.ЭтоПредопределенный Тогда
Возврат;
КонецЕсли;
ОбновитьХешПредопределенногоЭлемента(Объект);
КонецПроцедуры
// Вызывается из одноименного обработчика ПередЗаписью.
//
// Параметры:
// Объект - СправочникОбъект, ПланВидовХарактеристикОбъект - редопределенный элемент
// из подсистемы предопределенных элементов.
// Отказ - Булево - Признак отказа от записи.
//
Процедура ПередЗаписью(Объект, Отказ) Экспорт
Объект.ДополнительныеСвойства.Вставить("ЭтоНовый", Объект.ЭтоНовый());
УстановитьФлагПредопределенногоЭлемента(Объект);
КонецПроцедуры
// Вызывается из одноименного обработчика ПриЗаписи.
//
// Параметры:
// Объект - СправочникОбъект, ПланВидовХарактеристикОбъект - редопределенный элемент
// из подсистемы предопределенных элементов.
// Отказ - Булево - Признак отказа от записи.ы
//
Процедура ПриЗаписи(Объект, Отказ) Экспорт
ОбработатьСуществующийПредопределенныйЭлемент(Объект);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура УстановитьФлагПредопределенногоЭлемента(Объект)
ИмяРеквизита = пбп_ПредопределенныеЗначенияСлужебный.ИмяПоляПредопределенности();
Если Не пбп_ПереадресацияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Тогда
Возврат;
КонецЕсли;
Объект.ЭтоПредопределенный = ЗначениеЗаполнено(Объект.ИдентификаторНастройки);
КонецПроцедуры
#КонецОбласти

View File

@@ -187,20 +187,18 @@
#Область СтруктурыКолонокТаблиц
// Возвращает колонки предопределенные значения
//
//
// Возвращаемое значение:
// Структура - Где ключ имя колонки, значение описание типов колонки
// Массив - Список имен полей
//
Функция КолонкиПредопределенныеЗначения() Экспорт
Колонки = Новый Структура;
ОписаниеБулево = Новый ОписаниеТипов("Булево");
Колонки = Новый Массив;
// Добавление
Колонки.Вставить("Пароль", ОписаниеБулево);
Колонки.Вставить("СписокЗначений", ОписаниеБулево);
Колонки.Вставить("ТипЗначения", Новый ОписаниеТипов("ОписаниеТипов"));
Колонки.Добавить("Пароль");
Колонки.Добавить("СписокЗначений");
Колонки.Добавить("ТипЗначения");
// КонецДобавления
Возврат Колонки;
@@ -208,13 +206,13 @@
КонецФункции
// Возвращает колонки интегрируемые системы
//
//
// Возвращаемое значение:
// Структура - Где ключ имя колонки, значение описание типов колонки
// Массив - Список имен полей
//
Функция КолонкиИнтегрируемыеСистемы() Экспорт
Колонки = Новый Структура;
Колонки = Новый Массив;
// Добавление
@@ -225,19 +223,17 @@
КонецФункции
// Возвращает колонки интеграционные потоки
//
//
// Возвращаемое значение:
// Структура - Где ключ имя колонки, значение описание типов колонки
// Массив - Список имен полей
//
Функция КолонкиИнтеграционныеПотоки() Экспорт
Колонки = Новый Структура;
Колонки = Новый Массив;
// Добавление
Колонки.Вставить("НаправлениеПотока" , Новый ОписаниеТипов(
"ПеречислениеСсылка.пбп_НаправленияИнтеграционныхПотоков"));
Колонки.Вставить("КлючРегламентногоЗадания" , пбп_Переадресация.ОписаниеТипаСтрока(150));
Колонки.Добавить("НаправлениеПотока");
Колонки.Добавить("КлючРегламентногоЗадания");
// КонецДобавления
Возврат Колонки;
@@ -245,23 +241,20 @@
КонецФункции
// Возвращает колонки настройки интеграции
//
//
// Возвращаемое значение:
// Структура - Где ключ имя колонки, значение описание типов колонки
// Массив - Список имен полей
//
Функция КолонкиНастройкиИнтеграции() Экспорт
ДлинаСтрокиПодключения = 200;
ДлинаИмениОбъекта = 100;
Колонки = Новый Структура;
Колонки = Новый Массив;
// Добавление
Колонки.Вставить("ИнтегрируемаяСистема" , Новый ОписаниеТипов("СправочникСсылка.пбп_ИнтегрируемыеСистемы"));
Колонки.Вставить("ТипИнтеграции" , Новый ОписаниеТипов("СправочникСсылка.пбп_ТипыИнтеграций"));
Колонки.Вставить("СтрокаПодключения" , пбп_Переадресация.ОписаниеТипаСтрока(ДлинаСтрокиПодключения));
Колонки.Вставить("ТипАвторизации" , Новый ОписаниеТипов("ПеречислениеСсылка.пбп_ТипыАвторизации"));
Колонки.Вставить("ИмяОбъекта" , пбп_Переадресация.ОписаниеТипаСтрока(ДлинаИмениОбъекта));
Колонки.Добавить("ИнтегрируемаяСистема");
Колонки.Добавить("ТипИнтеграции");
Колонки.Добавить("СтрокаПодключения");
Колонки.Добавить("ТипАвторизации");
Колонки.Добавить("ИмяОбъекта");
// КонецДобавления
Возврат Колонки;
@@ -269,16 +262,16 @@
КонецФункции
// Возвращает колонки тип соответствия объектов ИБ
//
//
// Возвращаемое значение:
// Структура - Где ключ имя колонки, значение описание типов колонки
// Массив - Список имен полей
//
Функция КолонкиТипСоответствияОбъектовИБ() Экспорт
Колонки = Новый Структура;
Колонки = Новый Массив;
// Добавление
Колонки.Вставить("Кэшируется", пбп_РаботаСФормами.ОписаниеТипаБулево());
Колонки.Добавить("Кэшируется");
// КонецДобавления
Возврат Колонки;
@@ -287,37 +280,130 @@
#КонецОбласти
#Область ИсключаемыеПоляДляРасчетаХеша
#Область ДобавляемыеПоляДляРасчетаХеша
// Возвращает исключаемые поля для расчета хеша элемент
// Возвращает поля для расчета хеша
//
// Возвращаемое значение:
// Массив - Исключаемые поля
// Массив - Массив имен полей для расчета хеша
//
Функция ИсключаемыеПоляДляРасчетаХешаЭлемент() Экспорт
Функция ДобавляемыеПоляДляРасчетаХешаПредопределенныеЗначения() Экспорт
Поля = Новый Структура;
Поля.Вставить("ХешСумма");
Поля.Вставить("УровеньИерархии");
Поля.Вставить("ИдентификаторРодитель");
Колонки = Новый Массив;
ДополнитьИсключаемыеПоляДляРасчетХешаНастройкиИнтеграции(Поля);
// Добавление
Колонки.Добавить("Пароль");
Колонки.Добавить("СписокЗначений");
Колонки.Добавить("ТипЗначения");
// КонецДобавления
Возврат Колонки;
КонецФункции
// Возвращает поля для расчета хеша
//
// Возвращаемое значение:
// Массив - Массив имен полей для расчета хеша
//
Функция ДобавляемыеПоляДляРасчетаХешаИнтегрируемыеСистемы() Экспорт
Колонки = Новый Массив;
// Добавление
// КонецДобавления
Возврат Колонки;
КонецФункции
// Возвращает поля для расчета хеша
//
// Возвращаемое значение:
// Массив - Массив имен полей для расчета хеша
//
Функция ДобавляемыеПоляДляРасчетаХешаИнтеграционныеПотоки() Экспорт
Колонки = Новый Массив;
// Добавление
Колонки.Добавить("НаправлениеПотока");
Колонки.Добавить("КлючРегламентногоЗадания");
// КонецДобавления
Возврат Колонки;
КонецФункции
// Возвращает поля для расчета хеша
//
// Возвращаемое значение:
// Массив - Массив имен полей для расчета хеша
//
Функция ДобавляемыеПоляДляРасчетаХешаНастройкиИнтеграции() Экспорт
Колонки = Новый Массив;
// Добавление
// КонецДобавления
Возврат Колонки;
КонецФункции
// Возвращает поля для расчета хеша
//
// Возвращаемое значение:
// Массив - Массив имен полей для расчета хеша
//
Функция ДобавляемыеПоляДляРасчетаХешаТипСоответствияОбъектовИБ() Экспорт
Колонки = Новый Массив;
// Добавление
Колонки.Добавить("Кэшируется");
// КонецДобавления
Возврат Колонки;
КонецФункции
#КонецОбласти
#Область СтандартныеПоля
// Возвращает список стандартных полей, добавляемых к таблице предопределенных значений
//
// Возвращаемое значение:
// Массив - Массив имен стандартных полей
//
Функция ДобавляемыеСтандартныеПоля() Экспорт
Поля = Новый Массив;
Поля.Добавить("Наименование");
Поля.Добавить("ИдентификаторНастройки");
Поля.Добавить("ЭтоГруппа");
Поля.Добавить("Родитель");
Поля.Добавить(пбп_ПредопределенныеЗначенияСлужебный.ИмяПоляПредопределенности());
Возврат Поля;
КонецФункции
// Возвращает исключаемые поля для расчета хеша группа
//
// Возвращаемое значение:
// Массив - Исключаемые поля
// Возвращает список стандартных полей, удаляемых из таблицы предопределенных значений
//
Функция ИсключаемыеПоляДляРасчетаХешаГруппа() Экспорт
// Возвращаемое значение:
// Массив - Массив имен стандартных полей
//
Функция УдаляемыеСтандартныеПоля() Экспорт
Поля = Новый Структура;
Поля.Вставить("ХешСумма");
Поля.Вставить("УровеньИерархии");
Поля.Вставить("ИдентификаторРодитель");
Поля = Новый Массив;
Поля.Добавить(пбп_ПредопределенныеЗначенияСлужебный.ИмяПоляПредопределенности());
Возврат Поля;
@@ -329,7 +415,15 @@
#Область СлужебныеПроцедурыИФункции
Функция ОбщиеКолонки(Менеджер) Экспорт
// Возвращает общие колонки с описанием типов для таблицы предопределенных значений
//
// Параметры:
// Менеджер - СправочникМенеджер, ПланВидовХарактеристикМенеджер - менеджер объекта метаданных.
//
// Возвращаемое значение:
// Структура - где ключ - имя колонки, значение - описание типов колонки
//
Функция ОбщиеКолонкиСОписаниемТипов(Менеджер) Экспорт
массив = Новый Массив;
массив.Добавить(ТипЗнч(Менеджер.ПустаяСсылка()));
@@ -340,15 +434,10 @@
ОписаниеСтрока = Новый ОписаниеТипов("Строка", , , , Новый КвалификаторыСтроки(150));
ОписаниеБулево = Новый ОписаниеТипов("Булево");
Колонки.Вставить("ИдентификаторНастройки", ОписаниеСтрока);
Колонки.Вставить("Наименование", ОписаниеСтрока);
Колонки.Вставить("ЭтоГруппа", ОписаниеБулево);
Колонки.Вставить("Родитель", ОписаниеТиповЭлемента);
Колонки.Вставить("УровеньИерархии", Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(2,0)));
Колонки.Вставить("ИдентификаторРодитель", ОписаниеСтрока);
Колонки.Вставить("ХешСумма", Новый ОписаниеТипов("Строка", , , , Новый КвалификаторыСтроки(32)));
Колонки.Вставить("Служебный_ХешСумма", Новый ОписаниеТипов("Строка", , , , Новый КвалификаторыСтроки(32)));
Колонки.Вставить("Служебный_ОбновитьЭлемент", ОписаниеБулево);
Колонки.Вставить("Служебный_УстановитьФлагРучноеИзменение", ОписаниеБулево);
Колонки.Вставить("Служебный_ПредопределенныйЭлемент", ОписаниеТиповЭлемента);
@@ -360,15 +449,4 @@
КонецФункции
Процедура ДополнитьИсключаемыеПоляДляРасчетХешаНастройкиИнтеграции(Поля)
Поля.Вставить("Порт");
Поля.Вставить("ВнешняяКомпонента");
Поля.Вставить("УчетнаяЗапись");
Поля.Вставить("ТипАвторизации");
Поля.Вставить("ИмяОбъекта");
Поля.Вставить("ИмяФайлаВнешнейКомпоненты");
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@@ -72,7 +72,37 @@
"пбп_ПредопределенныеЗначенияПереопределяемый.КолонкиТипСоответствияОбъектовИБ");
// КонецДобавления
ОбработатьСоответствиеФункцийКолонок(Соответствие);
ОбработатьСоответствиеФункций(Соответствие);
Возврат Соответствие;
КонецФункции
// Возвращает соответствие типа с функцией для получения полей расчета хеша.
//
// Возвращаемое значение:
// Соответствие из КлючИЗначение:
// * Ключ - ПланВидовХарактеристикМенеджер, СправочникМенеджер
// * Значение - Строка
//
Функция ФункцииПолученияДобавляемыхПолейДляРасчетаХеша() Экспорт
Соответствие = Новый Соответствие;
// Добавление
Соответствие.Вставить(Тип("ПланВидовХарактеристикМенеджер.пбп_ПредопределенныеЗначения"),
"пбп_ПредопределенныеЗначенияПереопределяемый.ДобавляемыеПоляДляРасчетаХешаПредопределенныеЗначения");
Соответствие.Вставить(Тип("СправочникМенеджер.пбп_ИнтегрируемыеСистемы"),
"пбп_ПредопределенныеЗначенияПереопределяемый.ДобавляемыеПоляДляРасчетаХешаИнтегрируемыеСистемы");
Соответствие.Вставить(Тип("СправочникМенеджер.пбп_ИнтеграционныеПотоки"),
"пбп_ПредопределенныеЗначенияПереопределяемый.ДобавляемыеПоляДляРасчетаХешаИнтеграционныеПотоки");
Соответствие.Вставить(Тип("СправочникМенеджер.пбп_НастройкиИнтеграции"),
"пбп_ПредопределенныеЗначенияПереопределяемый.ДобавляемыеПоляДляРасчетаХешаНастройкиИнтеграции");
Соответствие.Вставить(Тип("СправочникМенеджер.пбп_ТипСоответствияОбъектовИБ"),
"пбп_ПредопределенныеЗначенияПереопределяемый.ДобавляемыеПоляДляРасчетаХешаТипСоответствияОбъектовИБ");
// КонецДобавления
ОбработатьСоответствиеФункций(Соответствие);
Возврат Соответствие;
@@ -82,7 +112,7 @@
#Область СлужебныеПроцедурыИФункции
Процедура ОбработатьСоответствиеФункцийКолонок(Соответствие)
Процедура ОбработатьСоответствиеФункций(Соответствие)
Для Каждого КлючЗначение Из Соответствие Цикл
Соответствие[КлючЗначение.Ключ] = КлючЗначение.Значение + "()";

View File

@@ -34,7 +34,7 @@
Параметры = ДопПараметрыОбработкиПредопределенныхЭлементов(ТаблицаПредопределенных, МенеджерОбъекта);
ОбработатьНеиспользуемыеЭлементы(ТаблицаПредопределенных, Параметры.ПолноеИмя);
ОбработатьНеиспользуемыеЭлементы(ТаблицаПредопределенных, Параметры);
ЗаполнитьРодителейЭлементов(ТаблицаПредопределенных, Параметры);
ЗаполнитьКонтрольныеСуммыТаблицы(ТаблицаПредопределенных, Параметры);
@@ -53,13 +53,13 @@
// МенеджерОбъекта - СправочникМенеджер, ПланВидовХарактеристикМенеджер - менеджер объекта.
//
// Возвращаемое значение:
// Структура - Данные Менеджера объекта
// * Менеджер - СправочникМенеджер, ПланВидовХарактеристикМенеджер - менеджер объекта.
// * ПолноеИмя - Строка - Полное имя объекта метаданных.
// * Иерархический - Булево - Свойство объекта метаданных.
// * ИерархияГруппИЭлементов - Булево - Свойство объекта метаданных.
// * КлючиХешаЭлемент - Структура - Ключевые реквизиты для формирования хеша элемента.
// * КлючиХешаГруппа - Структура - Ключевые реквизиты для формирования хеша группы.
// Структура - Данные Менеджера объекта:
// * Менеджер - СправочникМенеджер, ПланВидовХарактеристикМенеджер - менеджер объекта.
// * ПолноеИмя - Строка - Полное имя объекта метаданных.
// * Иерархический - Булево - Свойство объекта метаданных.
// * ИерархияГруппИЭлементов - Булево - Свойство объекта метаданных.
// * КлючиХешаЭлемент - Структура - Ключевые реквизиты для формирования хеша элемента.
// * КлючиХешаГруппа - Структура - Ключевые реквизиты для формирования хеша группы.
//
Функция ДопПараметрыОбработкиПредопределенныхЭлементов(Таблица, МенеджерОбъекта) Экспорт
@@ -70,6 +70,7 @@
Параметры.Вставить("ИерархияГруппИЭлементов", Ложь);
Параметры.Вставить("КлючиХешаЭлемент", Новый Структура);
Параметры.Вставить("КлючиХешаГруппа", Новый Структура);
Параметры.Вставить("ОбъектМетаданных", Неопределено);
Если Не пбп_ПредопределенныеЗначенияСлужебный.МенеджерВходитВПодсистемуПредопределенных(МенеджерОбъекта) Тогда
Возврат Параметры;
@@ -77,30 +78,22 @@
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(МенеджерОбъекта));
Параметры = Новый Структура;
Параметры.Вставить("Менеджер", МенеджерОбъекта);
Параметры.Вставить("ПолноеИмя", ОбъектМетаданных.ПолноеИмя());
Параметры.Вставить("Иерархический", ОбъектМетаданных.Иерархический);
Параметры.ОбъектМетаданных = ОбъектМетаданных;
Параметры.Менеджер = МенеджерОбъекта;
Параметры.ПолноеИмя = ОбъектМетаданных.ПолноеИмя();
Параметры.Иерархический = ОбъектМетаданных.Иерархический;
ИерархияГруппИЭлементов = ОбъектМетаданных.Иерархический;
Если Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда
ИерархияГруппИЭлементов =
ОбъектМетаданных.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияГруппИЭлементов;
КонецЕсли;
Параметры.Вставить("ИерархияГруппИЭлементов", ИерархияГруппИЭлементов);
Параметры.ИерархияГруппИЭлементов = ИерархияГруппИЭлементов;
мКолонки = Новый Массив;
Для Каждого Колонка Из Таблица.Колонки Цикл
мКолонки.Добавить(Колонка.Имя);
КонецЦикла;
Параметры.Вставить("КлючиХешаЭлемент",
пбп_ПредопределенныеЗначения.КлючиХешаПредопределенногоЭлемента(мКолонки, Ложь));
мКолонки = ПолучитьПоляГруппы(МенеджерОбъекта, мКолонки);
Параметры.Вставить("КлючиХешаГруппа",
пбп_ПредопределенныеЗначения.КлючиХешаПредопределенногоЭлемента(мКолонки, Истина));
КлючиХеша = пбп_ПредопределенныеЗначения.КлючиХеша(МенеджерОбъекта);
Параметры.КлючиХешаЭлемент = КлючиХеша.КлючиХешаЭлемент;
Параметры.КлючиХешаГруппа = КлючиХеша.КлючиХешаГруппа;
Возврат Параметры;
@@ -113,9 +106,9 @@
// ТаблицаПредопределенных - ТаблицаЗначений - см.пбп_ПредопределенныеЗначенияПереопределяемый.ТаблицаПредопределенных
// ПолноеИмяОбъекта - Строка - Полное имя объекта метаданных.
//
Процедура ОбработатьНеиспользуемыеЭлементы(ТаблицаПредопределенных, ПолноеИмяОбъекта = "") Экспорт
Процедура ОбработатьНеиспользуемыеЭлементы(ТаблицаПредопределенных, ДополнительныеПараметры) Экспорт
ПолноеИмяОбъекта = ИмяОбъектаМетаданных(ПолноеИмяОбъекта);
ПолноеИмяОбъекта = ИмяОбъектаМетаданных(ДополнительныеПараметры.ПолноеИмя);
ТаблицаПредопределенных.Индексы.Добавить("ИдентификаторНастройки");
@@ -136,9 +129,10 @@
Запрос.Текст = СтрШаблон(ТекстЗапроса, ПолноеИмяОбъекта);
Если пбп_ОбщегоНазначенияПовтИсп.ПолучитьЗначениеКонстанты("пбп_ИспользоватьПользовательскиеФункции") Тогда
Запрос.Текст = пбп_СхемыЗапросов.ДобавитьОтборВЗапрос(Запрос.Текст,
"пбп_ПредопределенныеЗначения.ИдентификаторНастройки <> """"");
ИмяРеквизитаПред = ИмяПоляПредопределенности();
Реквизиты = ДополнительныеПараметры.ОбъектМетаданных.Реквизиты;
Если пбп_ПереадресацияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Реквизиты, ИмяРеквизитаПред) Тогда
Запрос = пбп_СхемыЗапросов.ДобавитьОтборВЗапрос(Запрос, "пбп_ПредопределенныеЗначения." + ИмяРеквизитаПред);
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
@@ -204,7 +198,7 @@
Для Каждого Строка Из ТаблицаПредопределенных Цикл
КлючиХеша = ?(Строка.ЭтоГруппа, ДополнительныеПараметры.КлючиХешаГруппа, ДополнительныеПараметры.КлючиХешаЭлемент);
ЗаполнитьЗначенияСвойств(КлючиХеша, Строка);
Строка.ХешСумма = пбп_Переадресация.КонтрольнаяСуммаСтрокой(КлючиХеша, ХешФункция.MD5);
Строка.Служебный_ХешСумма = пбп_Переадресация.КонтрольнаяСуммаСтрокой(КлючиХеша, ХешФункция.MD5);
КонецЦикла;
КонецПроцедуры
@@ -262,7 +256,7 @@
Для Каждого Строка Из ТаблицаПредопределенных Цикл
ВыборкаДетальныеЗаписи.Сбросить();
Если ВыборкаДетальныеЗаписи.НайтиСледующий(Строка.ИдентификаторНастройки, "ИдентификаторНастройки") Тогда
Если ВыборкаДетальныеЗаписи.РучноеИзменение Или ВыборкаДетальныеЗаписи.ХешСумма = Строка.ХешСумма
Если ВыборкаДетальныеЗаписи.РучноеИзменение Или ВыборкаДетальныеЗаписи.ХешСумма = Строка.Служебный_ХешСумма
И Не ВыборкаДетальныеЗаписи.ПометкаУдаления Тогда
СтрокиДляУдаления.Добавить(Строка);
Иначе
@@ -335,32 +329,6 @@
КонецФункции
// Формирует массив полей группы объекта метаданных
//
// Параметры:
// МенеджерОбъекта - СправочникМенеджер, ПланВидовХарактеристикМенеджер - менеджер объекта
// Поля - Массив - Поля предопределенного элемента.
//
// Возвращаемое значение:
// Массив - Строка
//
Функция ПолучитьПоляГруппы(МенеджерОбъекта, Поля) Экспорт
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗнч(МенеджерОбъекта));
мПоляГруппы = Новый Массив;
Для Каждого Поле Из Поля Цикл
Реквизит = ОбъектМетаданных.Реквизиты.Найти(Поле);
Если Реквизит = Неопределено
Или Реквизит.Использование <> Метаданные.СвойстваОбъектов.ИспользованиеРеквизита.ДляЭлемента Тогда
мПоляГруппы.Добавить(Поле);
КонецЕсли;
КонецЦикла;
Возврат мПоляГруппы
КонецФункции
#Область РаботаСТаблицейПредопределенных
// Инициализирует предопределенные значения из таблицы.
@@ -428,20 +396,118 @@
//
Функция КолонкиПредопределенныхЭлементов(Менеджер) Экспорт
Колонки = пбп_ПредопределенныеЗначенияПереопределяемый.ОбщиеКолонки(Менеджер);
КолонкиСОписанием = пбп_ПредопределенныеЗначенияПереопределяемый.ОбщиеКолонкиСОписаниемТипов(Менеджер);
Колонки = пбп_ПредопределенныеЗначенияПереопределяемый.ДобавляемыеСтандартныеПоля();
КолонкиОбъекта = ПоляОбъекта(Менеджер);
пбп_ПереадресацияКлиентСервер.ДополнитьМассив(Колонки, КолонкиОбъекта, Истина);
КолонкиОбъектаСОписанием = КолонкиСОписаниемТипов(Менеджер, Колонки);
пбп_ПереадресацияКлиентСервер.ДополнитьСтруктуру(КолонкиСОписанием, КолонкиОбъектаСОписанием);
Возврат КолонкиСОписанием;
КонецФункции
// Возвращает поля объекта из подсистемы предопределенных.
//
// Параметры:
// МенеджерОбъекта - СправочникМенеджер, ПланВидовХарактеристикМенеджер - Менеджер объекта
// из подсистемы предопределенных.
//
// Возвращаемое значение:
// Массив - Список полей объекта.
//
Функция ПоляОбъекта(МенеджерОбъекта) Экспорт
Выражение = пбп_ПредопределенныеЗначенияПовтИсп.ФункцииПолученияКолонокПредопределенныхЭлементов()
.Получить(ТипЗнч(Менеджер));
.Получить(ТипЗнч(МенеджерОбъекта));
Если Не ЗначениеЗаполнено(Выражение) Тогда
Возврат Колонки;
Возврат Новый Массив;
КонецЕсли;
ДопКолонки = пбп_Переадресация.ВычислитьВБезопасномРежиме(Выражение);
Возврат пбп_Переадресация.ВычислитьВБезопасномРежиме(Выражение);
пбп_ПереадресацияКлиентСервер.ДополнитьСтруктуру(Колонки, ДопКолонки);
КонецФункции
// Возвращает массив полей, которые необходимо дополнительно учитывать при расчёте хеша объекта.
//
// Параметры:
// МенеджерОбъекта - СправочникМенеджер, ПланВидовХарактеристикМенеджер - Менеджер объекта
// из подсистемы предопределенных.
//
// Возвращаемое значение:
// Массив - Массив строк с именами полей, участвующих в расчёте хеша.
// Если для типа объекта выражение не задано, возвращается пустой массив.
//
Функция ДобавляемыеПоляОбъектаДляРасчетаХеша(МенеджерОбъекта) Экспорт
Возврат Колонки;
Выражение = пбп_ПредопределенныеЗначенияПовтИсп.ФункцииПолученияДобавляемыхПолейДляРасчетаХеша()
.Получить(ТипЗнч(МенеджерОбъекта));
Если Не ЗначениеЗаполнено(Выражение) Тогда
Возврат Новый Массив;
КонецЕсли;
Возврат пбп_Переадресация.ВычислитьВБезопасномРежиме(Выражение);
КонецФункции
// Возвращает структуру, содержащую соответствие между именами колонок и их описанием типов.
//
// Параметры:
// МенеджерОбъекта - СправочникМенеджер, ПланВидовХарактеристикМенеджер - Менеджер объекта
// из подсистемы предопределенных.
// Колонки - Массив - Список колонок
//
// Возвращаемое значение:
// Структура - Структура, содержащая пары: <ИмяКолонки> - <ОписаниеТипов>.
// Если тип колонки определить не удалось, она не включается в результат.
//
Функция КолонкиСОписаниемТипов(МенеджерОбъекта, Колонки) Экспорт
ТипОбъекта = ТипЗнч(МенеджерОбъекта.ПустаяСсылка());
массив = Новый Массив;
массив.Добавить(ТипОбъекта);
ОписаниеТиповЭлемента = Новый ОписаниеТипов(массив);
МетаданныеОбъекта = Метаданные.НайтиПоТипу(ТипОбъекта);
РеквизитыОбъекта = МетаданныеОбъекта.Реквизиты;
СтандартныеРеквизиты = МетаданныеОбъекта.СтандартныеРеквизиты;
КолонкиСТипами = Новый Структура;
КолонкаГруппа = "ЭтоГруппа";
КолонкаРодитель = "Родитель";
Для Каждого Колонка Из Колонки Цикл
Если Колонка = КолонкаГруппа Тогда
КолонкиСТипами.Вставить(Колонка, Новый ОписаниеТипов("Булево"));
Продолжить;
КонецЕсли;
Если Колонка = КолонкаРодитель Тогда
КолонкиСТипами.Вставить(Колонка, ОписаниеТиповЭлемента);
Продолжить;
КонецЕсли;
Реквизит = РеквизитыОбъекта.Найти(Колонка);
Если Реквизит <> Неопределено Тогда
КолонкиСТипами.Вставить(Колонка, Реквизит.Тип);
Продолжить;
КонецЕсли;
ТипКолонки = ПолучитьТипКолонки(Колонка, РеквизитыОбъекта, СтандартныеРеквизиты);
Если ТипКолонки <> Неопределено Тогда
КолонкиСТипами.Вставить(Колонка, ТипКолонки);
КонецЕсли;
КонецЦикла;
Возврат КолонкиСТипами;
КонецФункции
@@ -464,6 +530,10 @@
Возврат "пбп_ПредопределенныеЗначения.ЗаполнениеПредопределенныхЭлементов";
КонецФункции
Функция ИмяПоляПредопределенности() Экспорт
Возврат "ЭтоПредопределенный";
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -598,13 +668,10 @@
ИсключаяСвойства = "Родитель";
Если ЗаполнитьТипЗначенияПВХ(ИсключаяСвойства, НовыйЭлемент, СтрокаТаблицы) Тогда
Возврат;
КонецЕсли;
ЗаполнитьЗначенияСвойств(НовыйЭлемент, СтрокаТаблицы, , ИсключаяСвойства);
ЗаполнитьЗначениеПВХПоУмолчанию(МенеджерОбъекта, НовыйЭлемент, СтрокаТаблицы.Служебный_ИерархияГруппИЭлементов);
Если ЗаполнитьТипЗначенияПВХ(ИсключаяСвойства, НовыйЭлемент, СтрокаТаблицы) Тогда
ЗаполнитьЗначениеПВХПоУмолчанию(МенеджерОбъекта, НовыйЭлемент, СтрокаТаблицы.Служебный_ИерархияГруппИЭлементов);
КонецЕсли;
Если СтрокаТаблицы.Служебный_Иерархический И ЗначениеЗаполнено(СтрокаТаблицы.ИдентификаторРодитель) Тогда
Родитель = ?(ЗначениеЗаполнено(СтрокаТаблицы.Родитель),
@@ -648,13 +715,10 @@
Свойства = ЗаполняемыеИсключаемыеСвойства(СтрокаТаблицы.Служебный_ИерархияГруппИЭлементов, Элемент.ЭтоГруппа);
Если ЗаполнитьТипЗначенияПВХ(Свойства.ИсключаяСвойства, Элемент, СтрокаТаблицы) Тогда
Возврат;
КонецЕсли;
ЗаполнитьЗначенияСвойств(Элемент, СтрокаТаблицы, Свойства.СписокСвойств, Свойства.ИсключаяСвойства);
ЗаполнитьЗначениеПВХПоУмолчанию(МенеджерОбъекта, Элемент, СтрокаТаблицы.Служебный_ИерархияГруппИЭлементов);
Если ЗаполнитьТипЗначенияПВХ(Свойства.ИсключаяСвойства, Элемент, СтрокаТаблицы) Тогда
ЗаполнитьЗначениеПВХПоУмолчанию(МенеджерОбъекта, Элемент, СтрокаТаблицы.Служебный_ИерархияГруппИЭлементов);
КонецЕсли;
Попытка
ЗаписатьЭлементИСвязанныеДанные(Элемент, КлючиХеша, Истина);
@@ -684,15 +748,16 @@
КонецПроцедуры
Функция ЗаполнитьТипЗначенияПВХ(ИсключаяСвойства, НовыйЭлемент, СтрокаТаблицы)
Функция ЗаполнитьТипЗначенияПВХ(ИсключаяСвойства, Элемент, СтрокаТаблицы)
Если Не пбп_ПереадресацияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(СтрокаТаблицы, "ТипЗначения") Тогда
Возврат Ложь;
Если Не пбп_ПереадресацияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(СтрокаТаблицы, "ТипЗначения")
Или СтрокаТаблицы.ЭтоГруппа Тогда
Возврат Ложь;
КонецЕсли;
ПроверяемыйТип = ТипЗнч(СтрокаТаблицы.ТипЗначения.ПривестиЗначение());
Если Не НовыйЭлемент.ТипЗначения.СодержитТип(ПроверяемыйТип) Тогда
Если Не Элемент.ТипЗначения.СодержитТип(ПроверяемыйТип) Тогда
ШаблонОшибки = НСтр("ru = 'Добавьте тип ''%1'' создаваемого элемента ''%2'' в план видов характеристик ''%3''';");
ТекстОшибки = СтрШаблон(ШаблонОшибки,
пбп_Переадресация.СтроковоеПредставлениеТипа(ПроверяемыйТип),
@@ -701,13 +766,13 @@
пбп_Переадресация.СообщитьПользователю(ТекстОшибки);
Возврат Истина;
Возврат Ложь;
КонецЕсли;
ИсключаяСвойства = ИсключаяСвойства + "," + "ТипЗначения";
НовыйЭлемент.ТипЗначения = СтрокаТаблицы.ТипЗначения;
Элемент.ТипЗначения = СтрокаТаблицы.ТипЗначения;
Возврат Ложь;
Возврат Истина;
КонецФункции
@@ -741,6 +806,21 @@
КонецФункции
Функция ПолучитьТипКолонки(ИмяКолонки, Реквизиты, СтандартныеРеквизиты)
Реквизит = Реквизиты.Найти(ИмяКолонки);
Если Реквизит <> Неопределено Тогда
Возврат Реквизит.Тип;
КонецЕсли;
Если пбп_ПереадресацияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(СтандартныеРеквизиты, ИмяКолонки) Тогда
Возврат СтандартныеРеквизиты[ИмяКолонки].Тип;
КонецЕсли;
Возврат Неопределено;
КонецФункции
#Область РаботаСТаблицейПредопределенных
Процедура СоздатьКолонкиТаблицыПредопределенныхЭлементов(СтруктураСКолонками, Таблица)

View File

@@ -57,7 +57,7 @@
<xr:Item xsi:type="xr:MDObjectRef">Role.ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок</xr:Item>
</DefaultRoles>
<Vendor>Первый БИТ</Vendor>
<Version>1.0.8.2</Version>
<Version>1.0.9.0</Version>
<UpdateCatalogAddress/>
<IncludeHelpInContents>false</IncludeHelpInContents>
<UseManagedFormInOrdinaryApplication>false</UseManagedFormInOrdinaryApplication>

View File

@@ -131,21 +131,14 @@
Функция КлючиХешаОбъект(Объект, ЭтоГруппа)
МенеджерОбъекта = пбп_Переадресация.МенеджерОбъектаПоСсылке(Объект);
КлючевыеПоля = пбп_ПредопределенныеЗначенияСлужебный.КолонкиПредопределенныхЭлементов(МенеджерОбъекта);
Если Не ЗначениеЗаполнено(КлючевыеПоля) Тогда
Возврат Новый Структура;
КонецЕсли;
мПоля = Новый Массив;
Для Каждого КлючЗначение Из КлючевыеПоля Цикл
мПоля.Добавить(КлючЗначение.Ключ);
КонецЦикла;
КлючиХеша = пбп_ПредопределенныеЗначения.КлючиХеша(МенеджерОбъекта);
Если ЭтоГруппа Тогда
мПоля = пбп_ПредопределенныеЗначенияСлужебный.ПолучитьПоляГруппы(МенеджерОбъекта, мПоля);
Возврат КлючиХеша.КлючиХешаГруппа;
КонецЕсли;
Возврат пбп_ПредопределенныеЗначения.КлючиХешаПредопределенногоЭлемента(мПоля, ЭтоГруппа);
Возврат КлючиХеша.КлючиХешаЭлемент;
КонецФункции

View File

@@ -1,23 +0,0 @@
<?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="72ba480f-6821-47a5-bc00-b831bdee3765">
<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>false</ExternalConnection>
<ClientOrdinaryApplication>false</ClientOrdinaryApplication>
<ServerCall>false</ServerCall>
<Privileged>false</Privileged>
<ReturnValuesReuse>DontUse</ReturnValuesReuse>
</Properties>
</CommonModule>
</MetaDataObject>

View File

@@ -1,80 +0,0 @@
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ДобавитьТестовыйНабор("Ключи хеша предопределенного элемента")
.ДобавитьТест("Тест_КлючиХеша_ФормированиеКлючейЭлемент")
.ДобавитьТест("Тест_КлючиХеша_ФормированиеКлючейГруппа")
.ДобавитьТест("Тест_КлючиХеша_ПустойМассив")
;
КонецПроцедуры
Процедура Тест_КлючиХеша_ФормированиеКлючейЭлемент() Экспорт
Поля = Новый Массив;
Поля.Добавить("Поле1");
Поля.Добавить("Поле2");
Поля.Добавить("Служебный_Поле3");
Поля.Добавить("Поле4");
ИсключаемыеПоля = Новый Структура;
ИсключаемыеПоля.Вставить("Поле2", Истина);
Мокито.Обучение(пбп_ПредопределенныеЗначенияПереопределяемый)
.Когда("ИсключаемыеПоляДляРасчетаХешаЭлемент")
.Вернуть(ИсключаемыеПоля)
.Прогон();
Ожидаемое = Новый Структура("Поле1,Поле4");
Результат = пбп_ПредопределенныеЗначения.КлючиХешаПредопределенногоЭлемента(Поля, Ложь);
ЮТест.ОжидаетЧто(Результат).Равно(Ожидаемое);
КонецПроцедуры
Процедура Тест_КлючиХеша_ФормированиеКлючейГруппа() Экспорт
Поля = Новый Массив;
Поля.Добавить("Поле1");
Поля.Добавить("Поле2");
ИсключаемыеПоля = Новый Структура;
ИсключаемыеПоля.Вставить("Поле1", Истина);
Мокито.Обучение(пбп_ПредопределенныеЗначенияПереопределяемый)
.Когда("ИсключаемыеПоляДляРасчетаХешаГруппа")
.Вернуть(ИсключаемыеПоля)
.Прогон()
;
Ожидаемое = Новый Структура("Поле2");
Результат = пбп_ПредопределенныеЗначения.КлючиХешаПредопределенногоЭлемента(Поля, Истина);
ЮТест.ОжидаетЧто(Результат).Равно(Ожидаемое);
КонецПроцедуры
Процедура Тест_КлючиХеша_ПустойМассив() Экспорт
Поля = Новый Массив;
ИсключаемыеПоля = Новый Структура;
Мокито.Обучение(пбп_ПредопределенныеЗначенияПереопределяемый)
.Когда("ИсключаемыеПоляДляРасчетаХешаЭлемент")
.Вернуть(ИсключаемыеПоля)
.Прогон();
Ожидаемое = Новый Структура;
Результат = пбп_ПредопределенныеЗначения.КлючиХешаПредопределенногоЭлемента(Поля);
ЮТест.ОжидаетЧто(Результат).Равно(Ожидаемое);
КонецПроцедуры
#КонецОбласти

View File

@@ -1,18 +0,0 @@
<?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="b2bc88d0-efe0-47e2-8da8-8d45fe0261d4">
<InternalInfo/>
<Properties>
<ObjectBelonging>Adopted</ObjectBelonging>
<Name>пбп_ПредопределенныеЗначенияПереопределяемый</Name>
<Comment/>
<ExtendedConfigurationObject>851dcd44-ce5b-4677-a1cc-a1879f022eec</ExtendedConfigurationObject>
<Global>false</Global>
<ClientManagedApplication>false</ClientManagedApplication>
<Server>true</Server>
<ExternalConnection>true</ExternalConnection>
<ClientOrdinaryApplication>false</ClientOrdinaryApplication>
<ServerCall>false</ServerCall>
</Properties>
</CommonModule>
</MetaDataObject>

View File

@@ -1,47 +0,0 @@

&Вместо("ИсключаемыеПоляДляРасчетаХешаЭлемент")
Функция Мок_ИсключаемыеПоляДляРасчетаХешаЭлемент()
ПараметрыМетода = Новый Массив;
Возврат ВыполнитьПерехватМетода("ИсключаемыеПоляДляРасчетаХешаЭлемент", ПараметрыМетода);
КонецФункции
&Вместо("ИсключаемыеПоляДляРасчетаХешаГруппа")
Функция Мок_ИсключаемыеПоляДляРасчетаХешаГруппа()
ПараметрыМетода = Новый Массив;
Возврат ВыполнитьПерехватМетода("ИсключаемыеПоляДляРасчетаХешаГруппа", ПараметрыМетода);
КонецФункции
#Область СлужебныеПроцедурыИФункции
// Выполняет перехват вызова метода
//
// Параметры:
// ИмяМетода - Строка - Имя перехватываемого метода
// Параметры - Массив - Параметры метода
//
// Возвращаемое значение:
// Произвольный - Результат вызова
//
Функция ВыполнитьПерехватМетода(ИмяМетода, ПараметрыМетода)
ПрерватьВыполнение = Ложь;
Результат = МокитоПерехват.АнализВызова(пбп_ПредопределенныеЗначенияПереопределяемый,
ИмяМетода,
ПараметрыМетода,
ПрерватьВыполнение);
Если НЕ ПрерватьВыполнение Тогда
Возврат ПродолжитьВызов();
Иначе
Возврат Результат;
КонецЕсли;
КонецФункции
#КонецОбласти

View File

@@ -161,9 +161,7 @@
<CommonModule>ЮТЧитательСлужебныйВызовСервера</CommonModule>
<CommonModule>ОМ_ОбщегоНазаначенияСервер</CommonModule>
<CommonModule>ОМ_КоннекторHTTP</CommonModule>
<CommonModule>ОМ_ПредопределенныеЗначения</CommonModule>
<CommonModule>ОМ_ПредопределенныеЗначенияСлужебный</CommonModule>
<CommonModule>пбп_ПредопределенныеЗначенияПереопределяемый</CommonModule>
<CommonModule>ОМ_ПредопределенныеЗначенияВызовСервера</CommonModule>
<CommonModule>пбп_ПредопределенныеЗначения</CommonModule>
<CommonModule>ОМ_ПостроительСпецификацииOpenAPI</CommonModule>