как узнать тип объекта

Как узнать тип объекта

В предыдущей статье типы и значения 1С — мы начали обсуждать что такое типы значений 1С и преобразование типов 1С.

Сегодня мы поговорим подробнее про типы объектов конфигурации 1С (тип документа 1С, тип справочника 1С и др.)

Так как в программном коде мы работаем со значениями, то периодически требуется знать их тип. Тип 1С всегда указывается в метаданных у реквизитов — в справочниках, документах.

Работа с типами 1С часто используется:

Тип 1С можно получить:

Типы 1С можно разделить на три вида:

Определение типа 1С и сравнение типов 1С

Узнать тип значения 1С можно с помощью функции ТипЗнч(Переменная)

Чтобы понять какой тип 1С эта функция вернула – нужно указать нужный нам Тип(«ИмяТипа»)

Например, определение (сравнение) типа 1С переменной:
Если ТипЗнч(Переменная) = Тип(«ИмяТипа») Тогда

Какие типы писать в качестве ИмяТипа?

Базовые типы 1С — число, строка, дата, булево.

Например:
Знч = 12;
Если ТипЗнч(Знч) = Тип(«Число») Тогда
ИначеЕсли Знч = Тип(«Строка») Тогда
ИначеЕсли Знч = Тип(«Дата») Тогда
ИначеЕсли Знч = Тип(«Булево») Тогда
КонецЕсли;

1С хранит данные в базе данных, но не в виде отдельных записей, а в виде объектов.

Большинство сохраняемых объектов (в том числе: справочники, документы, перечисления, бизнес-процессы, задачи) доступны в виде Объекта (для изменения и записи) и в виде Ссылки (для чтения). Подробнее см. «Ссылки и объекты».

Например:
Знч = Справочники.Организации.ПустаяСсылка();
Если ТипЗнч(Знч) = Тип(«СправочникСсылка.Организации») Тогда
ИначеЕсли Знч = Тип(«СправочникОбъект.Организации») Тогда
ИначеЕсли ТипЗнч(Знч) = Тип(«ДокументСсылка.ПоступлениеТоваров») Тогда
ИначеЕсли Знч = Тип(«ДокументОбъект.ПоступлениеТоваров») Тогда
КонецЕсли;

Регистры могут быть представлены различными типами. Имя типа регистра составное:
РегистрТипрегистраТипдоступа.ИмяРегистра

Типов доступов к регистру несколько. Чаще всего используются:

Итого, пример:
Если ТипЗнч(Знч) = Тип(«РегистрСведенийСписок.ИмяРегистра») Тогда
ИначеЕсли Знч = Тип(«РегистрНакопленияНаборЗаписей.ИмяРегистра») Тогда
КонецЕсли;

Язык 1С позволяет работать со множеством объектов, создаваемых динамически в программе, например – массив, список значений, таблица значений, структура…

Такие типы 1С указываются по их названию (одним словом, без пробелов). Например:
Если ТипЗнч(Знч) = Тип(«Массив») Тогда
ИначеЕсли Знч = Тип(«СписокЗначений») Тогда
КонецЕсли;

Определение значения ссылочного типа 1С

Работа со всеми объектами базы данных (справочники, документы…) ведется через ссылки. Например, если мы хотим в документе сделать реквизит – справочник, то его тип 1С будет «СправочникСсылка.ИмяСправочника».

Мы можем определить является ли ссылка справочником или документом с помощью метода ТипВсеСсылки()

Например:
Значение = Справочники.Организации.ПустаяСсылка();
Если Справочники.ТипВсеСсылки().Содержит( ТипЗнч(Значение) ) Тогда
//это справочник
ИначеЕсли Документы.ТипВсеСсылки().Содержит( ТипЗнч(Значение)) Тогда
//это документ
КонецЕсли;

Работа с типами 1С в запросе

В запросе тип 1С можно проверить двумя способами.

Первый – аналогично описанному, но в имени типа 1С не указывается «Ссылка» или «Объект», то есть вместо «СправочникСсылка.Организации» пишем «Справочник.Организации»

Получение доступных типов 1С

Работа с типами 1С реквизитов в метаданных конфигурации

При добавлении и редактировании реквизитов в конфигураторе программист указывает тип(ы) 1С реквизита. В программном коде на языке 1С можно получить (узнать) тип(ы) 1С реквизита.

Подробнее про работу с метаданными см. далее «Работа с метаданными».

Как работать с этим списком типов 1С – см. «ОписаниеТипов» в разделе «Язык 1С».

Указать фильтр типов 1С

У многих объектов возможно указать фильтр типов значений 1С, возможных к использованию, например:

Чтобы указать список типов 1С для фильтра – используется список типов 1С, как с ним работать – см. «Описание типов» в разделе «Язык 1С».

Источник

Узнать реальный тип объекта

Предположим, есть тип базовый класс SceneObject и есть производные от него классы. Я хочу хранить массив объектов этого класса, для этого завожу vector obj.

Добавляю туда некоторые объекты производных классов. А когда достаю их оттуда, я хочу узнать их реальный тип. typeid(obj[i]).name() всегда выдает тип SceneObject*. Как узнать реальный тип объекта?(

Или может быть, я все делаю неправильно. Как тогда сделать массив объектов, производных от одного класса, чтобы потом можно было определить какой это объект?

Читайте также:  не могу удалить разделы на жестком диске при установке windows

3 ответа 3

Без этого надо хранить информацию о типе где-то отдельно.

Для определения реального типа объекта вы можете воспользоваться dynamic_cast : TYPE* dynamic_cast (object);

Если Вы немного подумаете, то поймёте, что для того, чтобы получить информацию во время исполнения, нужно использовать какие-то средства времени исполнения. В C++ все эти вещи связаны с виртуальностью и ничем другим. Поэтому без полиморфного базового класса, боюсь, Вам задачу не решить.

Что касается правильно/не правильно. Обычно, если появляется задача узнать реальный тип данных, то это на 99% ошибка дизайна. Реальный тип практически никогда знать не нужно, для выполнения конкретной реализации существует полиморфное поведение, то есть виртуальные функции.

Источник

Как узнать тип объекта, на который указывает указатель в C ++?

Предположим, я определил два класса на основе одного базового класса:

Тогда теперь есть класс с именем Collect, который содержит указатель на Basic учебный класс

В этом классе функция run() был определен, который будет выполнять некоторые операции в зависимости от типа объекта, на который указывает указатель:

Тогда мой вопрос заключается в следующем:

Решение

Чтобы выполнить такую ​​проверку, ваш базовый класс Basic должен иметь хотя бы одного виртуального члена. Поскольку вы хотите построить иерархию классов, я бы хотел сделать

Basic виртуальный, чтобы убедиться, что это будет правильно удален в то же время.

Теперь вы можете написать свой чек:

dynamic_cast вернет nullptr если это не удастся, так что вы будете входить только в тело if когда ваш бросок удался и pDerived содержит действительный указатель на правый производный объект.

Другие решения

В С ++ мы обычно используем База класс, а не базовый класс.

В любом случае, в общем, если ваш базовый класс полиморфен (содержит виртуальные функции), вы можете использовать dynamic_cast:

Это означает, что объект «a» имеет «static-type»: Base; и «динамический тип»: производный.

Если ваш базовый класс имеет хотя бы одну виртуальную функцию, то вы можете положиться на Информация о типе времени выполнения : ты можешь использовать dynamic_cast или же typeid чтобы получить динамический тип pointee.

Источник

Как узнать, какого типа объект находится по указателю

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

Как определиться объект какого типа мы перетаскивали мышью?
Всем здравствуйте. На форме label1 и button1. Оба объекта могут инициировать перетаскивание по.

Как узнать находится ли объект в фокусе
Создаю компонент. Как мне внутри компонента понять, что он находится в фокусе? if focused=true не.

Как узнать что находится в переменной типа byte[]
Здравствуйте. Я имею простенький чат p2p. При передаче текста, я его перевожу из string в byte, ну.

Deviaphan, вы давно программируете? Категорически с Вами не согласен. Полиморфизм нужен как для использования общих виртуальных функций, так и для уникальных для каждого потомка. То есть это абсолютно рядовая задача программирования делать коллекцию базовых объектов и в дальнейшем преобразовывать их в потомки для дальнейшей обработки.
Вот один из множества примеров, взятых из реальной жизни: у Вас есть коллекция графических примитивов в виде линий и дуг, основанных на одном общем родительском классе gElement. Попробуйте написать функцию, находящую точки пересечения двух произвольных элементов, принимающую в качестве аргументов ссылки на gElement (double[] Intersection(gElement el1, gElement el2), не прибегая к преобразованию базовых элементов к родительским типам.

А dynamic_cast’ы и прочие «завести переменную» нужны только неосиляторам которые не могут спроектировать систему типов.

Можно пример кода увидеть? Не пойму как это решит вопрос ТС-а.

Или имелось в виду, что решать задачу «Есть массив указателей базового класса, нужно узнать какие типы этих объектов.» саму по себе не имеет смысла?

Читайте также:  121471 почтовое отделение адрес

Учитывая, что последняя запись от господина kravam датирована 2012 годом, то как минимум 3 года.

А учитывая общую подкованность господина Deviaphan,
то можно смело предположить, что он и в 2012 уже был специалистом.
—————————————————————

А вот ваши ответы красноречиво намекают: вы не умеете ооп.

1. Язык си, со своей процедурной парадигмой не имеет никакого отношения к ответа господина Deviaphan.

2. Технология полиморфизм, на которой базируется оо-парадигма,
была разработана, что бы реализовать идеому: «закрыт для изменений, открыт для расширений».

Другими словами, полиморфизм для того и нужен, что бы избежать необходимости пасти фактические типы,
и уйти от километровых свитч-кейсов, и армии ифов.

3. То, как вы предлагаете использовать полиморфизм на корню прибивает идеому,
ради которой он и был создан. И прекрасно реализуется на тех же свитч-кейсах (имея при этом все их недостатки).

Это дает основание предположить, что вы сами не понимаете ООП.

Более того: именно к вам можно обратить ваш собственный тезис:

С точки зрения ООП ваш юзкейс нарушает идеому «зарыт для изменений, открыт для расширений»,
и прекрасно реализуется на обычном процедурном си при помощи свит-кейсов,
или конструкций из if/else, имея при этом все их недостатки.

Возможно вы предпочитаете писать на чистом С.
Возможно вы просто неправильно понимаете идеологию ООП.
Но такие коллекции не оправданы с точки зрения ООП,
и ломают на корню многие из его возможностей.

Что-то подобное в оо-архитектуре красноречивый признак её ущербности.

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

Но программирование прежде всего имеет смысл с точки зрения практики.
И не спроста язык предлагает нам инструменты динамической типизации вроде dinamic_cast и typeid.
Можно обойтись и без таких коллекций, только это усложнит реализацию.

Лучше рассмотреть на конкретной задаче:
Есть 2 контура Contour, состоящих из последовательно соединенных линий Line: Element и дуг Arc: Element.
Нам нужно найти точки пересечения этих контуров.

Архитектурное решение с применением абстрактных коллекций: Перечисляем элементы первого контура, для каждого из них перечисляем все элементы второго контура и вызываем у них метод PointF pf = el1.Intersect(el2);
В методе Intersect каждого типа пишем свич-кейсы. Нарушаем принцип открытости-закрытости (при добавлении новых типов примитивов придется дописывать свич-кейсы в каждом «братском» классе), но простота реализации и поддержки, а также скорость выполнения программы при большом количестве элементов (касты делаются быстро, по крайней мере на C#).

Какую можете предложить альтернативу? (Естественно в приватных функциях контура должны сохраняться возможности вставки, удаления, инверсии элементов, и желательно доступа к элементу по индексу).

Добавлено через 39 минут
Архитектурное решение с применением абстрактных коллекций: Вызываем метод cont1.Intersect(cont2); Перечисляем элементы первого контура, приводим к производному типу. Для каждого из них перечисляем все элементы второго контура, приводим их и вызываем метод PointF pf = (line1/arc1).Intersect(line2/arc2);
Все свич-кейсы пишутся в методе Contour.Intersect. При добавлении новых типов примитивов, нужно будет дописать свич кейсы только этого метода, а ранее написанный код примитивов останется без изменений.
В такой реализации не нарушается принцип открытости-закрытости, но остается простота реализации и поддержки, а также скорость выполнения программы при большом количестве элементов (касты делаются быстро, по крайней мере на C#).

А вот избавиться от динамической типизации вряд ли получится. Отказываться от абстрактной коллекции тоже смысла не вижу и не считаю это ущербным. В принципах ООП ничего нет про ущербность абстрактных коллекций=)

Источник

Программирование в 1С для всех

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

Читайте также:  какой порт выбрать при установке принтера через usb windows 10

Для работы с типами, в платформе 1С имеется специальный тип, который так и называется Тип. Этот тип необходим для идентификации типов значений различных данных. Значения типа Тип возвращают только две функции Тип и ТипЗнч.

Функция ТипЗнч в 1С

Разберем функцию ТипЗнч. Эта функция принимает в качестве параметра любое значение и возвращает тип этого значения.

Рассмотрим пример: будем использовать в качестве параметра этой функции число, таблицу значений и объект какого-нибудь справочника.

Посмотрим в отладке, что вернет этот метод.

Как видите, все значения, которые вернул метод ТипЗнч имеют тип Тип. Но, сами по себе знания о том, какой тип у того или иного значения нам ни чего не дают. Разве что можно сравнить одинаковы ли типы у двух разных значений. Эти знания применимы только тогда, когда можно точно определить какого типа наше значение. Делается это при помощи функции Тип.

Функция Тип в 1С

Функция тип имеет один параметр имя получаемого типа в строковом представлении, возвращает тип Тип.

Переделаем предыдущий пример: будем получать типы значений, используя функцию Тип.

В переменных будут те же значения, что и в прошлый раз.

Чтобы быстро получить название какого-то типа, достаточно «задержаться» в написании после первой кавычки, или нажать комбинацию клавиш Ctrl+Пробел.

Появится выпадающий список всех названий типов, где набирая первые символы названия можно быстро найти нужный тип.

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

Как проверить тип значения

Для того, чтобы проверить какой тип значения у той или иной переменой, достаточно использовать обе этих функции (Тип и ТипЗнч) вместе: сравнивая, что возвращает функция ТипЗнч, в параметре которой указано какое-либо значение, с функцией Тип, в параметре которой мы указали конкретный тип.

Рассмотрим пример: будем заполнять массив значениями разных типов, потом при помощи генератора случайных чисел выберем нужный элемент массива, и определим какого типа этот элемент массива. В этот массив поместим число, дату, строку и какой-нибудь список значений.

В этом коде я использовал условие, где обрабатывал сравнение значений, которые возвращают функции Тип и ТипЗнч.

Статьи о примитивных типах в 1С:

Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»

Книга написана понятным и простым языком — для новичка.

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

Промо-код на скидку в 15% — 48PVXHeYu

Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму
.

можно оплатить вручную:

Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Источник

Образовательный портал