Форум программистов, компьютерный форум, киберфорум
Наши страницы
sigmov
Войти
Регистрация
Восстановить пароль
Оценить эту запись

1С 8.Х Гибкая проверка любого объекта на наличие реквизита

Запись от sigmov размещена 18.08.2015 в 07:45

Мне не раз было необходимо проверить некий источник(фиг знает какого типа) на наличие реквизита или одно из нужных реквизитов. Такая вот попытка притянуть на 1С утиную типизацию.

Решил вот поделиться своей функцией проверки/получения реквизита у произвольного источника. В основу положена функция из ЗУП, но значительно расширенна.

1C
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. {ИмяНайденного, [Строка]} - (возвращаемый) имя найденного реквизита, если был найден, имеет смысл если в качестве искомого выступало более чем одно имя
// Возвращаемое значение:
//   Булево - истина, если реквизит есть, ложь - иначе
Функция ЕстьРеквизитОбъекта(Знач Объект, Знач Реквизит, ЗначениеРеквизита = Неопределено, Знач СтрогийТип = Неопределено, ДополнительныеПараметры = Неопределено) ЭКСПОРТ
    Перем КлючУникальности, ТипРеквизит, ТипСтрогогоТипа, МассивТипов, ЗначениеРеквизитаПоКлючу;
 
    Если Объект = Неопределено Тогда Возврат Ложь; КонецЕсли;
    Если (ДополнительныеПараметры = Неопределено) Тогда ДополнительныеПараметры = Новый Структура; КонецЕсли;
    
    ТипРеквизит = ТипЗнч(Реквизит); // Конвертируем реквизит в структуру
    Если        ТипРеквизит = Тип("Строка")                                                             Тогда Реквизит = Новый Структура(Реквизит);
    ИначеЕсли   ТипРеквизит = Тип("Структура")                                                          Тогда ;
    ИначеЕсли   ТипРеквизит = Тип("ФиксированнаяСтруктура")                                             Тогда Реквизит = Новый Структура(Реквизит);
    ИначеЕсли   ТипРеквизит = Тип("Массив") ИЛИ ТипРеквизит = Тип("ФиксированныйМассив")                Тогда СтарыйРеквизит = Реквизит; Реквизит = Новый Структура; Для Каждого Подреквизит Из СтарыйРеквизит Цикл Если (НЕ Реквизит.Свойство(Строка(Подреквизит))) Тогда Реквизит.Вставить(Строка(Подреквизит)); КонецЕсли; КонецЦикла; 
    ИначеЕсли   ТипРеквизит = Тип("Соответствие") ИЛИ ТипРеквизит = Тип("ФиксированноеСоответствие")    Тогда СтарыйРеквизит = Реквизит; Реквизит = Новый Структура; Для Каждого Подреквизит Из СтарыйРеквизит Цикл Реквизит.Вставить(Строка(Подреквизит.Ключ)); КонецЦикла; 
    Иначе Реквизит = Новый Структура(Реквизит);
    КонецЕсли; 
    
    КлючУникальности = Новый УникальныйИдентификатор;   // Заполняем данные значением ключа уникальности (ЗЗС его перезатрет)
    Для Каждого КлючЗначение Из Реквизит Цикл Реквизит[КлючЗначение.Ключ] = КлючУникальности; КонецЦикла;  
    ЗаполнитьЗначенияСвойств(Реквизит, Объект);         // Заполняем данные из источника
    
    Если СтрогийТип <> Неопределено Тогда // Фишка со строгим контролем типа
        ТипСтрогогоТипа = ТипЗнч(СтрогийТип);
        Если        ТипСтрогогоТипа = Тип("Тип")                    Тогда МассивТипов = Новый Массив(); МассивТипов.Добавить(СтрогийТип); СтрогийТип = Новый ОписаниеТипов(МассивТипов);    // Тип -> МассивТипов -> ОписаниеТипов
        ИначеЕсли   ТипСтрогогоТипа = Тип("ОписаниеТипов")          Тогда ;                                                                                                                 // ОписаниеТипов
        ИначеЕсли   ТипСтрогогоТипа = Тип("Массив")                 Тогда СтрогийТип = Новый ОписаниеТипов(СтрогийТип);                                                                     // Массив -> ОписаниеТипов
        ИначеЕсли   ТипСтрогогоТипа = Тип("ФиксированныйМассив")    Тогда СтрогийТип = Новый ОписаниеТипов(Новый Массив(СтрогийТип));                                                       // ФиксированныйМассив -> Массив -> ОписаниеТипов
        ИначеЕсли   ТипСтрогогоТипа = Тип("Строка")                 Тогда СтрогийТип = Новый ОписаниеТипов(СтрогийТип);                                                                     // Строка -> ОписаниеТипов
        Иначе СтрогийТип = Новый ОписаниеТипов(СтрогийТип); 
        КонецЕсли;                             
    КонецЕсли;
    
    Для Каждого КлючЗначение Из Реквизит Цикл
        ЗначениеРеквизитаПоКлючу = КлючЗначение.Значение;
        Если (ЗначениеРеквизитаПоКлючу <> КлючУникальности) Тогда Если (СтрогийТип = Неопределено) ИЛИ СтрогийТип.СодержитТип(ТипЗнч(ЗначениеРеквизитаПоКлючу)) Тогда ЗначениеРеквизита = ЗначениеРеквизитаПоКлючу; Если ДополнительныеПараметры.Свойство("ИмяНайденного") Тогда ДополнительныеПараметры["ИмяНайденного"] = КлючЗначение.Ключ; Иначе ДополнительныеПараметры.Вставить("ИмяНайденного", КлючЗначение.Ключ); КонецЕсли; Возврат Истина; КонецЕсли; КонецЕсли;
    КонецЦикла;
    
    Возврат Ложь;   
КонецФункции
Размещено в Без категории
Просмотров 1247 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru