Программирование 1С 8.х для начинающих
- Вы здесь:
- Квалификаторы и ОписаниеТипов
Обмен данными
Квалификаторы и ОписаниеТипов
- Печать
Квалификаторы и ОписаниеТипов
Слова «ОписаниеТипов» и «Квалификаторы» у некоторых разработчиков вызывают трудность понимания на начальном этапе использования, хотя по сути это простые вещи с толку может сбивать их название, поэтому постараюсь объяснить смысл этих объектов.
Что такое Квалификаторы?
В программе 1с есть простые типы: Число, Дата, Строка. Но иногда необходимо уточнить, что переменная будет не просто числом, а например, числом длиной 17 символов и 2 разрядами после запятой, при этом неотрицательное. В простых типах это сделать невозможно т.к. тип не имеет соответствующих свойств. Для таких случаев и нужен объект «Квалификатор». Это именно объект, создается он методом « Новый »:
У каждого простого типа есть свой квалификатор. Соответственно есть также квалификаторы:
Что такое Описание типов?
ОписаниеТипов – это объект который содержит массив допустимых типов, но т.к. в массиве нет возможности указать дополнительные данные, то отдельно для простых типов(Число, Строка, Дата) можно уточнить свойства квалификаторами.
У описания типов есть 4 параметра, первый – обязательный, в нем указываются типы. Остальные – необязательные, в них указываются квалификаторы. Для создания описания типов существует несколько вариантов.
Указание типа строкой:
Можно указать несколько типов разделяя их запятыми:
Можно передать массив типов:
В последнем примере одним из типов является строка и это не случайно. Даже когда в описании типов указывается квалификатор обязательно нужно добавлять в типы этот простой тип. Т.к. квалификаторы накладывают ограничение на типы, а не устанавливают их.
Итак, подытожим. Описание типов это объект, который используется, чтобы ограничить ввод данных, а квалификаторы это объекты которые дополняют ограничения для простых типов. Квалификаторов в описании типов 3 по одному для простых типов: Число, Строка, Дата. Соответственно у объекта ОписаниеТипов при создании 4 параметра: — первый массив доступных типов, последние три — квалификаторы. Т.к. квалификатор для каждого простого типа передается один, то соответственно нельзя назначить более одного ограничения для простого типа. Указывать все квалификаторы не обязательно, поэтому в вышеприведенном примере мы передали квалификатор для Строки(3 параметр), а для Числа(2-ой) и Даты(4-ый) не передавали.
Для наглядности проведу аналогию объекта ОписаниеТипов с ограничением типов в реквизитах, по сути это один механизм.
При редактировании типов данных реквизита мы увидим окно указанное выше. Что же здесь происходит, по сути, отметив флажками, типы мы добавим их в массив доступных типов объекта ОписаниеТипов для этого реквизита. А если тип простой, то внизу можно дополнительно его ограничить, указав значения, при этом будет создан квалификатор. Здесь наглядно видно, что нет смысла передавать несколько квалификаторов для одного простого типа, просто следует указать описание максимально возможного значения. Например, если могут записываться как число «12,258» так и «235,5»,то необходимо установить Длина: 6, Точность:3.
Небольшое пояснение: ограничение для числа действует не как обрезание строки. Т.е. если было число «25,12» то указав квалификатор Длина:2, Точность:1 получится число «9,9», а не «5,1».
Чтобы было проще запомнить объект ОписаниеТипов, приведу следующую картинку:
Квалификаторы и ОписаниеТипов
Слова «ОписаниеТипов» и «Квалификаторы» вызывают трудность понимания на начальном этапе использования. По сути это простые вещи — с толку может сбивать их название.
Что такое Квалификаторы?
В 1С есть простые типы: Число , Строка , Дата . Но иногда необходимо уточнить, что переменная будет не просто числом, а например, числом длиной 12 символов и 2 разрядами после запятой, при этом неотрицательное. В простых типах это сделать невозможно т.к. тип не имеет соответствующих свойств. Для таких случаев и нужен объект «Квалификатор».
У каждого простого типа есть свой квалификатор:
Что такое Описание типов?
ОписаниеТипов — это объект, который содержит массив допустимых типов, но т.к. в массиве нет возможности указать дополнительные данные, то отдельно для простых типов ( Число , Строка , Дата ) можно уточнить свойства квалификаторами.
- Типы (обязательный, тип Массив , Строка ). Массив значений типа Тип , состоящий из типов, которые будут использованы в объекте, или строка, содержащая имена типов, разделенных запятыми.
- КвалификаторыЧисла (необязательный, тип КвалификаторыЧисла ). Квалификаторы числа, описывающие допустимые значения числового типа. Если параметр не указан, то числа хранить нельзя.
- КвалификаторыСтроки (необязательный, тип КвалификаторыСтроки ). Квалификаторы строки, описывающие допустимые значения строкового типа. Если параметр не указан, то используется неограниченная длина строки.
- КвалификаторыДаты (необязательный, тип КвалификаторыДаты ). Квалификаторы даты, описывающие допустимые значения типа Дата . Если параметр не указан, то используются обе части даты (дата + время).
Создает описание типов на основании заданных типов и квалификаторов для типов Число , Строка , Дата .
У описания типов есть четыре параметра, первый — обязательный, в нем указываются типы. Остальные — необязательные, в них указываются квалификаторы. Для создания описания типов существует несколько вариантов.
Указание типа строкой:
Можно указать несколько типов, разделяя их запятыми:
Можно передать массив типов:
В последнем примере одним из типов является строка и это не случайно. Даже когда в описании типов указывается квалификатор, обязательно нужно добавлять в типы этот простой тип. Т.к. квалификаторы накладывают ограничение на типы, а не устанавливают их.
Заключение
Описание типов — это объект, который используется, чтобы ограничить ввод данных, а квалификаторы — это объекты, которые дополняют ограничения для простых типов. Квалификаторов в описании типов три — по одному для каждого простого типа: Число , Строка , Дата .
Для наглядности посмотрим на ограничение типов в реквизитах объекта конфигурации. По сути, это один механизм:
1с как изменить квалификатор строки в таблице
Вопрос Создание колонки таблицы значений различных типов в 1С v8
Ответ При создании колонки таблицы значений в качестве типа можно передавать массив типов, и можно конкретный тип. Массив типов используется, когда нужно указать несколько различных типов для одной колонки.
Для указания типов используется «общий объект» — «Описание типов». Поэтому сначала поясним, что такое «Описание типов» («Описание типов значений»).
«Описание типов значений». Для описания допустимых типов значений свойств различных объектов в системе используется специальный объект «ОписаниеТипов». При помощи данного объекта можно описывать допустимые типы значений, которые можно будет присваивать свойствам. Для дополнительного ограничения возможных значений примитивных типов Число, Строка и Дата предусмотрены квалификаторы. Квалификаторы описывают такие параметры, как длина строки или числа, допустимые части даты и т.п.
Синтаксис метода «Описание типов»
Новый ОписаниеТипов( , , , , , )
Параметры:
(необязательный)
Тип: ОписаниеТипов. Исходное описание типов, на основании которого будет строиться новое.
(необязательный)
Тип: Массив, Строка. Массив значений типа Тип, состоящий из типов, которые будут использованы в объекте, или строка содержащая имена типов разделенных запятыми.
(необязательный)
Тип: Массив, Строка. Массив значений типа Тип (или строка, содержащая имена типов, разделенных запятыми), состоящий из типов, которые будут исключены из исходного описания, указанного в первом параметре.
(необязательный)
Тип: КвалификаторыЧисла. Квалификаторы числа, описывающие допустимые значения числового типа.
(необязательный)
Тип: КвалификаторыСтроки. Квалификаторы строки, описывающие допустимые значения строкового типа.
(необязательный)
Тип: КвалификаторыДаты. Квалификаторы даты, описывающие допустимые значения типа Дата.
Описание:
Создает описание типов на основании другого описания типов, путем добавления одних и исключения других типов. Если новый квалификатор не указан, будут оставлены квалификаторы исходного описания типов.
Пример использования объекта «Описание типов»:
Теперь, собственно, примеры корректного создания в таблице значений колонок различных типов.
В общем случае достаточно определить типы колонок таким образом:
Однако, в более общем случае, в качестве типа колонки передается массив. Массив используется в том случае, когда одной колонке нужно задать несколько типов. Тогда определение структуры будет примерно таким (приведены примеры для разных типов колонок, когда тип — массив, но состав массива для упрощения дан одного типа, чтобы не путаться)
ОписаниеТипов в 1С
Для создания объекта ОписаниеТипов можно использовать два вида конструктора. Первый на основании самого типа:
//тип можно указать строкой
СтроковыйТип = Новый ОписаниеТипов(«Строка»);
СсылочныйТип = Новый ОписаниеТипов(«СправочникСсылка.Поставщи ки»);
//для составного типа нужно перечислить типы через запятую
СоставнойТип = Новый ОписаниеТипов(«Число, Булево»);
//также можно создавать через массив типов
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип(«Строка»));
СтроковыйТип = Новый ОписаниеТипов(МассивТипов);
//составной тип через массив типов
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип(«Строка»));
МассивТипов.Добавить(Тип(«СправочникСсыл ка.Поставщики»));
СоставнойТип = Новый ОписаниеТипов(МассивТипов);
Второй на основании уже существующего описания типов, с возможностью добавления новых типов или удаления текущих:
//сначала создадим ОписаниеТипов
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип(«Строка»));
МассивТипов.Добавить(Тип(«СправочникСсыл ка.Поставщики»));
СоставнойТип = Новый ОписаниеТипов(МассивТипов);
//теперь на основании него создадим новое ОписаниеТипов, добавив тип Число.
//добавляемые типы указываются вторым параметром
//Типы также можно указывать через массив или строкой
НовоеОписание = Новый ОписаниеТипов(СоставнойТип, «Число»);
//третьим параметром можно передать типы, которые нужно исключить из
//нового описания типов
НовоеОписание = Новый ОписаниеТипов(НовоеОписание,, «Строка»);
Созданный объект описание типов можно присваивать различным свойствам, например для определения типа колонки таблицы значений:
Квалификаторы
Квалификаторы позволяют конкретизировать тип данных. Указываются в конструкторе при создании объекта ОписаниеТипов.
Квалификаторы числа
Для числа можно указать общее количество разрядов (включая количество разрядов после запятой), количество разрядов после запятой и допустимый знак (любые числа или только положительные):
КвалЧ = Новый КвалификаторыЧисла(10, 4, ДопустимыйЗнак.Неотрицательный);
ЧисловойТип = Новый ОписаниеТипов(«Число», КвалЧ);
ТЗЧисла = Новый ТаблицаЗначений;
ТЗЧисла.Колонки.Добавить(«КвалификаторыЧ исла», ЧисловойТип);
СтрТабл = ТЗЧисла.Добавить();
СтрТабл.КвалификаторыЧисла = 1234567890;
//в строке будет 99999999,99
СтрТабл = ТЗЧисла.Добавить();
СтрТабл.КвалификаторыЧисла = 123.456789;
//в строке будет 123.46
СтрТабл = ТЗЧисла.Добавить();
СтрТабл.КвалификаторыЧисла = -2;
//в строке будет 0
Если данное описание типов присвоить колонке таблицы значений, а потом добавить в эту колонку число 1234567890, то из-за ограничения данное число будет преобразовано в 99999999,99. Если присвоить число 123.456789, то оно будет округлено до двух знаков после запятой 123.46. Если присвоить -2, то так как запрещены отрицательные числа, то оно будет преобразовано в 0.
Квалификаторы строки
Строка может быть неограниченной длины и ограниченной. Ограниченная строка может быть переменной или фиксированной длины. Например, если указать длину строки равной 5, то при использовании переменной длины строка «Стр» будет равна «Стр» и ее фактическая длина будет равна трем. При использовании фиксированной длины, строка «Стр» будет дополнена справа пробелами и получится: «Стр «. То есть ее фактическая длина всегда равна длине, которая была указана при описании типа.
Данные параметры можно указать через квалификаторы строки:
КвалСтр = Новый КвалификаторыСтроки(5);
//по умолчанию используется переменная длина
СтроковыйТип = Новый ОписаниеТипов(«Строка», КвалСтр);
ТЗСтроки = Новый ТаблицаЗначений;
ТЗСтроки.Колонки.Добавить(«Квалификаторы Строки», СтроковыйТип);
СтрТабл = ТЗСтроки.Добавить();
СтрТабл.КвалификаторыСтроки = «Стр»;
СтрТабл = ТЗСтроки.Добавить();
СтрТабл.КвалификаторыСтроки = «Строка»; //влезло только Строк
В данном примере была создана ограниченная строка с переменной длиной в 5 символов. Поэтому во второй строке будет «Строк», а не «Строка».
Для указания строки неограниченной длины нужно указать ее длину равной нулю:
КвалСтр = Новый КвалификаторыСтроки(0);
//если первый параметр равен 0, то второй параметр игнорируется,
//какой бы он ни был указан
СтроковыйТип = Новый ОписаниеТипов(«Строка», КвалСтр);
ТЗСтроки = Новый ТаблицаЗначений;
ТЗСтроки.Колонки.Добавить(«Квалификаторы Строки», СтроковыйТип);
СтрТабл = ТЗСтроки.Добавить();
СтрТабл.КвалификаторыСтроки = «Стр»;
СтрТабл = ТЗСтроки.Добавить();
СтрТабл.КвалификаторыСтроки = «Строка»; //все влезло
Чтобы сделать строку фиксированной нужно указать второй параметр в конструкторе КвалификаторыСтроки:
КвалСтр = Новый КвалификаторыСтроки(5, ДопустимаяДлина.Фиксированная);
СтроковыйТип = Новый ОписаниеТипов(«Строка», КвалСтр);
ТЗСтроки = Новый ТаблицаЗначений;
ТЗСтроки.Колонки.Добавить(«Квалификаторы Строки», СтроковыйТип);
СтрТабл = ТЗСтроки.Добавить();
СтрТабл.КвалификаторыСтроки = «Стр»; //было добавлено 2 пробела «Стр «
СтрТабл = ТЗСтроки.Добавить();
СтрТабл.КвалификаторыСтроки = «Строка»; //влезло только Строк
В этом случае в первой строке было добавлено 2 пробела в конце строки, чтобы ее длина была равна 5.
Квалификаторы даты
Для даты можно указать части даты:
— Дата и время
— Только дата, без времени
— Только время, без даты
КвалД = Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя);
ТипДата = Новый ОписаниеТипов(«Дата», КвалД);
ТЗДаты = Новый ТаблицаЗначений;
ТЗДаты.Колонки.Добавить(«КвалификаторыДа ты», ТипДата);
СтрТабл = ТЗДаты.Добавить();
СтрТабл.КвалификаторыДаты = Дата(2021, 3, 5, 21,0,0); //5 марта 2021 21:00
В данном примере в строке будет полная дата со временем 5 марта 2021 года , время 21:00.
Если указать только дату, то время будет равно времени по умолчанию: 0 часов, 0 минут, 0 секунд.
КвалД = Новый КвалификаторыДаты(ЧастиДаты.Дата);
ТипДата = Новый ОписаниеТипов(«Дата», КвалД);
ТЗДаты = Новый ТаблицаЗначений;
ТЗДаты.Колонки.Добавить(«КвалификаторыДа ты», ТипДата);
СтрТабл = ТЗДаты.Добавить();
СтрТабл.КвалификаторыДаты = Дата(2021, 3, 5, 21,0,0); //5 марта 2021 00:00
Если указать только время, то дата будет равна дате по умолчанию: 1 января 1 года.
КвалД = Новый КвалификаторыДаты(ЧастиДаты.Время);
ТипДата = Новый ОписаниеТипов(«Дата», КвалД);
ТЗДаты = Новый ТаблицаЗначений;
ТЗДаты.Колонки.Добавить(«КвалификаторыДа ты», ТипДата);
СтрТабл = ТЗДаты.Добавить();
СтрТабл.КвалификаторыДаты = Дата(2021, 3, 5, 21,0,0); //01.01.01 21:00
Как привести значение к нужному типу
Чтобы привести некоторое значение к нужному типу можно использовать метод ПривестиЗначение:
КвалЧ = Новый КвалификаторыЧисла(15,4);
ЧисловойТип = Новый ОписаниеТипов(«Число», КвалЧ);
Пер = 12.345;
ОкрПер = ЧисловойТип.ПривестиЗначение(Пер); //12.35
В данном примере переменная Пер была округлена до двух знаков после запятой.
Данный метод можно использовать чтобы получить значение по умолчанию для типа. Для этого нужно ничего не передавать в параметрах:
Как проверить входит ли Тип в ОписаниеТипов
Для этого можно воспользоваться методом СодержитТип. Данный метод вернет Истина, если переданный ему в параметрах тип присутствует в описании типов:
КвалЧ = Новый КвалификаторыЧисла(15,2);
ЧисловойТип = Новый ОписаниеТипов(«Число», КвалЧ);
ТипЧисло = Тип(«Число»);
ТипСтрока = Тип(«Строка»);
ЕстьЧисло = ЧисловойТип.СодержитТип(ТипЧисло);
ЕстьСтрока = ЧисловойТип.СодержитТип(ТипСтрока);
Сообщить(ЕстьЧисло); //Истина
Сообщить(ЕстьСтрока); //Ложь
Как получить все используемые типы из описания типов
Для этого предназначен метод Типы, который вернет массив всех используемых типов:
СоставнойТип = Новый ОписаниеТипов(«Булево, Строка, Дата»);