1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| // Проверяет наличие реквизита у объекта #Лелеко
// Версия: 1.1.4.4.-
// Параметры:
// Объект - произвольный - некий объект
// Реквизит - Строка, Массив, Структура, Соответствие - имя искомого реквизита/реквизитов, в случае не одного имени имена считаются равнозначными и допустимыми, возвращется первое найденное
// 1. Строка - имя проверяемого реквизита или имена равнозначных реквизитов через ',' (тогда будет возвращен первый найденный, удовлетворяющий условиям)
// 2. Массив - массив имен реквизитов
// 3. Структура - структура, содержащая в ключах имена реквизитов
// 4. Соответствие - соответсвие, содержащее в ключах имена реквизитов
// ЗначениеРеквизита - Произвольный - (возвращаемый) значение реквизита, если был найден, иначе - неизменное значение
// СтрогийТип - Тип, ОписаниеТипов, Строка - дополнительная проверка найденного реквизита на соответсвие типу, если реквизит не соответсвует типу, то он не возвращается, поиск продолжается
// *. Строка - строка, содержащая имена подлежащих типов через ','
// ДополнительныеПараметры - Структура - (передаваемый / возвращаемый)
// 1. {ИмяНайденного, [Строка]} - (возвращаемый) имя найденного реквизита, если был найден, имеет смысл если в качестве искомого выступало более чем одно имя
// Возвращаемое значение:
// Булево - истина, если реквизит есть, ложь - иначе
Функция ЕстьРеквизитОбъекта(Знач Объект, Знач Реквизит, ЗначениеРеквизита = Неопределено, Знач СтрогийТип = Неопределено, ДополнительныеПараметры = Неопределено) ЭКСПОРТ
Перем КлючУникальности, ТипРеквизит, ТипСтрогогоТипа, МассивТипов, ЗначениеРеквизитаПоКлючу;
Если Объект = Неопределено Тогда Возврат Ложь; КонецЕсли;
Если (ДополнительныеПараметры = Неопределено) Тогда ДополнительныеПараметры = Новый Структура; КонецЕсли;
ТипРеквизит = ТипЗнч(Реквизит); // Конвертируем реквизит в структуру
Если ТипРеквизит = Тип("Строка") Тогда Реквизит = Новый Структура(Реквизит);
ИначеЕсли ТипРеквизит = Тип("Структура") Тогда ;
ИначеЕсли ТипРеквизит = Тип("ФиксированнаяСтруктура") Тогда Реквизит = Новый Структура(Реквизит);
ИначеЕсли ТипРеквизит = Тип("Массив") ИЛИ ТипРеквизит = Тип("ФиксированныйМассив") Тогда СтарыйРеквизит = Реквизит; Реквизит = Новый Структура; Для Каждого Подреквизит Из СтарыйРеквизит Цикл Если (НЕ Реквизит.Свойство(Строка(Подреквизит))) Тогда Реквизит.Вставить(Строка(Подреквизит)); КонецЕсли; КонецЦикла;
ИначеЕсли ТипРеквизит = Тип("Соответствие") ИЛИ ТипРеквизит = Тип("ФиксированноеСоответствие") Тогда СтарыйРеквизит = Реквизит; Реквизит = Новый Структура; Для Каждого Подреквизит Из СтарыйРеквизит Цикл Реквизит.Вставить(Строка(Подреквизит.Ключ)); КонецЦикла;
Иначе Реквизит = Новый Структура(Реквизит);
КонецЕсли;
КлючУникальности = Новый УникальныйИдентификатор; // Заполняем данные значением ключа уникальности (ЗЗС его перезатрет)
Для Каждого КлючЗначение Из Реквизит Цикл Реквизит[КлючЗначение.Ключ] = КлючУникальности; КонецЦикла;
ЗаполнитьЗначенияСвойств(Реквизит, Объект); // Заполняем данные из источника
Если СтрогийТип <> Неопределено Тогда // Фишка со строгим контролем типа
ТипСтрогогоТипа = ТипЗнч(СтрогийТип);
Если ТипСтрогогоТипа = Тип("Тип") Тогда МассивТипов = Новый Массив(); МассивТипов.Добавить(СтрогийТип); СтрогийТип = Новый ОписаниеТипов(МассивТипов); // Тип -> МассивТипов -> ОписаниеТипов
ИначеЕсли ТипСтрогогоТипа = Тип("ОписаниеТипов") Тогда ; // ОписаниеТипов
ИначеЕсли ТипСтрогогоТипа = Тип("Массив") Тогда СтрогийТип = Новый ОписаниеТипов(СтрогийТип); // Массив -> ОписаниеТипов
ИначеЕсли ТипСтрогогоТипа = Тип("ФиксированныйМассив") Тогда СтрогийТип = Новый ОписаниеТипов(Новый Массив(СтрогийТип)); // ФиксированныйМассив -> Массив -> ОписаниеТипов
ИначеЕсли ТипСтрогогоТипа = Тип("Строка") Тогда СтрогийТип = Новый ОписаниеТипов(СтрогийТип); // Строка -> ОписаниеТипов
Иначе СтрогийТип = Новый ОписаниеТипов(СтрогийТип);
КонецЕсли;
КонецЕсли;
Для Каждого КлючЗначение Из Реквизит Цикл
ЗначениеРеквизитаПоКлючу = КлючЗначение.Значение;
Если (ЗначениеРеквизитаПоКлючу <> КлючУникальности) Тогда Если (СтрогийТип = Неопределено) ИЛИ СтрогийТип.СодержитТип(ТипЗнч(ЗначениеРеквизитаПоКлючу)) Тогда ЗначениеРеквизита = ЗначениеРеквизитаПоКлючу; Если ДополнительныеПараметры.Свойство("ИмяНайденного") Тогда ДополнительныеПараметры["ИмяНайденного"] = КлючЗначение.Ключ; Иначе ДополнительныеПараметры.Вставить("ИмяНайденного", КлючЗначение.Ключ); КонецЕсли; Возврат Истина; КонецЕсли; КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции |