Получить тип реквизита 1с
Когда требуется работать со списком типов – используется объект ОписаниеТипов (см. «Получение доступных типов», «Работа с типами реквизитов в метаданных конфигурации», «Указать фильтр типов в фильтре»).
Получить список типов
Предположим, что Вы получили готовый объект ОписаниеТипов:
- ЭлементыФормы.ИмяПоля.ТипЗначения
- ДокументСсылка.Метаданные().Реквизиты.ИмяРеквизита.Тип
- СписокЗначений.ДоступныеЗначения
Получить список типов из объекта ОписаниеТипов можно с помощью метода .Типы(), например:
Для каждого ДоступныйТип из ЭлементыФормы.ИмяПоля.ТипЗначения Цикл
Если ДоступныйТип = Тип("Строка") Тогда
//…
КонецЕсли;
КонецЦикла;
Проверка наличия типа в списке
Если требуется просто проверить – есть ли в списке типов требуемый, можно использовать метод .СодержитТип(), например:
Если ЭлементыФормы.ИмяПоля.ТипЗначения.СодержитТип( Тип("Строка") ) Тогда
//…
КонецЕсли;
Приведение значения к разрешенному типу
Если у Вас имеется значение (например, переменная со значением) и имеется фильтр типов значений в объекте ОписаниеТипов, то возможно привести значение к тем ограничениям типов, которые указаны в объекте ОписаниеТипов.
Например:
ЗначениеРазрешенногоТипа = ОписаниеТиповФильтр.ПривестиЗначение( НекотороеЗначение );
Создание описания типов
Создать объект ОписаниеТипов требуется в тех случаях, когда требуется указать какой фильтр типов будет установлен, например, при добавлении колонки таблицы значений методом .Добавить (фильтр типов указывается вторым параметром), или для установки фильтра разрешенных типов в список значений в свойстве .ДоступныеЗначения
Если в списке разрешенных типов присутствует только один тип, то в качестве параметра при создании объекта ОписаниеТипов указывается просто название типа (см. выше «Работа с типами»).
Например:
ФильтрТипов = Новый ОписаниеТипов("Строка");
Если в списке разрешенных типов нужно указать список типов, то требуется сначала создать массив типов и указать в качестве параметра массив.
При добавлении базовых типов (строка, число, дата) Вы указываете имя типа. Но ведь базовые типы имеют настройки – длину строки, разрядность числа, дата и время или только дата.
При создании объекта ОписаниеТипов возможно указать дополнительными параметрами настройки базовых типов (любой из указанных параметров настроек – необязательный и можно пропустить).
Новый ОписаниеТипов(ИмяТипа, НастройкиТипаЧисло, НастройкиТипаСтрока, НастройкиТипаДата);
Создадим настройку для целого числа с 5 цифрами: 99 999
НастройкаТипаЧисла = Новый КвалификаторыЧисла(5,0);
Создадим настройку для дробного числа с 5 цифрами до запятой и 2 цифрами после запятой: 99 999,99
НастройкаТипаЧисла = Новый КвалификаторыЧисла(5,2);
Настройка для того же числа, что и выше, и дополнительно – неотрицательного:
Если необходимо использовать строку неограниченной длины – настройку указывать не надо.
Настройка для строки длиной 100 символов:
НастройкаТипаСтроки = Новый КвалификаторыСтроки(100);
Настройка для строки длиной 100 символов, значения которой дополняются до 100 символов пробелами:
Если необходимо использовать дату и время – настройку указывать не надо.
Настройка для только даты, без времени (значение будет содержать время 00:00:00):
НастройкаТипаДаты = Новый КвалификаторыДаты(ЧастиДаты.Дата);
Настройка для только времени, без даты (значение будет содержать дату 01.01.0001):
НастройкаТипаДаты = Новый КвалификаторыДаты(ЧастиДаты.Время);
Понятие "тип реквизита" отличается от понятия "тип значения"
Конкретное значение не может быть составного типа. Одно конкретное значение может быть только одного типа данных.
Реквизит может быть как одного типа, так и составного типа. В последнем случае его тип описывается объектом "ОписаниеТипов", т.е. список возможных типов, значения которых могут храниться в этой колонке. Например, СправочникСсылка.М1, СправочникСсылка.М2, Строка, Число, ДокументСсылка.Д1.
В каждой строке (элементе, записи) содержится какое-то свое значение, но каждое из них - одного типа. Например, "СправочникСсылка.М1". Если же в ячейке колонки, имеющей составной тип, даже не выбран (не назначен) тип значения, то оно содержит значение "Неопределено" (это значение и одновременно тип). Если же тип выбран (кнопкой Т или установлен программно), то ячейка содержит пустое значение этого типа, например, пустую ссылку на элемент справочника (см. v8: Пустые ссылки), пустую строку "" или 0.
Чтобы реквизиту составного типа установить конкретный тип, достаточно присвоить ему пустое значение этого типа.
Вопрос:
Какие существуют особенности работы с составными типами данных.
Ответ
Этот вопрос имеет два стороны:
1) Сторона элемента формы.
Для элемента формы мы можем установить только ограничение на типы которые можно выбрать.
Т.е. с помощью кода:
Мы ограничиваем возможный типы только одним "СправочникСсылка.Контрагенты".
НО это не действует на значение которое хранится в источнике данных.
Поэтому если реквизит который связан с "ПолеВвода1" имеет "составной" тип, например Любая ссылка,
он будет неопределенного типа даже после "ЭлементыФормы.ПолеВвода1.ОграничениеТипа=Новый ОписаниеТипов(МассивТипов);"
2) Сторона источника данных.
Здесь ограничение на тип накладывается либо в конфигураторе, либо в момент создания этого элемента из языка.
Но если у реквизита установлен "составной" тип значение реквизита будет неопределенно до тех пор, пока ему не будет присвоено значение конкретного типа.
Присвоить конкретное значение можно либо из языка, либо выбрав это значение в форме.
Из выше описанного можно сделать вывод:
Если у реквизита установлен "Составной" тип данных, то даже при ограничении возможных типов у элемента формы до одного возможного, у пользователя будет запрошен тип который нужно будет присвоить реквизиту.
Если мы хотим оградить пользователя от лишних движений, т.е. выбора единственно возможного типа, нам нужно предварительно установить тип реквизита.
Сделать это можно следующим образом:
Добавление от ezh (особенности при работе с элементами в табличном поле):
1.
Вместо этого:
есть реквизит с типом ссылка на какой-либо объект
как узнать какая именно ссылка у этого реквизита,т.е получить ,например, СправочникСсылка.Чтото ?
Как сделать ссылку реквизита табличной части справочника
Я недавний пользователь 1с. И я решил сделать на нём диплом (Библиотека). В процессе возник вопрос.
Данные из реквизита типа ПеречислениеСсылка
Управляемое приложение. Создал в справочнике Номенклатура реквизит ВидУслуги (Перечисление.
В форме документа сделать автоматическое переключение реквизита таблицы Типа булево
Добрый день, помогите пожалуйста, Есть документ, создал форму документа, на форме нужно сделать так.
Получить значение дополнительного реквизита
есть дополнительный реквизит Должность у справочника ФизЛица. Как мне получить его значение.
Марианнна, Вы все еще заполняете все что есть, чем нибудь?
Вам нужно получить тип из конкретного значения или из описания метаданных?
оч "хороший" совет
Добавлено через 3 минуты
Марианнна, Вы все еще заполняете все что есть, чем нибудь?
Вам нужно получить тип из конкретного значения или из описания метаданных?
да,все тем же занимаюсь)
немного не поняла в чем разница
в общем у меня есть какой-то конкретный реквизит,он не заполнен,точно знаю что у него тип ссылка,вот надо получить эту ссылку,а потом уже в зависимости от полученной ссылки заполнять этот реквизит
открыть в конфигураторе нужный справочник, 2 раза кликнуть на реквизит тип которого вы хотите узнать, в окошке сведений о реквизите будет строка "ТИП" в нем то и посмотрите. я так по краней мере делаю.
МасТипов=Ссылка.Метаданные().Тип.Типы();
Для К=0 По МасТипов.ВГраница() Цикл
Сообщить(Строка(МасТипов[К]));
КонецЦикла;
есть и еще варианты.
fimbulwinter, duk337, O-Planet - В контексте решаемой Марианнна, задачи Ваши варианты не подходят. Она на основании метаданных создает элемент в каждом справочнике и заполняет все его реквизиты произвольными значениями.
При создании элемента если пытаться определить тип реквизита через ТипЗнч() будет возвращено Неопределено если тип реквизита составной.
Строка(МасТипов[К]) - вернет например "Номенклатура", без указания того что это за объект.
Это не для средних умов: если значения где-то берутся - какие ж они произвольные? Или рандомайз? Не догоняю .
Мой совет: создать отчет с текстами метаданных - и с ним баловаться, пока просветление не наступит.
А то я начинаю думать, что в разных элементах справочника д.б. реквы разных типов. Значения - могут быть разных типов, но не реквизиты. Они пусть составного, но одного типа, для их заполнения не надо анализировать: ссылка это, контейнер или примитив.
Добавлено через 28 минут
Чтобы получить обрабатываемый стринг типа "СправочникМенеджер.Контрагенты", например, надо написать СтрокаОбМет=""+Справочники.Контрагенты. Как-то можно получить и "СправочникСсылка.". ну не помню я! А некогда. Ну вот поэкспериментируйте в отрадчике!
Fenomen давно дал такой совет, а Вы:"Не царское, мол, это дело. Мы, мол, конфигуратор и так до дыр проглядели"
Добавлено через 8 минут
За то время, пока идут дебаты, можно было раз двести получить системный отчет по конфигурации, выкинуть оттуда лишние строки и превратить в текст модуля, где каждая метаданина указывается "в лоб"
Это не для средних умов: если значения где-то берутся - какие ж они произвольные? Или рандомайз? Не догоняю .
Есть переменные Стр="а",Числ=1, и т.д. После получения типа реквизита и квалификаторов идет заполнение,если длина типа строки = 12,то заполнить аааааааааааа,если число содержит 8 знаков и 2 после запятой,то должно заполниться 111111,11 как-то так.
Опять об одном: в какой тип должно попасть это квалификационное разнообразие? Это имеет смысл лишь при записи в строку. Вам не создать в структуре базы то, что Вы хотите.
По-моему Вы путаете механизмы визуализации и хранения.
А можно более полное/точное ТЗ? Потому что, приведенные примеры алгоритмически выразить совсем не сложно:
Функция Преобразовать(Зн)
Если ТипЗнч(Зн)="Число" Тогда
Если Найти(Строка(Зн),".")>0 Тогда
Возврат Формат(Зн,"ЧДЦ=2; ЧГ=0");
Иначе
Возврат Формат(Зн,"ЧГ=0");
КонецЕсли;
КонецЕсли;
Возврат Зн;
КонецФункции
Ищем в метаданных например сначала справочники,находим,берем первый справочник,создаем в нем первый элемент,пробегаемся по его реквизитам,получаем первый,смотрим тип,если строка получаем квалификаторы строки,дописываем необходимое количество символов к переменной Стр и заполняем реквизит этим значением,если число так же получаем квалификаторы числа и преобразуем переменную Числ до необходимого количество единиц до и после запятой и указанного знака,так же и с остальными типами.потом берется след.справочник и с ним делается тоже самое.закончились справочники-переходим к документам и т.д,в общем заполнить надо все таким образом.
С типами реквизитов число,строка,дата,булево уже все работает,только с ссылками пока что не получается.
СамСправочник = Метаданные.Справочники[Номер]; // Номер - это порядковый номер справочника в дереве конфигурации.
КоллекцияРеквизитовСправочника = СамСправочник.Реквизиты;
Для каждого Реквизит из КоллекцияРеквизитовСправочника Цикл
ТипРеквизита = Реквизит.Тип;
ИмяРеквизита = Реквизит.Имя;
СинонимТип = Метаданные.НайтиПоТипу(ТипЗнч(Реквизит.Тип.ПривестиЗначение( )));
СинонимТип = СтрЗаменить(СинонимТип," ","");
Если Метаданные.Справочники.Найти(СинонимТип) <> Неопределено Тогда
Вид = "Справочник";
ИначеЕсли Метаданные.Документы.Найти(СинонимТип) <> Неопределено Тогда
Вид = "Документ";
ИначеЕсли Метаданные.Перечисления.Найти(СинонимТип) <> Неопределено Тогда
Вид = "Перечисление";
и т.д. , перечисляем здесь все возможные Типы реквизитов какого-либо справочника
Иначе // Сюда попадут примитивные типы.
Вид = Реквизит.Тип;
КонецЕсли;
Сообщить("Реквизит справочника : " + ИмяРеквизита + " , Тип реквизита Справочника : " + Вид);
Очень часто возникает необходимость где-то задать перечисление типов. Например, это может быть колонка таблицы значений, в которой могут содержаться значения разных типов. Для создания списка типов используется общий объект Описание типов 1С.
Как правило, объект описание типов 1С сам по себе нигде не используется, в основном он нужен в качестве параметра разных объектов, например, таблицы значений 1С. На примере таблицы значений и покажем, как работать с описанием типов. Описание типов можно создать только для одного типа, например, для типа Число будет следующее описание типа.
А, для строки, даты и булево — следующее описание типов:
Это примитивные типы, для ссылочных типов можно создать такое же описание, указав в двойных кавычках название типа.
Чтобы получить быстро полное название нужной ссылки, можно воспользоваться контекстной подсказкой метода Тип.
После того, как мы создали описание типов, этот объект можно использовать, например, при создании таблицы значений.
Выше показано самое простое использование описания типов. Для числа, строки и даты мы можем использовать Квалификаторы. Это общие объекты – КвалификаторыЧисла, КвалификаторыСтроки, КвалификаторыДаты. Они также задаются при помощи конструктора Новый и имеют следующие синтаксисы.
Квалификатор числа 1С
Для числа будет следующий синтаксис квалификатора.
Где: ЧислоРазрядов – общее число разрядов;
ЧислоРазрядовДробнойЧасти – число разрядов после запятой;
ДопустимыйЗнак – системное перечисления (значения Любой, Неотрицательный).
Например, задать неотрицательно число с 6 разрядами и 2 дробными разрядами будет так:
Квалификатор строки 1С
Для строки будет следующий синтаксис квалификатора.
Где: ДлинаСтроки – длина задаваемой строки
ДопустимаяДлина – системное перечисление ДопустимаяДлина, которое определяет, будет строка переменная или фиксированная.
Например, задать строку длинной 10 символов фиксированной длины нужно так:
Обратите внимание, что КвалификаторСтроки задаем третьим параметром.
Квалификатор даты 1С
Для даты будет следующий синтаксис квалификатора.
Где ЧастиДаты – системное перечисление, с тремя значениями Время, Дата, ДатаВремя.
Например, задать дату, которая будет иметь формат времени нужно так:
Обратите внимание, что КвалификаторДаты задаем третьим параметром.
Общий вариант синтаксиса с использование типов выглядит так:
Массив типов в описание типов
Кроме использования одного типа в синтаксисе описания типов, можно использовать массив типов, например, сделаем колонку таблицы значений, у которая может принимать значения примитивных типов Строка, Число, Дата, Булево. Для этого нужно все типы перечислить в массиве, причём типы должны быть не в виде строк, как мы делали ранее, а в виде значений типа Тип.
Также можно «собрать» массив из ссылочных типов, например из справочников:
Описание типов на основании описания типов
Выше был рассмотрен один вариант синтаксиса описания типов, на основания какого-то типа (или перечисления типов), но также можно создать описание типа на основании другого описания типов, т.е. дополнить имеющееся описание.
Например, мы создали описание типов для чисел, строк и булево.
Теперь нам нужно новое описание типов, в котором будут такие типы как Число, Строка и Дата (тип Булево нам не нужно).
Для этого мы можем использовать следующий конструктор описания типов:
Где, в качестве первого параметра указывается описание типов, на основании которого создается это описание, а в качестве второго и третьего параметра – добавляемые и вычитаемые типы (могут быть как в виде массивов, так и в виде строк).
Давайте продолжим код выше:
В этом код в новое описание типов, мы добавили тип Дата, и вычли тип Булево.
Более подробно о работе с другими интересными объектами языка программирования в 1С читайте в моей книге «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
Разберем методы, при помощи которых, в 1С 8.3 можно определить тип значения переменной (или реквизита какого-нибудь объекта). Причем, эти методы могут работать со всеми типами: примитивными, объектными и коллекциями значений.
Для работы с типами, в платформе 1С имеется специальный тип, который так и называется Тип. Этот тип необходим для идентификации типов значений различных данных. Значения типа Тип возвращают только две функции Тип и ТипЗнч.
Функция ТипЗнч в 1С
Разберем функцию ТипЗнч. Эта функция принимает в качестве параметра любое значение и возвращает тип этого значения.
Рассмотрим пример: будем использовать в качестве параметра этой функции число, таблицу значений и объект какого-нибудь справочника.
Посмотрим в отладке, что вернет этот метод.
Как видите, все значения, которые вернул метод ТипЗнч имеют тип Тип. Но, сами по себе знания о том, какой тип у того или иного значения нам ни чего не дают. Разве что можно сравнить одинаковы ли типы у двух разных значений. Эти знания применимы только тогда, когда можно точно определить какого типа наше значение. Делается это при помощи функции Тип.
Функция Тип в 1С
Функция тип имеет один параметр имя получаемого типа в строковом представлении, возвращает тип Тип.
Переделаем предыдущий пример: будем получать типы значений, используя функцию Тип.
В переменных будут те же значения, что и в прошлый раз.
Чтобы быстро получить название какого-то типа, достаточно «задержаться» в написании после первой кавычки, или нажать комбинацию клавиш Ctrl+Пробел.
Появится выпадающий список всех названий типов, где набирая первые символы названия можно быстро найти нужный тип.
Обе функции Тип и ТипЗНЧ возвращают значения одного типа – Тип. Но, если в случае функции ТипЗнч мы не можем точно знать, что вернет эта функция (поскольку, иногда, возникают ситуации, когда точно не известно какого тип та или иная переменная), то при работе с функцией Тип, мы точно знаем, какое значение вернет эта функция, поскольку сами указали строковое представление типа в параметре.
Как проверить тип значения
Для того, чтобы проверить какой тип значения у той или иной переменой, достаточно использовать обе этих функции (Тип и ТипЗнч) вместе: сравнивая, что возвращает функция ТипЗнч, в параметре которой указано какое-либо значение, с функцией Тип, в параметре которой мы указали конкретный тип.
Рассмотрим пример: будем заполнять массив значениями разных типов, потом при помощи генератора случайных чисел выберем нужный элемент массива, и определим какого типа этот элемент массива. В этот массив поместим число, дату, строку и какой-нибудь список значений.
В этом коде я использовал условие, где обрабатывал сравнение значений, которые возвращают функции Тип и ТипЗнч.
Статьи о примитивных типах в 1С:
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника.
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
Читайте также: