Проверить есть ли реквизит у объекта 1с бсп

// Проверяет наличие реквизита или свойства у произвольного объекта без обращения к метаданным.
//
// Параметры:
//  Объект       — Произвольный — объект, у которого нужно проверить наличие реквизита или свойства;
//  ИмяРеквизита — Строка       — имя реквизита или свойства.
//
// Возвращаемое значение:
//  Булево — Истина, если есть.
//
Функция ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) Экспорт

   КлючУникальности   = Новый УникальныйИдентификатор;
   СтруктураРеквизита = Новый Структура(ИмяРеквизита, КлючУникальности);
   ЗаполнитьЗначенияСвойств(СтруктураРеквизита, Объект);

   Возврат СтруктураРеквизита[ИмяРеквизита] <> КлючУникальности;

КонецФункции

Есть ли реквизит у объекта

Я
   Мандалай

15.05.18 — 15:12

Добрый день.

Как проверить есть ли у объекта реквизит?

Объектом может быть как объект конфигурации (документ, справочник), так и структура и реквизит формы или строка ТЧ.

  

Партнерская программа EFSOL Oblako

   RomanYS

1 — 15.05.18 — 15:13

(0) или Попытка, или анализ типов и дальше либо Свойство() для структуры метаданные для всего остального

   dezss

2 — 15.05.18 — 15:13

Если хочется универсальности, то либо городить кучу условий, либо попытка-исключение)

   Мандалай

3 — 15.05.18 — 15:14

В БСП ничего похожего нет?

   mehfk

4 — 15.05.18 — 15:17

   drei

5 — 15.05.18 — 15:18

(0) Создать структуру с именем реквизита и значением — уникальным идентификатором. Заполнить значение свойств и посмотреть, что изменилось в структуре.

Попытошники, бл.

   Мандалай

6 — 15.05.18 — 15:21

(4)Не то, там объект метаданных. Прежде чем гуглом кидаться надо читать, что в результате поиска.

(5)Идея хорошая, но много букв. Я рассчитывал на что-то готовое.

   GANR

9 — 15.05.18 — 15:27

Объект.Метаданные().Реквизиты.Найти(ТвойРеквизит)

   GANR

17 — 15.05.18 — 15:46

(11) а вот так?

Функция НаличиеСвойстваУОбъекта(Объект, ИмяСвойства)

ИдентификаторОтсутствия = Новый УникальныйИдентификатор;

Структура = новый Структура(ИмяСвойства, ИдентификаторОтсутствия);

ЗаполнитьЗначенияСвойств(Структура, Объект);

Возврат Структура[ИмяСвойства] <> ИдентификаторОтсутствия

конецФункции

   GANR

18 — 15.05.18 — 15:48

Ну еще через Попытку/Исключение можно

   Мандалай

19 — 15.05.18 — 16:06

(17) Ну да, это как раз то, что я хотел, но думал что уже есть готовое решение в БСП или какой-нибудь метод хитрый.

Спасибо. И без всяких там гуглов.

   Базис

20 — 15.05.18 — 16:11

(19) Будь как бобр, сравни скорость обоих вариантов и поведай нам.

   GANR

21 — 15.05.18 — 16:31

(19) В БСП не видел — токо через Попытка/Исключение.

   1sanekmaloi1

22 — 15.05.18 — 16:41

(19)Это и есть готовое решение из типовых конф, всякие УТ ЕРП и т.д.

   Мандалай

23 — 15.05.18 — 16:55

(22)Поиск по конфигурации не дал результатов. ЕРП 2.2.

   Адинэснег

24 — 15.05.18 — 16:58

   Buster007

25 — 15.05.18 — 17:00

а если ИмяСвойства будет реквизит с типом данныеформыколлекция, то что будет?

   AlvlSpb

26 — 15.05.18 — 17:02

(22) Не совсем верно. Для ТЧ в типовых есть функция в общем модуле (например для УТ):

ОбщегоНазначенияУТ.ЕстьРеквизитТабЧастиОбъекта(ИмяРеквизита, МетаданныеОбъекта, ИмяТабЧасти)

   AlvlSpb

27 — 15.05.18 — 17:05

(26) + В других это общ модуль ОбщегоНазначения и функция может называться ЕстьРеквизитТабЧастиДокумента. Возвращает Истину или Ложь проверки наличия конкретного реквизита ТЧ

   Михаил Козлов

28 — 15.05.18 — 17:15

(26)(27) Это касается только метаданных.

   1sanekmaloi1

29 — 15.05.18 — 17:17

(23)А если искать функцию ЕстьРеквизитОбъекта

   AlvlSpb

30 — 15.05.18 — 17:20

(28) Какая разница?! Задача определить наличие или отсутствие реквизита ТЧ. А как это делается вторично

  

AlvlSpb

31 — 15.05.18 — 17:22

(29) ТОже есть Для УТ

ОбщегоНазначенияУТКлиентСервер.ЕстьРеквизитОбъекта(Объект, ИмяРеквизита)

Привел как пример, что до нас все уже изобрели и нет смысла выдумывать велосипед

Содержание:

1.      Когда возникает необходимость проверить наличие реквизита 1С?

2.      Как можно получить метаданные объекта 1С?  

1.    Когда возникает необходимость проверить наличие реквизита 1С

Потребность проверки наличия реквизита обычно возникает при написании общих, универсальных процедур или функций, к примеру, когда необходимо выполнить ряд однообразных действий, проверить заполнение перед проведением, при этом реквизитный состав обрабатываемых объектов метаданных отличается незначительно (например, в документе, отражающем продажу товара, есть реквизит Склад, а в документе, отражающем перемещение товара – реквизиты Склад-отправитель и Склад-получатель).

В ряде типовых конфигураций 1С предлагается стандартная функция проверки наличия реквизита в объекте (расположена в модуле “ОбщегоНазначения”)

Функция ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта) Экспорт

            Возврат НЕ (МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено);

КонецФункции   

2. Как можно получить метаданные объекта 1С

Однако написать свою функцию также не представляет труда. В первую очередь необходимо получить метаданные объекта 1С одним из способов:

через функцию Метаданные() объекта

пример синтаксиса: СправочникСсылка.Метаданные()

                                    ДокументСсылка.Метаданные()

через свойство глобального контекста Метаданные

пример синтаксиса: Метаданные.Справочники.[ИмяСправочника]

                                    Метаданные.Документы.[ИмяДокумента]

Далее через свойство “Реквизиты” использовать функцию Найти(). В случае, если реквизит не найден, возвращается значение Неопределено.

Пример 1

Метаданные = Контрагент.Метаданные();

Если Метаданные.Реквизиты.Найти(«Ответственный») = Неопределено Тогда

            Возврат Ложь;

Иначе

            Возврат Истина;

КонецЕсли;

Пример 2

Функция ПолучитьОрганизацию(Контрагент, Пользователь)

            Если Метаданные.Справочники.Контрагенты.Реквизиты.Найти(«Организация») <> Неопределено Тогда

                        Возврат Контрагент.Организация;

            Иначе

                        Возврат Пользователь.Организация;

            КонецЕсли;

КонецФункции

Описанный алгоритм подходит для случаев проверки наличия реквизита шапки. Но что делать, когда возникает необходимость определить, существует ли реквизит в табличной части 1С (справочника или документа)? Для этого используется следующая конструкция:

Метаданные.Справочники.<ИмяСправочника>.ТабличныеЧасти.Реквизиты.Найти(<ИмяОбъектаПоиска>).

При обработке таблиц значений также возможно выполнить проверку существования колонки – в этом случае применяется метод Свойство(), с помощью которого, помимо основной функции – получения значения элемента по указанному имени, можно проверить, имеется ли указанного свойство.

Пример синтаксиса:

Если НЕ ТекущаяСтрока.Свойство(«Исключить») ИЛИ НЕ ТекущаяСтрока.Исключить Тогда

            ЗаполнитьЗначенияСвойств(ТаблицаЗагрузки.Добавить(); ТекущаяСтрока);

КонецЕсли;

Специалист компании ООО «Кодерлайн»

Кондренко Анна Сергеевна

Полезные функции БСП

Список часто востребованных, по моему мнению, функций из состава Библиотеки стандартных подсистем 2.2.

1.


// Возвращает структуру, содержащую значения реквизитов прочитанные из информационной базы
// по ссылке на объект.
ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, Знач Реквизиты)

Пример:


РеквизитыКонтрагента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Контрагент, "Наименование, ИНН, КПП");

Скажете, что можно написать Контрагент.Наименование проще, чем обращаться к функции, но не многие знают, что обращение через точку считывает значение всех реквизитов объекта, что не производительно для объектов с реквизитами типа ХранилищеЗначения например.

2.


// Проверяет наличие ссылок на объект в базе данных
ОбщегоНазначения.ЕстьСсылкиНаОбъект(Знач СсылкаИлиМассивСсылок, Знач ИскатьСредиСлужебныхОбъектов = Ложь,  ДругиеИсключения = Неопределено)
 
Пример:
Если ОбщегоНазначения.ЕстьСсылкиНаОбъект(Контрагент) Тогда
     Продолжить;
КонецЕсли;

Можно использовать в своей обработке, например при удалении данных проверять ссылки, к тому же в отличии от встроенной функции НайтиСсылки, работает параметр ИсключаемыеОбъекты, что не есть плохо.

3.


//Позволяет определить, есть ли среди реквизитов объекта реквизит с переданным именем
ОбщегоНазначения.ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта)
 
Пример:
Для Каждого ДокументОбъект Из МассивДокументов Цикл
     Если ОбщегоНазначения.ЕстьРеквизитОбъекта("Организация", ДокументОбъект.Метаданные()) Тогда
          ДокументОбъект.Организация = Организация;
     КонецЕсли;
КонецЦикла;

4.


// Получает файл из Интернета по протоколу http(s), либо ftp и сохраняет его по указанному пути на сервере.
ПолучениеФайловИзИнтернета.СкачатьФайлНаСервере(Знач URL, ПараметрыПолучения = Неопределено, Знач ЗаписыватьОшибку = Истина)

5.


// Проверяет, является ли текущий или указанный пользователь полноправным.
Пользователи.ЭтоПолноправныйПользователь()
 
Пример:
Если НЕ Пользователи.ЭтоПолноправныйПользователь() Тогда
     ВызватьИсключение НСтр("ru = 'У Вас нет доступа!'");
КонецЕсли;

6.


// Получает номер документа для вывода на печать; из номера удаляются префиксы и лидирующие нули
ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать(Знач НомерОбъекта, УдалитьПрефиксИнформационнойБазы = Ложь, УдалитьПользовательскийПрефикс = Ложь)

Пример:


НомерНаПечать = ПрефиксацияОбъектовКлиентСервер.ПолучитьНомерНаПечать("УТПД-00023", Истина, Истина);
//НомерНаПечать будет равен строке "23"

Полезно для тех кто делает дополнительные печатные формы.

7.


// Возвращает курс валюты на дату.
РаботаСКурсамиВалют.ПолучитьКурсВалюты(Валюта, ДатаКурса)

Пример:


//Получение курса валюты документа на 30 января 2014 года
Курс = РаботаСКурсамиВалют.ПолучитьКурсВалюты(ВалютаДокумента, Дата(2014, 01, 30));

8.


// Подставляет параметры в строку. Максимально возможное число параметров - 9.
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Знач СтрокаПодстановки,
     Знач Параметр1, Знач Параметр2 = Неопределено, Знач Параметр3 = Неопределено,
     Знач Параметр4 = Неопределено, Знач Параметр5 = Неопределено, Знач Параметр6 = Неопределено,
     Знач Параметр7 = Неопределено, Знач Параметр8 = Неопределено, Знач Параметр9 = Неопределено)

Очень полезная функция, номер параметра задается знаком процента, пример:


Шаблон = "Недостаточно номенклатуры %1 на складе %2 в количестве %3 шт.";
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(Шаблон, Номенклатура, Склад, КоличествоОстаток);

Советую более подробно посмотреть все функции модуля СтроковыеФункцииКлиентСервер.

9.


// Открывает Проводник Windows и выделяет указанный файл.
// пример: ""С:Tempreport.txt"
ФайловыеФункцииСлужебныйКлиент.ОткрытьПроводникСФайлом(Знач ПолноеИмяФайла)

 10.


// Запускает выполнение процедуры в фоновом задании
ДлительныеОперации.ЗапуститьВыполнениеВФоне(Знач ИдентификаторФормы, Знач ИмяЭкспортнойПроцедуры, 
 Знач Параметры, Знач НаименованиеЗадания = "", ИспользоватьДополнительноеВременноеХранилище = Ложь)

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

Для отображения состояния на клиенте существует метод:


ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(Знач ВладелецФормы, Знач ИдентификаторЗадания)

 0 

   

Распечатать

1С 8.3 : Функции ЕстьРеквизитДокумента и ЕстьРеквизитОбъекта

При разработке частенько нужно проверить наличие реквизита в документе или справочнике.

Ниже приведены функции позволяющие проверить наличие заданных реквизитов в объектах конфигурации:

Код 1C v 8.х

 // Позволяет определить есть ли среди реквизитов шапки Объекта реквизит с переданным именем.
Функция ЕстьРеквизитОбъекта(ИмяРеквизита, Объект) Экспорт

МетаданныеОбъекта = Объект.Метаданные();
Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли; 

КонецФункции 

Для документа:

Код 1C v 8.х

 // Позволяет определить есть ли среди реквизитов шапки документа
// реквизит с переданным именем.
//
// Параметры: 
//  ИмяРеквизита - строковое имя искомого реквизита, 
//  МетаданныеДокумента - объект описания метаданных документа, среди реквизитов которого производится поиск.
//
// Возвращаемое значение:
//  Истина - нашли реквизит с таким именем, Ложь - не нашли.
//
Функция ЕстьРеквизитДокумента(ИмяРеквизита, МетаданныеДокумента) Экспорт

Если МетаданныеДокумента.Реквизиты.Найти(ИмяРеквизита) = Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли; 

КонецФункции

P.S. Посмотрите еще Полезные функции по работе с метаданными

Проверка реквизита, элемента формы на существование



FastCode


1413

11
21
66




Получает значение элемента по указанному имени, а также проверяет, имеется ли указанное свойство

Автор: HostHost

// 1.
СтруктураПараметров.Свойство("ЗначенияРазовыхПоказателей", ЗначенияРазовыхПоказателей)

// 2.
Элементы.Найти("ИсполнителиРабот")

0

0


0

ред. 2 года назад

Недостаточно рейтинга для добавления отрицательного голоса. Шаблон будет скрыт из ваших результатов поиска.



  • Шаблоны кода 1С

    База полезных фрагментов кода



  • Секреты TurboConf

    С автором программы



  • Нейросети и AI

    Будущее наступает



  • Лайфхаки 1С

    Полезные советы, база знаний



  • Бубен админа

    Приемы администрирования



  • 1С не всерьез

    Одинесники шутят


Комментарии

См. также

Проверка поля на существование

УдалитьСтарыеРеквизитыИЭлементы (БСП)

УстановитьДоступностьЭлементовФормы (БСП)

ПроверитьКодСправочникаПоОрганизации (БСП)

ПроверкаЗаполненностиРеквизитовОтложеннойОтправки (БСП)

ЗаполнитьДополнительныеРеквизитыВФорме (БСП)

ОбновитьЭлементыДополнительныхРеквизитов (БСП)

РазрешитьРедактированиеРеквизитовОбъекта (БСП)

ОбработатьФайлПослеПроверкиСуществования (БСП)

sale

fastcode_tg

courses_fastcode

courses_fastcode

Previous

Next

Модератору

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

Понравилась статья? Поделить с друзьями:
  • Проверить компанию на суды по инн бесплатно
  • Продажа готовая бизнес в новокузнецке авито
  • Проверить отзывные компании киа спортейдж 4
  • Продажа готового арендного бизнеса в москве
  • Продажа готового арендного бизнеса в самаре