С Новым годом! Форум программистов, компьютерный форум, киберфорум
sigmov
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

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

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

Мне не раз было необходимо проверить некий источник(фиг знает какого типа) на наличие реквизита или одно из нужных реквизитов. Такая вот попытка притянуть на 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. {ИмяНайденного, [Строка]} - (возвращаемый) имя найденного реквизита, если был найден, имеет смысл если в качестве искомого выступало более чем одно имя
// Возвращаемое значение:
//   Булево - истина, если реквизит есть, ложь - иначе
Функция ЕстьРеквизитОбъекта(Знач Объект, Знач Реквизит, ЗначениеРеквизита = Неопределено, Знач СтрогийТип = Неопределено, ДополнительныеПараметры = Неопределено) ЭКСПОРТ
    Перем КлючУникальности, ТипРеквизит, ТипСтрогогоТипа, МассивТипов, ЗначениеРеквизитаПоКлючу;
 
    Если Объект = Неопределено Тогда Возврат Ложь; КонецЕсли;
    Если (ДополнительныеПараметры = Неопределено) Тогда ДополнительныеПараметры = Новый Структура; КонецЕсли;
    
    ТипРеквизит = ТипЗнч(Реквизит); // Конвертируем реквизит в структуру
    Если        ТипРеквизит = Тип("Строка")                                                             Тогда Реквизит = Новый Структура(Реквизит);
    ИначеЕсли  ТипРеквизит = Тип("Структура")                                                           Тогда ;
    ИначеЕсли  ТипРеквизит = Тип("ФиксированнаяСтруктура")                                             Тогда Реквизит = Новый Структура(Реквизит);
    ИначеЕсли  ТипРеквизит = Тип("Массив") ИЛИ ТипРеквизит = Тип("ФиксированныйМассив")                Тогда СтарыйРеквизит = Реквизит; Реквизит = Новый Структура; Для Каждого Подреквизит Из СтарыйРеквизит Цикл Если (НЕ Реквизит.Свойство(Строка(Подреквизит))) Тогда Реквизит.Вставить(Строка(Подреквизит)); КонецЕсли; КонецЦикла; 
    ИначеЕсли  ТипРеквизит = Тип("Соответствие") ИЛИ ТипРеквизит = Тип("ФиксированноеСоответствие")    Тогда СтарыйРеквизит = Реквизит; Реквизит = Новый Структура; Для Каждого Подреквизит Из СтарыйРеквизит Цикл Реквизит.Вставить(Строка(Подреквизит.Ключ)); КонецЦикла; 
    Иначе Реквизит = Новый Структура(Реквизит);
    КонецЕсли; 
    
    КлючУникальности = Новый УникальныйИдентификатор;   // Заполняем данные значением ключа уникальности (ЗЗС его перезатрет)
    Для Каждого КлючЗначение Из Реквизит Цикл Реквизит[КлючЗначение.Ключ] = КлючУникальности; КонецЦикла;  
    ЗаполнитьЗначенияСвойств(Реквизит, Объект);           // Заполняем данные из источника
    
    Если СтрогийТип <> Неопределено Тогда // Фишка со строгим контролем типа
        ТипСтрогогоТипа = ТипЗнч(СтрогийТип);
        Если        ТипСтрогогоТипа = Тип("Тип")                   Тогда МассивТипов = Новый Массив(); МассивТипов.Добавить(СтрогийТип); СтрогийТип = Новый ОписаниеТипов(МассивТипов);     // Тип -> МассивТипов -> ОписаниеТипов
        ИначеЕсли  ТипСтрогогоТипа = Тип("ОписаниеТипов")           Тогда ;                                                                                                                // ОписаниеТипов
        ИначеЕсли  ТипСтрогогоТипа = Тип("Массив")                 Тогда СтрогийТип = Новый ОписаниеТипов(СтрогийТип);                                                                  // Массив -> ОписаниеТипов
        ИначеЕсли  ТипСтрогогоТипа = Тип("ФиксированныйМассив")   Тогда СтрогийТип = Новый ОписаниеТипов(Новый Массив(СтрогийТип));                                                         // ФиксированныйМассив -> Массив -> ОписаниеТипов
        ИначеЕсли  ТипСтрогогоТипа = Тип("Строка")                 Тогда СтрогийТип = Новый ОписаниеТипов(СтрогийТип);                                                                  // Строка -> ОписаниеТипов
        Иначе СтрогийТип = Новый ОписаниеТипов(СтрогийТип); 
        КонецЕсли;                                
    КонецЕсли;
    
    Для Каждого КлючЗначение Из Реквизит Цикл
        ЗначениеРеквизитаПоКлючу = КлючЗначение.Значение;
        Если (ЗначениеРеквизитаПоКлючу <> КлючУникальности) Тогда Если (СтрогийТип = Неопределено) ИЛИ СтрогийТип.СодержитТип(ТипЗнч(ЗначениеРеквизитаПоКлючу)) Тогда ЗначениеРеквизита = ЗначениеРеквизитаПоКлючу; Если ДополнительныеПараметры.Свойство("ИмяНайденного") Тогда ДополнительныеПараметры["ИмяНайденного"] = КлючЗначение.Ключ; Иначе ДополнительныеПараметры.Вставить("ИмяНайденного", КлючЗначение.Ключ); КонецЕсли; Возврат Истина; КонецЕсли; КонецЕсли;
    КонецЦикла;
    
    Возврат Ложь;    
КонецФункции
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru