1с сравнить описание типов с типом

Обновлено: 06.07.2024

Есть усок кода Вопрос номер 1. в таком виде Соединение.NewObject("ОписаниеТипов(""СправочникСсылка.Организации"")") не работает, вопрос номер два как из переменной Значение имеющий тип ПланыВидовХарактеристик, получить ИМЯ типа значения как оно задано в конфигураторе. Например Для Каждого Элемент Из Значение.ТипЗначения.Типы Цикл Сообщить(Элемент) КонецЦикла; выдает Справочник ссылка: Организации, а нужно строку СправочникСсылка.Организации

Соединение это переменная содержащая ссылку на базу COM

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

ну какой же ты не в попад весь. говорю, что нету там нормальной реализации этого метода. решил так, если кому интересно. в базе приемнике в модуле доступном по com пишем Возврат Новый ОписаниеТипов(СтрокаЗначения); КонецФункции вроде работает, тестирую.

Тебе нужен менеджер ? Или пустое значение вида справочника организаций? дает менеджер

Мне нужен в базе открытой по COM тип ОписаниеТипов("СправочникСсылка.Организации") полученный в базе открывающей по Com из какого то значения зы завязываем тупить в уже все решено.

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

СоединениеСБазойДанных.NewObject("ОписаниеТипов", "ПланВидовХарактеристикСсылка.СвойстваОбъектов"); Так не работатает?

Миша, ну где же ты был? :( Я уже через зад зделал и все работает.

ну да ладно, много переписывать не пришлось. Я думал у типов один только конструктор. Спасибо! Давай еще этот гнилой код формирования строки типа уберем. И лучше не нужно будет. ;)

СоединениеСБазойДанных.FromXMLType(XMLType(ТипЗначения[0])); не пробовал, но должно сработать

НовыйЭлемент.ТипЗначения = СоединениеСБазойДанных.FromXMLType(XMLType(ТипЗначения[0]));

FromXMLType такого даже СП не знает. Где ты его нарыл? Сейчас попробую.

А стоп, так же нельзя делать. Так получается, что ты в com базу передаешь тип который создан в другой базе. Конечно оно матеирится будет. Туда нужно передавать тип созданный там. А это в контексте этой задачи масло маслянное.

а так мне зачем? У меня сейчас вопрос, мне всего то нужна строка вида "СправочникСсылка.Организации", я могу вытянуть только в таком виде Справочник ссылка: Организации. Отсюда и канитель со строкой.

Так точно работает. Ком_Тип = Соединение.ИзXMLТипа(XMLTypeOf(Справочники.Номенклатура.ПустаяСсылка).ИмяТипа, XMLTypeOf(Справочники.Номенклатура.ПустаяСсылка).URIПространстваИмен);

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

(+26) так я максимум что получу, так это тип СправочникСсылка.Номенклатура

Чёрт Справочники.Номенклатура.ПустаяСсылка -> Значение

вот так нужно было. навел на мысль. Есть! Да не это все не то. зы однако тупняк меня сегодня разобрал не подецки, спасибо всем.

Слова «ОписаниеТипов» и «Квалификаторы» у некоторых разработчиков вызывают трудность понимания на начальном этапе использования, хотя по сути это простые вещи с толку может сбивать их название, поэтому постараюсь объяснить смысл этих объектов.

Что такое Квалификаторы?

В программе 1с есть простые типы: Число, Дата, Строка. Но иногда необходимо уточнить, что переменная будет не просто числом, а например, числом длиной 17 символов и 2 разрядами после запятой, при этом неотрицательное. В простых типах это сделать невозможно т.к. тип не имеет соответствующих свойств. Для таких случаев и нужен объект «Квалификатор». Это именно объект, создается он методом « Новый »:

У каждого простого типа есть свой квалификатор. Соответственно есть также квалификаторы:

Что такое Описание типов?

ОписаниеТипов – это объект который содержит массив допустимых типов, но т.к. в массиве нет возможности указать дополнительные данные, то отдельно для простых типов(Число, Строка, Дата) можно уточнить свойства квалификаторами.

У описания типов есть 4 параметра, первый – обязательный, в нем указываются типы. Остальные – необязательные, в них указываются квалификаторы. Для создания описания типов существует несколько вариантов.

Указание типа строкой:

Можно указать несколько типов разделяя их запятыми:

Можно передать массив типов:

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

Итак, подытожим. Описание типов это объект, который используется, чтобы ограничить ввод данных, а квалификаторы это объекты которые дополняют ограничения для простых типов. Квалификаторов в описании типов 3 по одному для простых типов: Число, Строка, Дата. Соответственно у объекта ОписаниеТипов при создании 4 параметра: - первый массив доступных типов, последние три - квалификаторы. Т.к. квалификатор для каждого простого типа передается один, то соответственно нельзя назначить более одного ограничения для простого типа. Указывать все квалификаторы не обязательно, поэтому в вышеприведенном примере мы передали квалификатор для Строки(3 параметр), а для Числа(2-ой) и Даты(4-ый) не передавали.

Для наглядности проведу аналогию объекта ОписаниеТипов с ограничением типов в реквизитах, по сути это один механизм.

Аналогия ОписаниеТипов и ограничения типов реквизита

При редактировании типов данных реквизита мы увидим окно указанное выше. Что же здесь происходит, по сути, отметив флажками, типы мы добавим их в массив доступных типов объекта ОписаниеТипов для этого реквизита. А если тип простой, то внизу можно дополнительно его ограничить, указав значения, при этом будет создан квалификатор. Здесь наглядно видно, что нет смысла передавать несколько квалификаторов для одного простого типа, просто следует указать описание максимально возможного значения. Например, если могут записываться как число "12,258" так и "235,5",то необходимо установить Длина: 6, Точность:3.

Небольшое пояснение: ограничение для числа действует не как обрезание строки. Т.е. если было число "25,12" то указав квалификатор Длина:2, Точность:1 получится число "9,9", а не "5,1".

Чтобы было проще запомнить объект ОписаниеТипов, приведу следующую картинку:

Слова «ОписаниеТипов» и «Квалификаторы» у некоторых разработчиков вызывают трудность понимания на начальном этапе использования, хотя по сути это простые вещи с толку может сбивать их название, поэтому постараюсь объяснить смысл этих объектов.

Что такое Квалификаторы?

В программе 1с есть простые типы: Число, Дата, Строка. Но иногда необходимо уточнить, что переменная будет не просто числом, а например, числом длиной 17 символов и 2 разрядами после запятой, при этом неотрицательное. В простых типах это сделать невозможно т.к. тип не имеет соответствующих свойств. Для таких случаев и нужен объект «Квалификатор». Это именно объект, создается он методом « Новый »:

У каждого простого типа есть свой квалификатор. Соответственно есть также квалификаторы:

Что такое Описание типов?

ОписаниеТипов – это объект который содержит массив допустимых типов, но т.к. в массиве нет возможности указать дополнительные данные, то отдельно для простых типов(Число, Строка, Дата) можно уточнить свойства квалификаторами.

У описания типов есть 4 параметра, первый – обязательный, в нем указываются типы. Остальные – необязательные, в них указываются квалификаторы. Для создания описания типов существует несколько вариантов.

Указание типа строкой:

Можно указать несколько типов разделяя их запятыми:

Можно передать массив типов:

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

Итак, подытожим. Описание типов это объект, который используется, чтобы ограничить ввод данных, а квалификаторы это объекты которые дополняют ограничения для простых типов. Квалификаторов в описании типов 3 по одному для простых типов: Число, Строка, Дата. Соответственно у объекта ОписаниеТипов при создании 4 параметра: - первый массив доступных типов, последние три - квалификаторы. Т.к. квалификатор для каждого простого типа передается один, то соответственно нельзя назначить более одного ограничения для простого типа. Указывать все квалификаторы не обязательно, поэтому в вышеприведенном примере мы передали квалификатор для Строки(3 параметр), а для Числа(2-ой) и Даты(4-ый) не передавали.

Для наглядности проведу аналогию объекта ОписаниеТипов с ограничением типов в реквизитах, по сути это один механизм.

Аналогия ОписаниеТипов и ограничения типов реквизита

При редактировании типов данных реквизита мы увидим окно указанное выше. Что же здесь происходит, по сути, отметив флажками, типы мы добавим их в массив доступных типов объекта ОписаниеТипов для этого реквизита. А если тип простой, то внизу можно дополнительно его ограничить, указав значения, при этом будет создан квалификатор. Здесь наглядно видно, что нет смысла передавать несколько квалификаторов для одного простого типа, просто следует указать описание максимально возможного значения. Например, если могут записываться как число "12,258" так и "235,5",то необходимо установить Длина: 6, Точность:3.

Небольшое пояснение: ограничение для числа действует не как обрезание строки. Т.е. если было число "25,12" то указав квалификатор Длина:2, Точность:1 получится число "9,9", а не "5,1".

Чтобы было проще запомнить объект ОписаниеТипов, приведу следующую картинку:

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: функции и операторы для работы с типами (ТИПЗНАЧЕНИЯ, ТИП, ССЫЛКА, ЕСТЬNULL, ВЫРАЗИТЬ)

Автор уроков и преподаватель школы: Владимир Милькин

Давайте вспомним, что каждый реквизит (свойство, поле) справочника, документа или любого другого прикладного объекта имеет свой тип . И этот тип мы можем посмотреть в конфигураторе:

01

В языке запросов существует целый класс функций и операторов для работы с типами реквизитов. Давайте рассмотрим их.

Функция ТИПЗНАЧЕНИЯ

Эта функция принимает один параметр (значение) и возвращает его тип. Для описанного на картинке (выше) реквизита Вкус справочника Еда вернётся следующее:

02

Если мы запросим тип поля Наименование, то, как и ожидается, получим Строка:

А теперь давайте рассмотрим реквизит ОтличительныйПризнак у справочника Города:

04

Вы видите, что этот реквизит может иметь один из нескольких типов: Строка, Справочник.Вкусы, Справочник.Цвета. Такой тип реквизитов называется СОСТАВНЫМ .

Если мы попытаемся заполнить значение такого реквизита в режиме 1С:Предприятие, то система спросит нас, какого типа будет вводимое значение:

05

И только после нашего выбора позволит ввести значение выбранного типа.

Таким образом, элементы справочника одного вида (Справочник.Города) смогут хранить в одном и том же реквизите (ОтличительныйПризнак) значения разных типов (Строка, Цвета или Вкусы).

Вы можете убедиться в этом сами пощёлкав по элементам справочника Города в режиме 1С:Предприятие. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Здесь значение отличительного признака является элементом справочника Вкусы:

06

07

А здесь вообще элементом справочника Цвета:

09

Вот какие возможности открывает перед нами составной тип данных!

Интересно, как поведёт себя функция ТИПЗНАЧЕНИЯ на реквизите ОтличительныйПризнак, имеющий составной тип данных:

Это уже очень интересно. Давайте разбираться с каждой строкой в отдельности.

Тип значения отличительного признака для элемента Россия равен NULL. Мы впервые сталкиваемся с этим типом. Значения данного типа используются исключительно для определения отсутствующего значения при работе с базой данных.

Так и есть, ведь элемент Россия является группой, а не обычным элементом справочника Города, поэтому у него отсутствует поле ОтличительныйПризнак. А тип у отсутствующего значения, как мы прочитали выше, всегда равен NULL.

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

Для Красноярска тип признака равен Цвета, потому что значение выбранное в базе является ссылкой на элемент справочника Цвета.

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

Индия снова группа, поэтому значение отсутствует. А тип у отсутствующего значения, как мы помним, равен NULL.

