Функции языка запросов 1с.
ДАТАВРЕМЯ
Эта функция создает константное поле с типом «Дата».
Синтаксис: ДАТАВРЕМЯ(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)
1 2 3 |
Запрос.Текст = "ВЫБРАТЬ | ДАТАВРЕМЯ(2017, 5, 1) КАК ПервоеМая"; // 1 мая 2017 |
РАЗНОСТЬДАТ
Возвращает разность двух дат в одном из измерений (год, месяц, день, час, минута, секунда). Измерение передается в параметре.
Синтаксис: РАЗНОСТЬДАТ(<Дата1>, <Дата2>, <Тип>)
1 2 3 4 |
Запрос.Текст = "ВЫБРАТЬ | РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2017, 4, 17), ДАТАВРЕМЯ(2017, 2, 1), ДЕНЬ) | КАК КолвоДней"; |
ЗНАЧЕНИЕ
Задает константное поле с предопределенной записью из базы данных, также можно получить пустую ссылку любого типа.
Синтаксис: ЗНАЧЕНИЕ(<Имя>)
1 2 3 4 5 6 7 8 9 10 |
Запрос.Текст = "ВЫБРАТЬ //предопределенный элемент | ЗНАЧЕНИЕ(Справочник.Валюты.Рубль) КАК Рубль, //пустая ссылка | ЗНАЧЕНИЕ(Документ.ПоступлениеТоваровУслуг.ПустаяСсылка) КАК Поступление, //знач. перечисления | ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ФизЛицо) КАК ФизЛицо, //предопределенный счет | ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы) КАК Счет_10"; |
ВЫБОР
Аналог конструкции ЕСЛИ, который используется в коде, только эта используется в запросах 1С.
Синтаксис: ВЫБОР КОГДА <Выражение> ТОГДА <Выражение> ИНАЧЕ <Выражение> КОНЕЦ
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Запрос.Текст = "ВЫБРАТЬ //если сумма больше 4500, тогда должна быть скидка 100 рублей, //поэтому если условие срабатывает то функция //возвращает Сумма - 100 //в противном случае запрос вернет просто Сумма | ВЫБОР | КОГДА ТЧПоступления.Сумма > 4500 | ТОГДА ТЧПоступления.Сумма - 100 | ИНАЧЕ ТЧПоступления.Сумма | КОНЕЦ КАК СуммаСоСкидкой |ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ТЧПоступления"; |
Ещё пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
ВЫБРАТЬ Наименование, Калорийность, ВЫБОР КОГДА Калорийность < 100 ТОГДА "Низкая" КОГДА Калорийность < 200 ТОГДА "Нормальная" ИНАЧЕ "Высокая" КОНЕЦ КАК Жирность ИЗ Справочник.ПродуктыПитания |
Более сложный пример, с использованием ПОДОБНО:
1 2 3 4 5 6 7 8 9 10 11 12 |
ВЫБРАТЬ Наименование, ВЫБОР КОГДА Наименование ПОДОБНО "Б%" ТОГДА "Начинается на Б" КОГДА Наименование ПОДОБНО "К%" ТОГДА "Начинается на К" ИНАЧЕ "Начинается на другую букву" КОНЕЦ ИЗ Справочник.ПродуктыПитания |
ВЫРАЗИТЬ
Позволяет выразить константное поле определенным типом.
Синтаксис: ВЫРАЗИТЬ(НазваниеПоля КАК НазваниеТипа)
1 2 3 4 5 6 |
Запрос.Текст = "ВЫБРАТЬ | ВЫРАЗИТЬ(Номенклатура.Комментарий КАК Строка(800)) КАК Комментарий, | ВЫРАЗИТЬ(Номенклатура.Сумма КАК Число(12,3)) КАК Сумма |ИЗ | Справочник.Номенклатура КАК Номенклатура"; |
Можно использовать функцию ВЫРАЗИТЬ в полях смешанных типах. Обычный и распространённый пример, где встречаются такие поля, это «Регистратор» у любого регистра. По какой причине мы будем уточнять тип в регистраторе? К примеру, если мы из регистратора выбираем поле «Номер», то из всех таблиц этот номер будет выбран. Для увеличения скорости обработки нашего запроса, укажем явный тип, с помощью функции ВЫРАЗИТЬ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | Расходы.Регистратор.Номер, | ВЫБОР | КОГДА Расходы.Регистратор ССЫЛКА Документ.Продажа | ТОГДА ВЫРАЗИТЬ(Расходы.Регистратор КАК Документ.Продажа) | ИНАЧЕ ВЫБОР | КОГДА Расходы.Регистратор ССЫЛКА Документ.Списание | ТОГДА ВЫРАЗИТЬ(Расходы.Регистратор КАК Документ.Списание) | КОНЕЦ | ... | КОНЕЦ КАК Номер | ИЗ | РегистрНакопления.Расходы КАК Расходы "; |
ISNULL, ЕСТЬNULL
Если поле имеет тип NULL, то оно заменяется на второй параметр функции.
Синтаксис: ЕСТЬNULL(<Поле>, <ПодставляемоеЗначение>)
1 2 3 4 5 6 7 8 9 10 11 |
Запрос.Текст = //Выбираем всю номенклатуру и остатки по ней //если остатоков по какой-то номенклатуре нет, то будет поле //NULL которое заменится значением 0 "ВЫБРАТЬ | Номенкл.Ссылка, | ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК Остаток |ИЗ | Справочник.Номенклатура КАК Номенкл | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки | ПО (ТоварыНаСкладахОстатки.Номенклатура = Номенкл.Ссылка)"; |
Нужно отметить, что тип NULL необходимо ВСЕГДА заменять на какое-либо значение, так как сравнение с ним, всегда будет ЛОЖЬ. Прикол в том, что ЛОЖЬ будет, если сравнить NULL с NULL. Обычно NULL возникает при соединениях таблиц (во всех видах, кроме внутреннего).
ПРЕДСТАВЛЕНИЕ
Получает представление поля запроса
Синтаксис: ПРЕДСТАВЛЕНИЕ(<НаименованиеПоля>)
1 2 3 4 5 6 7 |
Запрос.Текст = "ВЫБРАТЬ | ПРЕДСТАВЛЕНИЕ(ОстаткиТоваровОстатки.Номенклатура) КАК Номенклатура, | ПРЕДСТАВЛЕНИЕ(ОстаткиТоваровОстатки.Склад) КАК Склад, | ОстаткиТоваровОстатки.ВНаличииОстаток |ИЗ | РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки"; |
Конструкции в языке запросов 1с.
ССЫЛКА
Проверяет поля ссылочного типа. Обычно применяется для проверки поля составного типа на конкретный тип.
Синтаксис: ССЫЛКА <Имя таблицы>
1 2 3 4 5 6 7 8 9 10 11 |
Запрос.Текст = "ВЫБРАТЬ //если тип значения регистратора документ Закупка, //тогда запрос вернет "Закупка товаров", иначе "Продажа товаров" | ВЫБОР | КОГДА Остатки.Регистратор ССЫЛКА Документ.ЗакупкаТоваровУслуг | ТОГДА ""Закупка"" | ИНАЧЕ ""Продажа"" | КОНЕЦ КАК ВидДвижения |ИЗ | РегистрНакопления.ОстаткиТоваровНаСкладах КАК Остатки"; |
МЕЖДУ
Проверяет, входит ли значение в указанный диапазон.
Синтаксис: МЕЖДУ <Выражение> И <Выражение>
1 2 3 4 5 6 7 8 |
Запрос.Текст = //получим всю номенклатуру код которой лежит в диапазоне от 5 до 400 "ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Код МЕЖДУ 5 И 400"; |
В и В ИЕРАРХИИ
Проверяют находится ли значение в передаваемом списке (в качестве списка могут передаваться массивы, таблицы значений и т.д.). Оператор В ИЕРАРХИИ позволяет просматривать иерархию (пример использования ПланСчетов).
Синтаксис: В(<СписокЗначений>), В ИЕРАРХИИ(<СписокЗначений>)
1 2 3 4 5 6 7 8 |
Запрос.Текст = //выбираем все субсчета счета "ВЫБРАТЬ | Хозрасчетный.Ссылка КАК Счет |ИЗ | ПланСчетов.Хозрасчетный КАК Хозрасчетный |ГДЕ | Хозрасчетный.Ссылка В ИЕРАРХИИ ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)"; |
ПОДОБНО
Сравнивает строку с шаблоном строки.
Синтаксис: ПОДОБНО «<ТекстШаблона>»
Варианты шаблона строки:
% — последовательность, содержащая любое количество произвольных символов
_ — один произвольный символ.
[…] — любой одиночный символ, либо последовательность символов из перечисленных внутри квадратных скобок. В перечислении могут задаваться диапазоны, например а-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона.
[^…] — любой одиночный символ, либо последовательность символов из перечисленных внутри квадратных скобок кроме тех, которые перечислены следом за значком отрицания.
1 2 3 4 5 6 7 8 9 |
Запрос.Текст = //найдем всю номенклатуру которая содержит корень ТАБУР и начинается //либо с маленькой либо с большой буквы т "ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Товары.Наименование ПОДОБНО ""[Тт]абур%"""; |
РАЗРЕШЕННЫЕ
Выбирает только те записи из базы данных, на которые вызывающий имеет право чтения. Данные права настраиваются на уровне записей.
Синтаксис: РАЗРЕШЕННЫЕ пишется после ключевого слова ВЫБРАТЬ
1 2 3 4 5 |
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | Поставщики.Ссылка |ИЗ | Справочник.Поставщики КАК Поставщики"; |
РАЗЛИЧНЫЕ
Выбирает только те записи из базы данных, в которых отсутствуют повторные записи.
Синтаксис: РАЗЛИЧНЫЕ пишется после ключевого слова ВЫБРАТЬ
1 2 3 4 5 6 |
Запрос.Текст = //выбирает записи на которые есть права у читающего "ВЫБРАТЬ РАЗЛИЧНЫЕ | Поставщики.Наименование |ИЗ | Справочник.Поставщики КАК Поставщики"; |
Ещё конструкцию РАЗЛИЧНЫЕ, можно использовать с оператором РАЗРЕШЕННЫЕ и другими операторами.
1 2 3 4 5 6 |
Запрос.Текст = //выбирает различные записи на которые есть права у читающего "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | Поставщики.Наименование |ИЗ | Справочник.Поставщики КАК Поставщики"; |
ПЕРВЫЕ
Выбирает указанное в параметре число записей из результата запроса.
Синтаксис: ПЕРВЫЕ <число>
1 2 3 4 5 6 |
Запрос.Текст = //выбирают первые 4 номера транспортных средств из справочника "ВЫБРАТЬ ПЕРВЫЕ 4 | НомераТранспортныхСредств.Ссылка |ИЗ | Справочник.НомераТранспортныхСредств КАК НомераТрСр"; |
ДЛЯ ИЗМЕНЕНИЯ
Позволяет заблокировать таблицу, работает только в транзакциях (актуально только для автоматических блокировок)
Синтаксис: ДЛЯ ИЗМЕНЕНИЯ <НаименованиеТаблицы>
1 2 3 4 5 6 7 8 9 |
Запрос.Текст = "ВЫБРАТЬ | ОстаткиТоваровОстатки.Номенклатура, | ОстаткиТоваровОстатки.Склад, | ОстаткиТоваровОстатки.ВНаличииОстаток |ИЗ | РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки |ДЛЯ ИЗМЕНЕНИЯ | РегистрНакопления.ОстаткиТоваров.Остатки"; |
УПОРЯДОЧИТЬ ПО
Упорядочивает данные по определенному полю. Если полем является ссылка, то при установке флага АВТОУПОРЯДОЧИВАНИЕ, будет происходить сортировка по представлению ссылки, если флаг выключен то ссылки сортируются по старшинству адреса ссылки в памяти.
Синтаксис: УПОРЯДОЧИТЬ ПО <НаименованиеПоля> АВТОУПОРЯДОЧИВАНИЕ
1 2 3 4 5 6 7 8 9 10 11 |
Запрос.Текст = "ВЫБРАТЬ | ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура, | ОстаткиТоваровОстатки.Склад КАК Склад, | ОстаткиТоваровОстатки.ВНаличииОстаток |ИЗ | РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки | |УПОРЯДОЧИТЬ ПО | Номенклатура |АВТОУПОРЯДОЧИВАНИЕ"; |
СГРУППИРОВАТЬ ПО
Используется для группировки строк запроса по определенным полям. Числовые поля должны использоваться с любой агрегатной функцией.
Синтаксис: СГРУППИРОВАТЬ ПО <НаименованиеПоля1>, …. , <НаименованиеПоляN>
1 2 3 4 5 6 7 8 9 10 |
Запрос.Текст = "ВЫБРАТЬ | ОстаткиТоваров.Номенклатура КАК Номенклатура, | ОстаткиТоваров.Склад, | СУММА(ОстаткиТоваров.ВНаличии) КАК ВНаличии |ИЗ | РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров | |СГРУППИРОВАТЬ ПО | ОстаткиТоваров.Номенклатура, | ОстаткиТоваров.Склад"; |
ИМЕЮЩИЕ
Позволяет применить агрегатную функцию к условию выборки данных, похожа на конструкцию ГДЕ.
Синтаксис: ИМЕЮЩИЕ <агрегатная функция с условием>
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Запрос.Текст = //выбирает сгруппированные записи где поле ВНаличии больше 8 "ВЫБРАТЬ | ОстаткиТоваров.Номенклатура КАК Номенклатура, | ОстаткиТоваров.Склад, | СУММА(ОстаткиТоваров.ВНаличии) КАК ВНаличии |ИЗ | РегистрНакопления.ОстаткиТоваровКАК ОстаткиТоваров | |СГРУППИРОВАТЬ ПО | ОстаткиТоваров.Номенклатура, | ОстаткиТоваров.Склад |ИМЕЮЩИЕ СУММА(ОстаткиТоваров.ВНаличии) > 8 "; |
ИНДЕКСИРОВАТЬ ПО
Используется для индексации поле запроса. Запрос с индексацией дольше выполняется, но ускоряет поиск по индексированным полям. Можно использовать только в виртуальных таблицах.
Синтаксис: ИНДЕКСИРОВАТЬ ПО <Поле1, … , ПолеN>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Запрос.Текст = "ВЫБРАТЬ | Тзнач.НаименованиеТС, | Тзнач.НомерГр, | Тзнач.КодТС, | Тзнач.СрокВв, | Тзнач.ТипВв |ПОМЕСТИТЬ ДанныеТзнач |ИЗ | &Тзнач КАК Тзнач |ИНДЕКСИРОВАТЬ ПО | Тзнач.НаименованиеТС, | Тзнач.КодТС |; "; |
ГДЕ
Позволяет наложить условие на любые поля выборки. В результат попадут только те записи, которые удовлетворяют условию.
Синтаксис: ГДЕ <Условие1 ОператорЛогСоединения УсловиеN>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Запрос.Текст = //выбираются все записи у которых ОстатокСредств <> 0 и //СуммаДляРасчОстатокСредств > 200 "ВЫБРАТЬ | ОстатокСредствОстатки.Контрагент, | ОстатокСредствОстатки.Ребенок, | ОстатокСредствОстатки.КомпенсацияОстаток, | ОстатокСредствОстатки.СуммаДляРасчОстатокСредств |ПОМЕСТИТЬ ДанныеТзнач |ИЗ | РегистрНакопления.ОстатокСредств.Остатки КАК ОстатокСредствОстатки |ГДЕ | ОстатокСредствОстатки.КомпенсацияОстаток <> 0 | И ОстатокСредствОстатки.СуммаДляРасчОстатокСредств > 200"; |
ИТОГИ … ПО ОБЩИЕ
Используется для подсчета итогов, в конструкции указываются поля по которым будут считаться итоги и агрегатные функции, применяемые к итоговым полям. При использовании итогов, по каждому полю, следующему после конструкции ИТОГИ, производится группировка данных. Так же, можно использовать конструкцию ОБЩИЕ (она не обязательна). Она тоже обеспечивает дополнительную группировку.
Синтаксис: ИТОГИ <АгрегатнаяФункция1, … , АгрегатнаяФункцияN> ПО <ОБЩИЕ> <Поле1, … , ПолеN>
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Запрос.Текст = "ВЫБРАТЬ | Расчеты.ДоговорПодрядчика.ВидДоговора КАК ВидДоговора, | Расчеты.ДоговорПодрядчика КАК Договор, | Расчеты.Подрядчик, | Расчеты.СуммаВзаиморасчетовОстаток КАК Остаток |ИЗ | РегистрНакопления.ВзаиморасчетыСПодрядчиками.Остатки КАК Расчеты |ИТОГИ | СУММА(Остаток) |ПО | ОБЩИЕ, | ВидДоговора"; |