Условие если в 1с. Логические операции (1с предприятие). Подзапросы в условии соединения

Число в 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; // Теперь все элементы массива равны единице конецЦикла;

конецПроцедуры // ИнициализацияМассива

процедура Выполнить() перем а;

// Вызов процедуры, устанавливающей начальные значения элементов массива

// Ее фактическим параметром является имя массива ИнициализацияМассива(а);

конецПроцедуры // Выполнить

Здравствуйте дорогие читатели. Я уже писал о таких примитивных типах данных как NULL и Строка, а сегодня рассмотрим примитивный тип данных Число (Number) .

Числовым у нас может быть реквизит объекта конфигурации или переменные в .

Максимально допустимая разрядность числа составляет 38 знаков, длина целой части не может превышать 32 символа, точность — 10 символов. Хотя в переменных можно оперировать числами превышающих разрядность в 38 символов, но в ИБ (информационную базу) можем записывать значения с длинной целой части не больше 32-х знаков.

Над данными числового типа применимы операции: +, -, *, /, (), %(остаток от деления нацело 10%3=1).

Математические функции для чисел можно посмотреть в синтакс помощнике
Общее описание встроенного языка-> Встроенные функции-> Функции по работе с типом Число

Из всех функции, которые там приведены лично мне пока пришлось работать только с двумя:
Окр(<Число>, <Разрядность>, <РежимОкругления>) Функция округляет исходное число до нужной разрядности в соответствии с заданным режимом округления.
Параметры: <Число> (обязательный), Исходное число. Остальные параметры не обязательны.

// Округлим цену до копеек ОкругленнаяЦена = Окр(Цена, 2 ); // Округлим цену до сотен рублей ОкругленнаяЦена = Окр(Цена, - 2 );

Цел(<Число>) — Функция вычисляет целую часть переданного числа, полностью отсекая дробную часть.

Пример: МожноКупить = Цел (Наличность / Цена );

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

Часто на практике встречается преобразование типов данных из строки в число, для этих целей есть функция Число().

Функция Число() — Преобразует полученный параметр (параметр обычно строкового типа) в значение типа Число.
Пример: КонтрольноеЧисло = Число (Прав (СтраховойНомер , 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. через параметры виртуальной таблица;
  2. через секции запроса ГДЕ или ИМЕЮЩИЕ.

Различия между секциями ГДЕ и ИМЕЮЩИЕ мы уже рассматривали. Чтобы было понятно, чем условия в этих секциях запроса отличаются от условий в параметрах виртуальной таблицы, нужно понять, что же такое виртуальные таблицы регистров в 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-го счета
"ВЫБРАТЬ
| Хозрасчетный.Ссылка КАК Счет
|ИЗ
| ПланСчетов.Хозрасчетный КАК Хозрасчетный
|ГДЕ
| Хозрасчетный.Ссылка В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары),
| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))";

ПОДОБНО - позволяет сравнивать строку с шаблоном, используется когда строка поиска жестко не определена. Построение шаблона:

  • % (процент): последовательность, содержащая любое количество произвольных символов
  • _ (подчеркивание): один произвольный символ
  • [...] (в квадратных скобках один или несколько символов): любой одиночный символ из перечисленных внутри квадратных скобок. В перечислении могут задаваться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона
  • [^...] (в квадратных скобках значок отрицания, за которым следует один или несколько символов): любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания

Синтаксис:

ПОДОБНО "<ТекстШаблона>"
Запрос.Текст =
//найдем все стулья в справочнике номенклатура
"ВЫБРАТЬ
| Товары.Товар
|ИЗ
| Справочник.Товары КАК Товары
|ГДЕ
| Товары.Наименование ПОДОБНО ""тул%""";
//этот запрос вернет Стул, стул, стульчик, стул офисный и т.д.,
//но стол в этом списке не окажется

ЕСТЬNULL - если поле не определено, то определяет его в указанное выражение. Синтаксис:

ЕСТЬNULL(<Выражение>, <Выражение>)
Запрос.Текст =
//Если поле не определено (NULL)? то присвоим ему пустую ссылку
"ВЫБРАТЬ
| ЕСТЬNULL(Товары.Ссылка, ЗНАЧЕНИЕ(Справочник.Товары.ПустаяСсылка)) КАК Товар
|ИЗ
| Справочник.Товары КАК Товары";

Замечу, что NULL следует обязательно обрабатывать, т.к. это очень "капризный" тип (в системе "1С:Предприятие 8" определен специальный тип NULL с одним элементом). Если вы попытаетесь сравнить со значением данного типа или присвоить его, то обязательно нарветесь на ошибку, поэтому не забывайте о данной конструкции. Когда может выскочить NULL:

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

Это далеко не полный список функций языка запросов 1С 8, если заинтересует работа каких-либо еще - пишите в комментариях.

© 2024 tdv-elektro.ru
Windows. Железо. Интернет. Безопасность. Программы