Далее всё аналогично, кроме Сан-Паулу. Это не группа, а обычный элемент справочника (город), но тип его значения пустой. Как так?

А дело вот в чём. Если вы зайдёте в элемент справочника Города с наименованием Сан-Паулу, то увидите, что поле ОтличительныйПризнак совершенно никак не заполнено. Оно пустое. А все незаполненные поля составного типа имеют специальное значение НЕОПРЕДЕЛЕНО .

С НЕОПРЕДЕЛЕНО мы также сталкиваемся впервые.

Значение НЕОПРЕДЕЛЕНО применяется, когда необходимо использовать пустое значение, не принадлежащее ни к одному другому типу. Это как раз наша ситуация.

А тип для значения, которое не принадлежит ни к одному из типов, как вы уже наверное догадались отсутствует.

Функция ТИП

Она принимает всего один параметр - имя примитивного типа (СТРОКА, ЧИСЛО, ДАТА, БУЛЕВО), либо имя таблицы, тип ссылки которой нужно получить.

Результатом данной конструкции будет значение типа Тип для указанного типа.

Звучит туманно, не правда ли?

Давайте рассмотрим применение данной конструкции и всё сразу станет на свои места.

Пусть нам требуется отобрать все записи справочника Города, у которых составной реквизит ОтличительныйПризнак имеет значение типа СТРОКА:

01

Теперь давайте отберём все записи, у которых значения реквизита ОтличительныйПризнак являются ссылками на элементы справочника Цвета (таблица Справочник.Цвета):

02

Отступление

Как вы помните, некоторые элементы справочника Города не имеют реквизита ОтличительныйПризнак. Функция ТИПЗНАЧЕНИЯ для таких элементов выдаёт NULL.

Как можно сделать отбор таких элементов в запросе? Для этого предусмотрен специальный логический оператор ЕСТЬ NULL (не путать с функцией ЕСТЬNULL, которую мы рассмотрим ниже). Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.

Вот пример его использования:

03

Но есть и такие элементы (Сан-Паулу), у которых реквизит ОтличительныйПризнак (составного типа) просто не заполнен и равен специальному значению НЕОПРЕДЕЛЕНО.

Чтобы отобрать такие записи следует использовать другую конструкцию:

Но сравнение с НЕОПРЕДЕЛЕНО для определения пустых (не заполненных) реквизитов будет работать только для составных типов.

Кстати, у логического оператора ЕСТЬ NULL форма отрицания выглядит следующим образом:

Логический оператор ССЫЛКА

Оператор ССЫЛКА позволяет проверить, является ли значение выражения, указанного слева от него, ссылкой на таблицу , указанную справа.

К примеру, давайте выберем из справочника Города только те записи, у которых значение составного реквизита ОтличительныйПризнак являются ссылкой на элемент справочника Вкусы:

05

Как вы помните, эту же задачу мы могли бы решить используя ТИПЗНАЧЕНИЯ и ТИП:

Функция ЕСТЬNULL

Функция предназначена для замены значения NULL на другое значение.

Мы помним, что значение NULL возвращается в том случае, если запрашиваемый реквизит (поле, свойство) не существует.

Как например, реквизит ОтличительныйПризнак для групп справочника Города:

06

Функция ЕСТЬNULL поможет нам вывести другое значение в том случае, если это значение равно NULL. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Пусть в данном случае это будет строка "Такого реквизита нет!":

08

Получается, что если первый параметр функции ЕСТЬNULL не равен NULL, то возвращается он. Если же он равен NULL, то возвращается второй параметр.

Функция ВЫРАЗИТЬ

Эта функция предназначена только для полей , имеющих составной тип . Отличным примером такого поля является свойство ОтличительныйПризнак у элементов справочника Города.

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

Для поля ОтличительныйПризнак такими допустимыми типами являются СТРОКА, Справочник.Цвета и Справочник.Вкусы.

Иногда возникает необходимость привести значения составного поля к какому-либо определенному типу.

Давайте приведём все значения поля ОтличительныйПризнак к типу Справочник.Цвета:

09

В результате, все значения элементов, которые имели тип Справочник.Цвета, остались заполненными и оказались приведенными к указанному типу. Все значения других типов (СТРОКА, Справочник.Вкусы) теперь стали равны NULL. В этом состоит особенность приведения типа при помощи функции ВЫРАЗИТЬ.

Приводить тип можно или к примитивному типу (БУЛЕВО, ЧИСЛО, СТРОКА, ДАТА) или к ссылочному типу. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Но тип, к которому делается приведение, обязательно должен входить в список типов для данного составного поля, иначе система выдаст ошибку.


// Описание типа строки:
НовСтрока = Новый ОписаниеТипов ( "Строка" );
// Описание строки с уточнением через квалификатор: максимальная длина строки = 50 символов
КвалификаторыСтроки = Новый КвалификаторыСтроки ( 50 );
НовСтрока_50 = Новый ОписаниеТипов ( "Строка" , , КвалификаторыСтроки );

// Описание типа числа:
НовЧисло = Новый ОписаниеТипов ( "Число" );
// Описание числа с уточнением через квалификатор: общее число разрядов = 14, число дробной части = 3
КвалификаторыЧисла = Новый КвалификаторыЧисла ( 14 , 3 , ДопустимыйЗнак . Любой );
НовЧисло_14_3 = Новый ОписаниеТипов ( "Число" , КвалификаторыЧисла );

// Описание типа даты:
НовДата = Новый ОписаниеТипов ( "Дата" );
// Описание даты с уточнением через квалификатор: храниться только дата, без времени
КвалификаторыДаты = Новый КвалификаторыДаты ( ЧастиДаты . Дата );
НовДата_БезВремени = Новый ОписаниеТипов ( "Дата" , , , КвалификаторыДаты );

// Описание типа булево:
НовБулево = Новый ОписаниеТипов ( "Булево" ); // Истина, Ложь

// Описание типа справочника:
НовНоменклатура = Новый ОписаниеТипов ( "СправочникСсылка.Номенклатура" );

// Описание типа перечисление:
НовСпособОплаты = Новый ОписаниеТипов ( "ПеречислениеСсылка.СпособыОплаты" );

// Описание типа документа:
НовДоговор = Новый ОписаниеТипов ( "ДокументСсылка.Договор" );

// Описание типа структуры:
НовСтруктура = Новый ОписаниеТипов ( "Структура" );

// Описание типа соответствия:
НовСоответствие = Новый ОписаниеТипов ( "Соответствие" );

// Описание типа массива:
НовМассив = Новый ОписаниеТипов ( "Массив" );

// Описание типа хранилище значения:
НовХранилищеЗначения = Новый ОписаниеТипов ( "ХранилищеЗначения" );

// Описание типа таблица значений:
НовТаблицаЗначений = Новый ОписаниеТипов ( "ТаблицаЗначений" );

// Описание типа список значений:
НовТаблицаЗначений = Новый ОписаниеТипов ( "СписокЗначений" );

// Описание типа картинки:
НовКартинка = Новый ОписаниеТипов ( "Картинка" );

// Описание типа уникального идентификатора:
НовУникальныйИдентификатор = Новый ОписаниеТипов ( "УникальныйИдентификатор" );

// Описание типа объекта метаданых:
НовОбъектМетаданных = Новый ОписаниеТипов ( "ОбъектМетаданных, Строка" );

// Описание составного типа (Например: строка+структура+справочник):
СписокМассив = Новый Массив ;
СписокМассив . Добавить ( "Строка" );
СписокМассив . Добавить ( "Структура" );
СписокМассив . Добавить ( "СправочникСсылка.Номенклатура" );
ОписаниеСоставногоТипа = Новый ОписаниеТипов ( СписокМассив );

Читайте также: