Число в 1С 8 — значение примитивного типа Число . Числовым типом может быть представлено любое десятичное число. С числовыми данными возможно совершать основные арифметические операции: сложение, вычитание, умножение и деление. Максимальное количество разрядов для числа в 1с 8: 38 знаков.
Литералы числа: набор цифр вида: [+|-]{0|1|2|3|4|5|6|7|8|9}[.{0|1|2|3|4|5|6|7|8|9}] В качестве разделителя целой и дробной части используется «.» (точка).
Пример 1. Создадим числовую переменную
ЧислоПи = 3.14;
Преобразовать в число можно значения строкового типа, либо логического типа (Булево ). Значение типа Булево преобразуется в число по следующим правилам:
Значение типа Строка преобразуется в число в том случае, если оно является строковым представлением литерала численного типа.
Для преобразования существует специальная функция Число(<Значение>) , которая возвращает полученное число, если преобразование удалось и выдает сообщение об ошибке в противном случае.
Пример 2. Преобразовать в 1с число строку «1.25»
Строка = "1.25"; ПолученноеЧисло = Число(Строка);
После выполнения данного кода в переменной ПолученноеЧисло будет содержаться числовое значение 1.25
Пример 3. Преобразовать в число строку «Привет мир!»
Строка = "Привет мир!"; ПолученноеЧисло = Число(Строка);
При попытке выполнить данный код будет выдано сообщение об ошибке: «Преобразование значения к типу Число не может быть выполнено».
В данном разделе будут рассмотрены основные функции работы с числами в 1с 8 и приведены примеры их использования.
Цел(<Число>) . Возвращает целую часть числа переданного в параметре.
Пример 4. Определить делится ли число 121 на 11.
Делимое = 121; Делитель = 11; Результат = Делимое / Делитель; Если Цел(Результат) = Результат Тогда Сообщить("Делится нацело"); Иначе Сообщить("Не делится нацело"); КонецЕсли;
Результатом выполнения данного кода будет вывод на экран сообщения «Делится нацело».
Окр(<Число>, <Разрядность>, <РежимОкругления> ). Функция округляет число, переданное в первом параметре, до знака после запятой переданного во втором параметре. Значение разрядности может быть и нулевым (округление до целого) и отрицательным (округление до соответствующего разряда целой части). Параметр РежимОкругления может принимать значения:
Пример 5. Для того чтобы лучше разобраться с принципами округления рассмотрим округление до целого в меньшую и большую стороны, на ряде чисел от 1.1 до 1.9
Массив = Новый Массив; Шаг = 0.1; Число = 1; Пока Число < 1.9 Цикл Число = Число + Шаг; Массив.Добавить(Число); КонецЦикла; Для Каждого Стр Из Массив Цикл Сообщить("Исходное: "+Стр+" В меньшую: "+Окр(Стр,0,0)+" В большую:"+Окр(Стр,0,1)); КонецЦикла;
Pow(<Основание>, <Показатель>) . Возводит число переданное в первом параметре в степень переданную во втором параметре.
Пример 6. Извлечь квадратный корень из числа 144, а затем возвести его в квадрат, в итоге снова должно получится число 144.
Число = 144; КвКорень = Pow(Число, 1/2); Число = Pow(КвКорень, 2); Сообщить(Число);
Результатом исполнения кода будет вывод на экран числа 144.
Exp(<Число>). Получает экспоненту от числа переданного в параметр.
Применяются следующие логические операции:
НЕ логическое НЕ (отрицание); И логическое И;
ИЛИ логическое ИЛИ.
Операндами логических операций должны быть логические выражения. В табл. 2.5 приведены результаты логических операций над логическими выражениями ЛВ1 и ЛВ2, принимающими значения истина (И) или ложь (Л).
Таблица истинности
Таблица 2.5
ЛВ1 | ЛВ2 | ЛВ1 И ЛВ2 | ЛВ1 ИЛИ ЛВ2 | НЕ ЛВ1 |
И | И | И | И | Л |
И | Л | Л | И | Л |
Л | И | Л | И | И |
Л | Л | Л | Л | И |
Операция отрицания является унарной операцией, располагаемой слева от операнда. Все остальные рассмотренные операции являются бинарными.
2.6.5. ПРИОРИТЕТ ВЫПОЛНЕНИЯ ОПЕРАЦИЙ
Все операции 1С выполняются в выражении слева направо в соответствии с их приоритетом (старшинством), то есть, если две последовательные операции имеют равный приоритет, первоначально выполняется левая операция. Подвыражения, заключенные в круглые скобки, вычисляются в первую очередь. В табл. 2.6 операции 1С расположены в порядке убывания их приоритета.
Приоритет выполнения операций
Таблица 2. б
% *,/ +, НЕ И ИЛИ <, <=, >, >=, =, <>
Замечание. Каждая ячейка таблицы содержит операции с равным приоритетом.
Пример:
8 % 2 * 3 | // | Вернет 0 |
8 % (2 * 3) | // | Вернет 2 |
Поскольку логические операции старше операций отношения, то ошибочно следующее логическое выражение:
3>2и4< 5 // Так неверно
так как первоначально оценивается логическое подвыражение 2и 4
операнды которого не есть истина или ложь. А это неверно.
Зато верно логическое выражение
(3 > 2) и (4 < 5) // Это истина Пример. Вычислить результат логического выражения
(х / а = 1) или (б / (а + б) < 1) и не (б = а) или (х <> 6) при х = 6.0, а = 2.0 и б=3.0.
Вычислив результат операций подвыражений, заключенных в круглые скобки, по лучим:
ложь или истина и не ложь или ложь.
ложь или истина и истина или ложь. После выполнения истина и истина: ложь или истина или ложь. Окончательный результат: истина.
Массив это объект данных, содержащий несколько значений, доступ к которым осуществляется по их номеру (индексу).
Число элементов массива называется его размером. Размером массива может быть только целочисленная буквальная константа.
Оператор перем а;
объявляет одномерный массив (вектор) а из пяти элементов. Элементы массива имеют следующие имена: а, а, а, а и а. В этих именах величины 1-5 индексы элементов массива.
Массив считается определенным, если заданы значения всех его элементов. Для задания начальных значений элементов массива (инициализации массива) возможен следующий цикл:
для ин = 1 по 5 цикл
Присваивания
изменят соответственно значения 2-го и 5-го элементов массива а.
В общем случае в качестве индексов массива могут использоваться числовые выражения, называемые индексными выражениями. Например:
а = 9.1; // Меняем значение 3-го элемента массива а
Если индексное выражение массива вычисляется с нецелым значением, то в каче стве индекса берется целая часть этого значения. Например:
а = 9.1; // Меняем значение 1 -го элемента массива а
Значение индекса не должно выходить за границы массива. Так, при работе с ранее объявленным массивом а из пяти элементов ошибочны операторы
Элементы одного и того же массива могут быть разного типа. Например:
а = ‘25.11.01’; // Элемент типа Дата Элементы массива могут быть агрегатного типа. Например:
сСотр= СоздатьОбъект(“Справочник.Сотрудники”);
табл = СоздатьОбъект(“Таблица”);
Массив не может в качестве элементов содержать другие массивы.
Массив может быть формальным параметром программного компонента (процедуры или функции). При этом размер массива не указывается, а квадратные скобки сохраняются. Для определения размера переданного процедуре (функции) массива используется встроенная функция Разм.
Пример:
процедура ИнициализацияМассива(а) перем ин, размА;
размА = Разм(а); // Встроенная функция Разм вернет размер массива а
для ин = 1 по размА цикл
а[ин] = 1; // Теперь все элементы массива равны единице конецЦикла;
конецПроцедуры // ИнициализацияМассива
процедура Выполнить() перем а;
// Вызов процедуры, устанавливающей начальные значения элементов массива
// Ее фактическим параметром является имя массива ИнициализацияМассива(а);
конецПроцедуры // Выполнить
Здравствуйте дорогие читатели. Я уже писал о таких примитивных типах данных как NULL и Строка, а сегодня рассмотрим примитивный тип данных Число (Number) .
Числовым у нас может быть реквизит объекта конфигурации или переменные в .
Максимально допустимая разрядность числа составляет 38 знаков, длина целой части не может превышать 32 символа, точность — 10 символов. Хотя в переменных можно оперировать числами превышающих разрядность в 38 символов, но в ИБ (информационную базу) можем записывать значения с длинной целой части не больше 32-х знаков.
Над данными числового типа применимы операции: +, -, *, /, (), %(остаток от деления нацело 10%3=1).
Математические функции для чисел можно посмотреть в синтакс помощнике
Общее описание встроенного языка-> Встроенные функции-> Функции по работе с типом Число
Из всех функции, которые там приведены лично мне пока пришлось работать только с двумя:
Окр(<Число>, <Разрядность>, <РежимОкругления>)
Функция округляет исходное число до нужной разрядности в соответствии с заданным режимом округления.
Параметры: <Число> (обязательный), Исходное число. Остальные параметры не обязательны.
Цел(<Число>) — Функция вычисляет целую часть переданного числа, полностью отсекая дробную часть.
Пример: МожноКупить = Цел (Наличность / Цена );
Если вы сталкивались в задачах с другими функциями, напишите примеры в комментариях.
Часто на практике встречается преобразование типов данных из строки в число, для этих целей есть функция Число().
Функция Число()
— Преобразует полученный параметр (параметр обычно строкового типа) в значение типа Число.
Пример: КонтрольноеЧисло
=
Число
(Прав
(СтраховойНомер
,
2
));
Типа Булево преобразуется в число:
Ложь преобразуется в 0;
Истина преобразуется в 1.
Приоритет арифметических операций:
1) ()
2) Унарные арифметические операции (+, -)
3) *, /, %
4) Бинарные арифметические операции (+, -)
5) Операции сравнения (>,>=,
6) НЕ
7) И
ИЛИ
Приведу еще пару функций которые полезны при работе с Числом
Формат(<Значение>, <ФорматнаяСтрока>)
Функция формирует удобное для чтения представление значений.
Параметры: <Значение> (обязательный) Тип параметра: Число; Дата; Булево.
Форматную строку удобно задавать, вызвав: Конструктор форматной строки
Макс(<Значение1>,…,<ЗначениеN>)
Функция определяет максимальное значение из полученных параметров.
Параметры: <Значение1>,…,<ЗначениеN> (обязательный) и могут иметь один Тип: Число; Строка; Дата; Булево.
Пример:
// Пример для чисел
A = Макс(1 , 2 , 3 ); // A = 3
Мин(<Значение1>,…,<ЗначениеN>) Из полученных параметров функция определяет минимальное значение.
Условия в запросах применяются, когда необходимо выбрать не все записи из таблицы информационной базы 1С, а только соответствующие одному или нескольким критериям отбора.
Условия в запросах 1С могут задаваться различными способами в зависимости от особенностей самого запроса и источника данных.
Ключевое слово ГДЕ используется в запросах 1С, когда условие применяется к записям, отбираемым из информационной базы. При этом фильтрация записей происходит на этапе их выбора из таблицы информационной базы.
Например, есть таблица Выплаты , содержащая перечень сотрудников и произведенные им выплаты.
Если необходимо отобрать выплаты на сумму не менее 10 000, то запрос будет выглядеть следующим образом
Запрос.
Текст=
"ВЫБРАТЬ
| Выплаты.Сотрудник,
| Выплаты.Зарплата
|ИЗ
| Выплаты
|ГДЕ
| Выплаты.Зарплата >=10000"
Результатом выполнения запроса будет следующая таблица.
Ключевое слово ИМЕЮЩИЕ в запросах 1С применяется, когда необходимо произвести отбор среди уже выбранных записей. Напрмиер, это ключевое слово применяется, когда нужно произвести фильтрацию сгруппированных записей в результате запроса.
Вернемся к примеру, рассмотренному выше. Допустим, необходимо выбрать из таблицы Выплаты сотрудников, которые в сумме получили больше 20 000. Для этого, сначала нужно ввести группировку по полю Сотрудник , подсчитать сумму по полю Зарплата для каждого сотрудника, а потом из полученных записей отобрать те, которые удовлетворяют условию.
Текст запроса будет выглядеть следующим образом.
Запрос.
Текст=
"ВЫБРАТЬ
| Выплаты.Сотрудник,
| СУММА(Выплаты.Зарплата) КАК Зарплата
|ИЗ
| Выплаты
|СГРУППИРОВАТЬ ПО
| Выплаты.Сотрудник
|ИМЕЮЩИЕ
| СУММА(Выплаты.Зарплата) > 20000"
Результат выполнения этого запроса будет таким.
На этом примере наглядно видна разница между ключевыми словами ГДЕ и ИМЕЮЩИЕ. Если бы мы использовали слово ГДЕ вместо ИМЕЮЩИЕ , то сначала был бы произведен отбор записей с зарплатой больше 20000, а потом по ним подсчитана сумма по каждому сотруднику. В результате мы получили бы пустой результат запроса, т.к. ни один сотрудник не получал больше 20000 за одну выплату.
Виртуальные таблицы есть у всех регистров в системе 1С:Предприятие: регистров накопления, регистров сведений, регистров бухгалтерии. Задать условия к виртуальным таблицам можно двумя способами:
Различия между секциями ГДЕ и ИМЕЮЩИЕ мы уже рассматривали. Чтобы было понятно, чем условия в этих секциях запроса отличаются от условий в параметрах виртуальной таблицы, нужно понять, что же такое виртуальные таблицы регистров в 1С. Важной их особенностью является то, что они не существуют в информационной базе. Это инструмент, предоставляемый нам платформой 1С:предприятие для оптимизации работы конфигурации.
Таким образом, если условие прописано в параметрах виртуальной таблицы, то оно применяется на этапе ее формирования из записей реальной таблица регистра. А если в секциях ГДЕ или ИМЕЮЩИЕ , то — к записям уже сформированной виртуальной таблицы.
Рассмотрим пример. Дана таблица периодического регистра сведений КурсыВалют .
Требуется выбрать на наименьшую дату валюты, курс которых меньше 30 р.
Запрос с условием в параметрах виртуальной таблицы будет выглядет так:
В этом случае мы получим одну запись: Доллар 28,3 от 01.02.2007. Это будет верное решение задачи.
Если же мы поместим условие в секцию ГДЕ, то результат запроса будет пустым, поскольку сначала будет сделан срез первых по каждой валюте (в результате получим две записи от 01.01.2007 Доллар 30,25 и Евро 40,5 ), а потом из них будут выбраны записи, удовлетворяющие условию. Но обе полученные записи условию Курс < 30 не удовлетворяют.
К полям запроса можно применять различные функции. В этом разделе я рассмотрю наиболее часто применяемые (лично мною) из них.
ДАТАВРЕМЯ - задает константное поле с типом Дата. Синтаксис:
ДАТАВРЕМЯ(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)
Запрос.Текст =
"ВЫБРАТЬ
| ДАТАВРЕМЯ(2013, 1, 1) КАК ОМГ";//1 января 2013
РАЗНОСТЬДАТ
- возвращает разность 2-х дат в указанном измерении (год, месяц, день, час, минута, секунда). Синтаксис:
РАЗНОСТЬДАТ(<Дата1>, <Дата2>, <Тип>)
Запрос.Текст =
"ВЫБРАТЬ
| РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2013, 2, 28), ДАТАВРЕМЯ(2013, 1, 1), ДЕНЬ)
| КАК ДнейДоКонцаЗимы";
ЗНАЧЕНИЕ - задает константное поле с предопределенной записью одной из таблиц БД, также можно передать пустую ссылку. Синтаксис:
ЗНАЧЕНИЕ(<Имя>)
Запрос.Текст =
"ВЫБРАТЬ
//предопределенный элемент справочника
| ЗНАЧЕНИЕ(Справочник.Валюты.Рубли) КАК Рубль,
//пустая ссылка на документ
| ЗНАЧЕНИЕ(Документ.СчетНаОплатуПокупателю.ПустаяСсылка) КАК ПустойСчет,
//значение перечисления
| ЗНАЧЕНИЕ(Перечисление.ПолФизическихЛиц.Мужской) КАК Мужчина,
//предопределенный счет из плана счетов
| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары) КАК Счет_41";
ВЫБОР - аналог конструкции ЕСЛИ для языка запросов 1С. Синтаксис:
ВЫБОР
КОГДА <Выражение> ТОГДА <Выражение>
ИНАЧЕ <Выражение>
КОНЕЦ
Запрос.Текст =
"ВЫБРАТЬ
//если цена меньше 100, то запрос все равно вернет 100
//в противном случае запрос вернет реальную цену
| ВЫБОР
| КОГДА Товары.Цена > 100
| ТОГДА Товары.Цена
| ИНАЧЕ 100
| КОНЕЦ КАК Цена
|ИЗ
ССЫЛКА <Имя таблицы>
Запрос.Текст =
"ВЫБРАТЬ
//если тип значения регистратора документ Приходная,
//тогда запрос вернет "Поступление товаров", иначе "Реализация товаров"
| ВЫБОР
| КОГДА Остатки.Регистратор ССЫЛКА Документ.Приходная
| ТОГДА ""Поступление товаров""
| ИНАЧЕ ""Реализация товаров""
| КОНЕЦ КАК ВидДвижения
|ИЗ
| РегистрНакопления.Остатки КАК Остатки";
МЕЖДУ - проверяет значение на вхождение в диапозон. Синтаксис:
МЕЖДУ <Выражение> И <Выражение>
Запрос.Текст =
//получим все товары в диапазоне цен от 100 до 1000
"ВЫБРАТЬ
| Товары.Товар
|ИЗ
|ГДЕ
| Товары.Цена МЕЖДУ 100 И 1000";
В и В ИЕРАРХИИ - проверяют наличие значения в передаваемом списке. В ИЕРАРХИИ также развернет иерархические элементы вниз и поищет значение среди подчиненных элементов. Синтаксис:
В(<СписокЗначений>), В ИЕРАРХИИ(<СписокЗначений>)
Запрос.Текст =
//получим все субсчета 41-го и 10-го счета
"ВЫБРАТЬ
| Хозрасчетный.Ссылка КАК Счет
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Ссылка В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары),
| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))";
ПОДОБНО - позволяет сравнивать строку с шаблоном, используется когда строка поиска жестко не определена. Построение шаблона:
Синтаксис:
ПОДОБНО "<ТекстШаблона>"
Запрос.Текст =
//найдем все стулья в справочнике номенклатура
"ВЫБРАТЬ
| Товары.Товар
|ИЗ
| Справочник.Товары КАК Товары
|ГДЕ
| Товары.Наименование ПОДОБНО ""тул%""";
//этот запрос вернет Стул, стул, стульчик, стул офисный и т.д.,
//но стол в этом списке не окажется
ЕСТЬNULL - если поле не определено, то определяет его в указанное выражение. Синтаксис:
ЕСТЬNULL(<Выражение>, <Выражение>)
Запрос.Текст =
//Если поле не определено (NULL)? то присвоим ему пустую ссылку
"ВЫБРАТЬ
| ЕСТЬNULL(Товары.Ссылка, ЗНАЧЕНИЕ(Справочник.Товары.ПустаяСсылка)) КАК Товар
|ИЗ
| Справочник.Товары КАК Товары";
Замечу, что NULL следует обязательно обрабатывать, т.к. это очень "капризный" тип (в системе "1С:Предприятие 8" определен специальный тип NULL с одним элементом). Если вы попытаетесь сравнить со значением данного типа или присвоить его, то обязательно нарветесь на ошибку, поэтому не забывайте о данной конструкции. Когда может выскочить NULL:
Это далеко не полный список функций языка запросов 1С 8, если заинтересует работа каких-либо еще - пишите в комментариях.