Число в 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;
Преобразование значений другого типа в число
Преобразовать в число можно значения строкового типа, либо логического типа (Булево ). Значение типа Булево преобразуется в число по следующим правилам:
- Ложь преобразуется в 0;
- Истина преобразуется в 1.
Значение типа Строка преобразуется в число в том случае, если оно является строковым представлением литерала численного типа.
Для преобразования существует специальная функция Число(<Значение>) , которая возвращает полученное число, если преобразование удалось и выдает сообщение об ошибке в противном случае.
Пример 2. Преобразовать в 1с число строку «1.25»
Строка = "1.25"; ПолученноеЧисло = Число(Строка);
После выполнения данного кода в переменной ПолученноеЧисло будет содержаться числовое значение 1.25
Пример 3. Преобразовать в число строку «Привет мир!»
Строка = "Привет мир!"; ПолученноеЧисло = Число(Строка);
При попытке выполнить данный код будет выдано сообщение об ошибке: «Преобразование значения к типу Число не может быть выполнено».
Функции работы со значениями типа Число в 1с 8.3
В данном разделе будут рассмотрены основные функции работы с числами в 1с 8 и приведены примеры их использования.
Цел
Цел(<Число>) . Возвращает целую часть числа переданного в параметре.
Пример 4. Определить делится ли число 121 на 11.
Делимое = 121; Делитель = 11; Результат = Делимое / Делитель; Если Цел(Результат) = Результат Тогда Сообщить("Делится нацело"); Иначе Сообщить("Не делится нацело"); КонецЕсли;
Результатом выполнения данного кода будет вывод на экран сообщения «Делится нацело».
Окр
Окр(<Число>, <Разрядность>, <РежимОкругления> ). Функция округляет число, переданное в первом параметре, до знака после запятой переданного во втором параметре. Значение разрядности может быть и нулевым (округление до целого) и отрицательным (округление до соответствующего разряда целой части). Параметр РежимОкругления может принимать значения:
- 0 (или РежимОкругления.Окр15как10) . Округляет в меньшую сторону, то есть при округлении 1.5 будет возвращено 1;
- 1 (или РежимОкругления.Окр15как20) . Округляет в большую сторону, то есть при округлении 1.5 будет возвращено 2;
Пример 5. Для того чтобы лучше разобраться с принципами округления рассмотрим округление до целого в меньшую и большую стороны, на ряде чисел от 1.1 до 1.9
Массив = Новый Массив; Шаг = 0.1; Число = 1; Пока Число < 1.9 Цикл Число = Число + Шаг; Массив.Добавить(Число); КонецЦикла; Для Каждого Стр Из Массив Цикл Сообщить("Исходное: "+Стр+" В меньшую: "+Окр(Стр,0,0)+" В большую:"+Окр(Стр,0,1)); КонецЦикла;
Pow
Pow(<Основание>, <Показатель>) . Возводит число переданное в первом параметре в степень переданную во втором параметре.
Пример 6. Извлечь квадратный корень из числа 144, а затем возвести его в квадрат, в итоге снова должно получится число 144.
Число = 144; КвКорень = Pow(Число, 1/2); Число = Pow(КвКорень, 2); Сообщить(Число);
Результатом исполнения кода будет вывод на экран числа 144.
Прочие функции работы со значениями типа Число в 1с 8.3
- Log(<Число>) . Получает натуральный логарифм числа, переданного в параметре;
- Log10(<Число>) . Получает десятичный логарифм числа, переданного в параметре;
- Sin(<Угол>) . Получает синус угла, заданного в радианах. Угол передается в параметр;
- Cos(<Угол>) . Получает косинус угла;
- Tan(<Угол>) . Получает тангенс угла;
- ASin(<Угол>) . Получает арксинус угла;
- ACos(<Угол>) . Получает арккосинус угла;
- ATan(<Угол>) . Получает арктангенс угла;
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.
Вычислив результат операций подвыражений, заключенных в круглые скобки, по лучим:
ложь или истина и не ложь или ложь.
ложь или истина и истина или ложь. После выполнения истина и истина: ложь или истина или ложь. Окончательный результат: истина.
2.7. МАССИВЫ
Массив это объект данных, содержащий несколько значений, доступ к которым осуществляется по их номеру (индексу).
Число элементов массива называется его размером. Размером массива может быть только целочисленная буквальная константа.
Оператор перем а;
объявляет одномерный массив (вектор) а из пяти элементов. Элементы массива имеют следующие имена: а, а, а, а и а. В этих именах величины 1-5 индексы элементов массива.
Массив считается определенным, если заданы значения всех его элементов. Для задания начальных значений элементов массива (инициализации массива) возможен следующий цикл:
для ин = 1 по 5 цикл
Присваивания
изменят соответственно значения 2-го и 5-го элементов массива а.
В общем случае в качестве индексов массива могут использоваться числовые выражения, называемые индексными выражениями. Например:
а = 9.1; // Меняем значение 3-го элемента массива а
Если индексное выражение массива вычисляется с нецелым значением, то в каче стве индекса берется целая часть этого значения. Например:
а = 9.1; // Меняем значение 1 -го элемента массива а
Значение индекса не должно выходить за границы массива. Так, при работе с ранее объявленным массивом а из пяти элементов ошибочны операторы
Элементы одного и того же массива могут быть разного типа. Например:
а = ‘25.11.01’; // Элемент типа Дата Элементы массива могут быть агрегатного типа. Например:
сСотр= СоздатьОбъект(“Справочник.Сотрудники”);
табл = СоздатьОбъект(“Таблица”);
Массив не может в качестве элементов содержать другие массивы.
Массив может быть формальным параметром программного компонента (процедуры или функции). При этом размер массива не указывается, а квадратные скобки сохраняются. Для определения размера переданного процедуре (функции) массива используется встроенная функция Разм.
Пример:
процедура ИнициализацияМассива(а) перем ин, размА;
размА = Разм(а); // Встроенная функция Разм вернет размер массива а
для ин = 1 по размА цикл
а[ин] = 1; // Теперь все элементы массива равны единице конецЦикла;
конецПроцедуры // ИнициализацияМассива
процедура Выполнить() перем а;
// Вызов процедуры, устанавливающей начальные значения элементов массива
// Ее фактическим параметром является имя массива ИнициализацияМассива(а);
конецПроцедуры // Выполнить
Язык запросов 1С — одно из основных отличий между версиями 7.7 и 8. Одним из важнейших пунктов в изучении 1С-программирования является язык запросов. В 1С 8.3 запросы — самый мощный и эффективный инструмент получения данных. Язык запросов позволяет в удобном виде получать информацию из базы данных.
Сам синтаксис очень сильно напоминает классический T-SQL, за исключением того, что в 1С с помощью языка запросов можно только получать данные, используя конструкцию Выбрать(select). Язык поддерживает и более сложные конструкции, например, (запрос в запросе). Запросы в 1С 8 можно составлять как на кириллице, так и на латинице.
В статье я постараюсь рассказать про основные ключевые слова в языке запросов 1С:
- выбрать
- разрешенные
- различные
- выразить
- первые
- для изменения
- значение
- тип значения (и оператор ССЫЛКА)
- выбор
- сгруппировать по
- имеющие
- ЕСТЬNULL
- Есть NULL
- соединения — правые, левые, внутренние, полные .
А так же небольшие хитрости языка 1С, применяя которые вы сможете оптимально построить текст запроса.
Для отладки запросов в системе 1С 8.2 предусмотрен специальный инструмент — консоль запросов. Увидеть описание и скачать его можно по ссылке — .
Рассмотрим самые важные и интересные операторы языка запросов 1С.
ВЫБРАТЬ (SELECT)
В языке запросов 1С предприятия 8 любой запрос начинается с ключевого слова ВЫБРАТЬ . В языке 1С нет конструкций UPDATE, DELETE, CREATE TABLE, INSERT, эти манипуляции производятся в объектной технике. Предназначение его — только чтение данных.
Например:
ВЫБРАТЬ
ТекущийСправочник.Наименование
ИЗ
Справочник.Номенклатура КАК ТекущийСправочник
Запрос вернёт таблицу с наименованиями номенклатуры.
Рядом с конструкцией ВЫБРАТЬ можно встретить ключевые слова ДЛЯ ИЗМЕНЕНИЯ , РАЗРЕШЕННЫЕ , РАЗЛИЧНЫЕ , ПЕРВЫЕ …
РАЗРЕШЕННЫЕ — выбирает только записи из таблицы, на которые есть права у текущего пользователя.
РАЗЛИЧНЫЕ — означает, что в результат не попадет дублирующих строк.
ВЫБОР (CASE)
Очень часто данная конструкция недооценивается программистами. Пример её использования:
ТекущийСправочник.Наименование,
КОГДА ТекущийСправочник.Услуга ТОГДА
«Услуга»
КОНЕЦ КАК ВидНоменклатуры
Справочник.Номенклатура КАК ТекущийСправочник
Пример возвратит в поле «ВидНоменклатуры» текстовое значение — «Товар» или «Услуга».
ГДЕ (WHERE)
Конструкция языка запросов 1C, позволяющая наложить отбор на получаемые данные. Учтите, что от сервера система получает все данные, а только потом они отбираются по данному параметру.
ВЫБРАТЬ
Справочник.Наименование
ИЗ
ТекущийСправочник.Номенклатура КАК ТекущийСправочник
ГДЕ ТекущийСправочник.Услуга = ИСТИНА
В примере мы отбираем записи, у которых значение реквизита «Услуга» установлено в положение «Истина». В данном примере можно было бы обойтись и таким условием:
«ГДЕ Услуга»
По сути, мы отбираем строки, у которых выражение после ключевого слова равно «Истина».
В выражениях можно использовать прямые условия:
ГДЕ Код = «005215»
С помощью оператора «ЗНАЧЕНИЕ()» в условиях использовать обращение к предопределенным элементам и перечислениям в запросе 1С:
ГДЕ ТипНоменклатуры= Значение(Перечисление.ТипыНоменклатуры.Товар)
Значения времени могут указываться следующим образом:
ГДЕ ДатаПоступления > ДАТАВРЕМЯ(2012,01,01):
Чаще всего условия указываются в виде параметров, передаваемых в запрос:
Получите 267 видеоуроков по 1С бесплатно:
ГДЕ НоменклатурнаяГруппа= &НоменклатурнаяГруппа
Условие можно наложить на тип реквизита, если он составного типа:
Если необходимо ограничивать отбор из списка значений или массива, можно поступить следующим образом:
ГДЕ РегистрНакопления.Регистратор В (&СписокДокументовДляОтбора)
Условие может быть и сложное, состоящее из нескольких условий:
ГДЕ ДатаПоступления > ДАТАВРЕМЯ(2012,01,01) И НоменклатурнаяГруппа= &НоменклатурнаяГруппа И НЕ Услуга
СГРУППИРОВАТЬ ПО (GROUP BY)
Конструкция языка запросов 1С 8.2, используемая для группировки результата.
Например:
ВЫБРАТЬ
ПоступлениеТоваровУслугTовары.Товар,
СУММА(ПоступлениеТоваровУслугTовары.Количество) КАК Количество,
СУММА(ПоступлениеТоваровУслугTовары.Сумма) КАК Сумма
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугTоварыСГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугTовары.Товар
Данный запрос просуммирует все поступления по сумме и количеству в разрезе номенклатуры.
Помимо ключевого слова СУММА можно использовать другие агрегатные функции: КОЛИЧЕСТВО , КОЛИЧЕСТВО РАЗНЫХ , МАКСИМУМ , МИНИМУМ , СРЕДНЕЕ .
ИМЕЮЩИЕ (HAVING)
Конструкция, о которой часто забывают, но она очень важна и полезна. Она позволяет указать отбор в виде агрегатной функции, этого нельзя сделать в конструкции ГДЕ .
Пример использования ИМЕЮЩИЕ в запросе 1С:
ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.Товар,
СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК Количество,
СУММА(ПоступлениеТоваровУслугТовары.Сумма) КАК Сумма
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТоварыСГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугТовары.товарСУММА(ПоступлениеТоваровУслугТовары.Количество) > 5
Так мы отберем количество товаров, которых поступило более 5 штук.
ЗНАЧЕНИЕ()
Например:
ГДЕ Банк = Значение(Справочник.Банки.ПустаяСсылка)
ГДЕ ВидНоменклатуры = Значение(Справочник.ВидыНоменклатуры.Товар)
ГДЕ ТипНоменклатуры= Значение(Перечисление.ТипыНоменклатуры.Услуга)
ТИП в запросе
Тип данных можно проверить следующим образом: с помощью функций ТИП() и ТИПЗНАЧЕНИЯ() или с помощью логического оператора ССЫЛКА.
ВЫРАЗИТЬ()
Оператор Выразить в запросах 1С служит для преобразования типов данных.
Синтаксис: ВЫРАЗИТЬ(<Выражение> КАК <Тип значения>)
С помощью него можно преобразовать строковые значения в дату или ссылочные в строковые данные и так далее.
В практическом применении оператор Выразить() очень часто используется для преобразования полей неограниченной длины, потому что поля неограниченной длины нельзя отбирать, группировать и тд. Если такие поля не преобразовывать, Вы получите ошибку Нельзя сравнивать поля неограниченной длины и поля несовместимых типов .
ВЫБРАТЬ
КонтактнаяИнформация.Объект,
ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(150)) КАК Представление
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформацияСГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(150)),
КонтактнаяИнформация.Объект
ЕСТЬNULL (ISNULL)
Достаточно полезная функция языка запросов 1С, которая проверяет значение в записи, и если оно равно NULL, то позволяет заменить на своё значение. Чаще всего используется при получении виртуальных таблиц остатков и оборотов, чтобы скрыть NULL и поставить понятный 0 (ноль).
ЕСТЬNULL(НалогиПредМесяца.ПримененнаяЛьготаФСС, 0)
Такая функция языка запросов 1С ЕСТЬNULL при отсутствии значения вернет ноль, что позволит избежать ошибки.
СОЕДИНЕНИЕ (JOIN)
Соединения бывают 4 типов: ЛЕВОЕ , ПРАВОЕ , ПОЛНОЕ, ВНУТРЕННЕЕ .
ЛЕВОЕ и ПРАВОЕ СОЕДИНЕНИЕ
Соединения используются для связи двух таблиц по определенному условию. Особенность при ЛЕВОМ СОЕДИНЕНИИ в том, что мы берём первую указанную таблицу полностью и привязываем по условию вторую таблицу. Поля второй таблицы, которые не удалось привязать по условию, заполняются значением NULL .
Пример левого соединения в запросе 1С:
Вернет всю таблицу и заполнит поле «Банк» лишь в тех местах, где будет соблюдаться условие «Контрагенты.Наименование = Банки.Наименование». Если условие не соблюдается, в поле Банк будет установлено NULL .
ПРАВОЕ СОЕДИНЕНИЕ в языке 1С 8.3 абсолютно аналогично ЛЕВОМУ соединению , за исключением одного отличия: в ПРАВОМ СОЕДИНЕНИИ «главная» таблица — вторая, а не первая.
ПОЛНОЕ СОЕДИНЕНИЕ
ПОЛНОЕ СОЕДИНЕНИЕ отличается от левого и правого тем, что выводит все записи из двух таблиц, соединяет лишь те, которые может соединить по условию.
Например:
ПОЛНОЕ СОЕДИНЕНИЕ
Справочник.Банки КАК БанкиПО
Язык запросов вернет обе таблицы полностью лишь по выполненному условию Соединить записи. В отличие от левого/правого соединения возможно появления NULL в двух полях.
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ отличается от полного тем, что выводит только те записи, которые смогли соединить по заданному условию.
Например:
ИЗ
Справочник.Контрагенты КАК КлиентыВНУТРЕННЕЕ СОЕДИНЕНИЕ
Справочник.Банки КАК БанкиПО
Клиенты.Наименование = Банки.Наименование
Данный запрос вернет только строки, в которых у банка и контрагента будет одинаковое наименование.
Заключение
Это лишь небольшая часть синтаксиса из языка запросов 1С 8, в дальнейшем я попробую рассмотреть более подробно некоторые моменты, показать и многое другое!
Полный синтаксис (нажмите, чтобы раскрыть)
Условный оператор "Если"
Описание:
Оператор Если управляет выполнением программы, основываясь на результате одного или более логических выражений. Оператор может содержать любое количество групп операторов, возглавляемых конструкциями ИначеЕсли - Тогда .
Синтаксис:
Параметры:
Тернарный условный оператор
Описание:
Позволяет вычислить одно из двух заданных выражений в зависимости от результата вычисления логического выражения.
Синтаксис:
? (< Логическое выражение> , < Выражение 1 > , < Выражение 2 > ) |
Параметры:
Возвращаемое значение:
Результат вычисления одного из результирующих выражений.
&НаКлиенте Процедура ВыполнитьКод(Команда) /// Как составить оператор Если в 1с 8.3, 8.2 Если 1 > 0 Тогда // Истина // блок операторов Сообщить("Компьютер выполнит все команды из этого блока." ) ; Сообщить("Один больше нуля." ) ; КонецЕсли ; Если 1 < 0 Тогда // Ложь Сообщить("Один меньше нуля." ) ; Иначе Сообщить("Сработает именно эта ветка условного оператора (#А)." ) ; Сообщить("Один больше нуля." ) ; КонецЕсли ; Если 1 < 0 Тогда // Ложь Сообщить("Один меньше нуля." ) ; ИначеЕсли 1 = 0 Тогда // Ложь Сообщить("Один равен нулю." ) ; Иначе Сообщить("Сработает именно эта ветка условного оператора (#Б)." ) ; Сообщить("Один больше нуля." ) ; КонецЕсли ; /// Как составить тернарный оператор? в 1с 8.3, 8.2 Текст = ? (1 > 2 , "Один больше двух." , "Один не больше двух." ) ; Сообщить(Текст) ; // выведет "Один не больше двух." КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере |
Здравствуйте дорогие читатели. Я уже писал о таких примитивных типах данных как 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>) Из полученных параметров функция определяет минимальное значение.