Типы данных в 1С

Типы данных С++

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

Тип данных однозначно определяет:

  • множество их возможных значений (связанное с внутренним представлением данных в памяти компьютера);
  • допустимые действия над данными (операции и функции).

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

Объем памяти, выделяемый для величин, тоже зависит от типа. По стандарту единицей памяти в С++ является байт.

Типы языка С++ делятся на элементарные (базовые, основные) и составные. Элементарные типы данных являются неделимыми и позволяют описывать целые, вещественные, символьные и логические величины. На основе этих типов программист может конструировать составные типы. Составной тип — это тип, определенный в терминах другого типа. К составным типам относятся массивы, структуры, объединения, перечисления, ссылки, указатели и классы. Внутреннее представление данных всех типов, их размеры и диапазоны величин определяются конкретной платформой.

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


Рис. 1.1. Типы данных стандартного С++

Базовые типы данных

Элементарные типы данных, если исключить из них тип void, часто называют арифметическими,поскольку их можно использовать в арифметических операциях. Для их описания определены следующие ключевые слова:

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

Существует четыре ключевых слова, уточняющих внутреннее представление и диапазон значений стандартных типов:

  • short (короткий);
  • long (длинный);
  • signed (знаковый);
  • unsigned (беззнаковый).

Сочетания перечисленных ключевых слов формируют 14 различных арифметических типов, приведенных на рис. 1.1. Например, char, signed char и unsigned char — это три равноправных различных типа.

ПРИМЕЧАНИЕ

Во многих других языках символьные типы более четко отделены от арифметических. В С++ символы фактически являются подмножеством целых величин и могут участвовать в арифметических операциях. По этой причине типы signed char и unsigned char встречаются на рисунке дважды: как символьные и как целые типы. Это соответствует описанному в стандарте.

Логический тип

Величины логического типа могут принимать только значения true и false, являющиеся ключевыми словами. Величины логического типа могут участвовать в арифметических операциях. При преобразовании к целому типу true имеет значение 1, false — нуль. Размер логического типа в стандарте не определен и зависит от реализации.

Символьные типы

В стандарте языка определено три различных символьных типа: char, signed char и unsigned char. Внутренним представлением символа является его код — целое число. Под величину любого символьного типа отводится одна единица памяти — байт:

sizeof(char) = sizeof(signed char) = sizeof(unsigned char) = 1

Размер байта зависит от реализации, однако этот размер должен быть достаточен, чтобы вместить код любого символа из набора символов реализации для данного компьютера. Наличие знака у типа char тоже зависит от реализации: он может совпадать либо с signed char, либо с unsigned char.

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

Целые типы

В языке С++ определено 8 типов для хранения целочисленных величин: четыре знаковых ( signed char, short int, int, long int ) и четыре беззнаковых ( unsigned char, unsigned short int, unsigned int, unsigned long int ). По умолчанию все целочисленные типы считаются знаковыми, поэтому спецификатор signed можно не указывать. Ключевое слово unsigned позволяет представлять неотрицательные целые числа.

ПРИМЕЧАНИЕ

Типы short int, long int, signed int и unsigned int можно сокращать до short, long, signed и unsigned соответственно.

Целым константам, встречающимся в программе, по умолчанию приписывается тип signed int. Если он по каким-либо причинам не устраивает программиста, можно явно указать требуемый тип с помощью суффиксов L, l ( long ) и U, u ( unsigned ). Например, константа 32L будет иметь тип long и занимать 4 байта. Можно использовать суффиксы L и U одновременно, например, 0x22UL или 05Lu.

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

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long).

При этом сказано, что тип int должен иметь естественный размер, обеспечиваемый архитектурой компьютера. Диапазоны значений величин целых типов для IBM PC -совместимых компьютеров приведены в таблице 1.2.

Visual С++.NET 2005 предоставляет несколько нестандартных целых типов. Например, тип long long определяет целые числа в диапазоне от -9 223 372 036 854 775 808 до +9 223 372 036 854 775 807 и занимает в памяти 8 байт.

Типы с плавающей точкой

Стандарт С++ определяет три типа данных для хранения вещественных значений: float, double и long double. Все они имеют знак.

Внутреннее представление вещественного числа состоит из мантиссы и порядка. Длина мантиссы определяет точность числа, а длина порядка — его диапазон.

Константы с плавающей точкой имеют по умолчанию тип double. Можно явно указать тип константы с помощью суффиксов F, f ( float ) и L, l ( long ). Например, константа 2E+6L имеет тип long double.

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

Тип void

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

В этой статье разберем возможности приведения типов в языке запросов 1С, которые предоставляет функция «Выразить».
Рассмотрим несколько вариантов применения этой функции.
И первый вариант – округление чисел.

Для этого необходимо использовать функцию Выразить в следующем формате:

Выразить( как Число( , ))

Где:
Число — поле, параметр которое нужно округлить
ДлинаЧисла — максимальная длина числа
Точность — точность округления числа

Параметры и длинна и точность должны быть целыми положительными числами.
Посмотрите, как работает эта функция на рисунке ниже.

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

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

Выразить( как Строка( )

Где
ДлинаСтроки – максимальная длина, к которой будет приведена строка.
Переделаем запрос: будем в условии приводить неограниченную строку к строке с определенной длинной. Тогда ни каких ошибок не будет.

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

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

Выразить( как Документ. )
Выразить( как Справочник. ).

Где
ИмяТаблицы — название объекта в конфигураторе 1С.

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

Если Вы всё еще «плаваете» в конструкциях языка запросов, и у Вас вызывают трудности даже самые простые запросы, то рекомендую вам мой курс «Запросы в 1С от новичка до профи». Где эти и многие другие вопросы рассматриваются более подробно.

В чем особенность этого курса:
• Курс рассчитан на тех, кто не знаком с языком запросов в 1С;
• Учебный материал грамотно скомпонован и прост в освоении;
• Несколько десятков уроков;
• Полезные практические примеры;
• Все уроки изложены понятным и простым языком

Для моих читателей, купон на скидку 25%: hrW0rl9Nnx

Я стараюсь как можно чаще выпускать различные интересные бесплатные статьи и видеоуроки. Поэтому буду очень рад, если Вы поддержите мой проект перечислив любую сумму:

Можете перечислить любую сумму напрямую:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655

• 1С8 простые примеры разработки. » 1C8 примеры кода. » 1С8 пример запроса 1С. Поля неограниченной длины и поля несовместимых типов.

Язык 1С 8 не строго типизированым как например С и C#.
для сравнения двух величин они должны быть одного типа.
Функция ВЫРАЗИТЬ( КАК) служит для приведения значения к заданному типу.
Пример синтаксиса в запросе:
ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(1000)) КАК стрПредставление
В запросах 1С 8 нельзя сравнивать поля неограниченной длины или поля несовместимых типов.

Пример запроса к регистру сведений. Пример очищает записи с неверными адресами E-mail в регисте сведений.

Поле КонтактнаяИнформация.Представление — строка неограниченной длины. При попытке сравнить ее в запросе с пустой строкой возникает Неприятная ошибка при выполнении запроса:

Неверные параметры в операции сравнения. Нельзя сравнивать поля неограниченной длины и поля несовместимых типов.

Используем функцию ВЫРАЗИТЬ( . КАК СТРОКА(1000)) ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(1000)) <> «»»»

или через параметр

ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(1000)) <> &ПустоеЗначение

Предлагаем решение Ваших задач 1С.

  • Организуем вам индивидуальное экспресс обучение программам 1С.
  • Мы поможем Вам начать работать с программами 1С.
  • Мы поможем Вам настроить ваши отчеты в 1С.
  • Установим и настроим 1С под ваши задачи.
  • Поможем сделать ввод начальных остатков по складам и контрагентам
  • Перенесем данные из старых систем.
  • Подскажем как избежать ошибок.

Доработка и сопровождение 1С:

  • Доработаем существующие или создадим новые печатных формы и документы.
  • Разработаем внешние отчеты по Вашим требованиям.
  • Напишем внешние обработоки по загрузке документов из учетных (торговых) систем в бухгалтерию.
  • Разработаем приложения для выгрузки данных на сайты.

Ориентировочная стоимость работ программиста 1С : 1 500 р. за 1 час работы.

Раздел содержит описание особенности выполнения функции ПОДСТРОКА() языка запросов в клиент-серверном варианте работы и вытекающие из нее рекомендации по построению запросов.

Функция ПОДСТРОКА()

В языке запросов 1С:Предприятия функция ПОДСТРОКА() в формате ПОДСТРОКА( , , ) может применяться к данным строкового типа и позволяет выделить фрагмент , начинающийся с символа номер (символы в строке нумеруются с 1) и длиной символов. Результат вычисления функции ПОДСТРОКА() имеет строковый тип переменной длины, причем длина будет считаться неограниченной, если имеет неограниченную длину и параметр не является константой или превышает 1024.

Вычисление функции ПОДСТРОКА() на SQL сервере

В клиент-серверном варианте работы функция ПОДСТРОКА() реализуется при помощи функции SUBSTRING() соответствующего оператора SQL, передаваемого серверу баз данных SQL Server, который вычисляет тип результата функции SUBSTRING() по сложным правилам в зависимости от типа и значений ее параметров, а так же в зависимости от контекста, в котором она используется.

В большинстве случаев эти правила не оказывают влияния на выполнение запроса 1С:Предприятия, однако есть случаи, когда для исполнения запроса существенна максимальная длина строки результата, вычисленная SQL Server. Важно иметь в виду, что в некоторых контекстах использования функции ПОДСТРОКА() максимальная длина ее результата может оказаться равной максимальной длине строки ограниченной длины, которая в SQL Server равна 4000 символам. Это может привести к неожиданному аварийному завершению выполнения запроса.

ВЫБРАТЬ
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление1
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
УПОРЯДОЧИТЬ ПО
Представление,
Представление1

завершается аварийно с сообщением:

Это происходит потому, что вычисленная Microsoft SQL Server максимальная длина строки, которая является результатом выражения:

ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ПОДСТРОКА(Представление, 0, 200)
ИНАЧЕ NULL
КОНЕЦ КАК Представление,

равна 4000 символов. Поэтому длина записи, состоящей из двух таких полей превышает 8000 байт, разрешенные для выполнения операции сортировки.

В связи с описанной особенностью исполнения функции SUBSTRING() на SQL Server использование функции ПОДСТРОКА() с целью приведения строк неограниченной длины к строкам ограниченной длины не рекомендуется. Вместо нее лучше использовать операцию приведения типа ВЫРАЗИТЬ() . В частности, приведенный пример можно переписать в виде:

ВЫБРАТЬ
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NULL
КОНЕЦ КАК Представление,
ВЫБОР
КОГДА Вид = &ЮрАдресФизЛица
ТОГДА ВЫРАЗИТЬ(Представление КАК Строка(200))
ИНАЧЕ NULL
КОНЕЦ КАК Представление1
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
УПОРЯДОЧИТЬ ПО
Представление,
Представление1

Add a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *