Все функции и конструкции языка запросов 1С 8.2 и 1с 8.3

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

Функции языка запросов 1с

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

1. Функция ДАТАВРЕМЯ - данная функция создает константное поле с типом "Дата".

Синтаксис:         ДАТАВРЕМЯ(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Пример использования:
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ДАТАВРЕМЯ(2015, 3, 1) КАК ПервоеМарта"
; // 1 марта 2015
 

2. Функция РАЗНОСТЬДАТ - возвращает разность двух дат в одном из измерений (год, месяц, день, час, минута, секунда). Измерение передается в параметре.
 
Синтаксис:         РАЗНОСТЬДАТ(<Дата1>, <Дата2>, <Тип>)
 
Пример использования:
   
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2015, 4, 17), ДАТАВРЕМЯ(2015, 2, 1), ДЕНЬ)
        |    КАК КолвоДней"
;
 
 

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

Только у нас лучшая цена за час работы программиста 1с

4. Функция ВЫБОР - перед нами аналог конструкции ЕСЛИ который используется в коде, только эта используется в запросах 1С.
 
 Синтаксис:                ВЫБОР
                                                КОГДА <Выражение> ТОГДА <Выражение>
                                                ИНАЧЕ <Выражение>
                                   КОНЕЦ
 
Пример использования:
 
    Запрос.Текст =
        "ВЫБРАТЬ
        //если сумма больше 7500, тогда должна быть скидка 300 рублей,
                //поэтому если условие срабатывает то функция
                //возвращает Сумма - 300
        //в противном случае запрос вернет просто Сумма
        |    ВЫБОР
        |        КОГДА ТЧПоступления.Сумма > 7500
        |            ТОГДА ТЧПоступления.Сумма - 300
        |        ИНАЧЕ ТЧПоступления.Сумма
        |    КОНЕЦ КАК СуммаСоСкидкой
        |ИЗ
        |    Документ.ПоступлениеТоваровУслуг.Товары КАК ТЧПоступления";
 
 

5. Функция ВЫРАЗИТЬ - позволяет выразить константное поле определенным типом.
 
 Синтаксис:        ВЫРАЗИТЬ(НазваниеПоля КАК НазваниеТипа)
 
Пример использования:
 
    Запрос.Текст =
        "ВЫБРАТЬ
        |  ВЫРАЗИТЬ(Номенклатура.Комментарий КАК Строка(300)) КАК Комментарий,
        |  ВЫРАЗИТЬ(Номенклатура.Сумма КАК Число(15,2)) КАК Сумма
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура"
;
 

Еще есть вариант использования функции ВЫРАЗИТЬ в полях смешанных типах, где такие встречаются? Самый простой пример это "Регистратор" у любого регистра. Так зачем нам может понадобиться уточнять тип в регистраторе? Давайте рассмотрим ситуацию когда мы из регистратора выбираем поле "Номер", из какой таблицы будет выбран номер? Правильный ответ из всех! Поэтому чтобы наш запрос работал быстро следует указывать явный тип с помощью функции ВЫРАЗИТЬ
 
Пример использования:
 
    Запрос.Текст =
      "ВЫБРАТЬ РАЗЛИЧНЫЕ
      |  Продажи.Регистратор.Номер,
      |         ВЫБОР
      |     КОГДА Продажи.Регистратор ССЫЛКА Документ.Расходная
      |       ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.Расходная)
      |         ИНАЧЕ ВЫБОР
      |         КОГДА Продажи.Регистратор ССЫЛКА Документ.Реализация
      |             ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.Реализация)
      |         КОНЕЦ
      |           ...
      |          КОНЕЦ КАК Номер
      |  ИЗ
      |     РегистрНакопления.Закупки КАК Закупки"
;
 
 
6. Функция ISNULL (альтернативное написание ЕСТЬNULL) - если поле имеет тип NULL, то оно заменяется на второй параметр функции.
 
 Синтаксис:        ЕСТЬNULL(<Поле>, <ПодставляемоеЗначение>)
 
Пример использования:
   
    Запрос.Текст =
    //Выбираем всю номенклатуру и остатки по ней

    //если остатокв но какой-то номенклатуре нет то будет поле
    //NULL которое заменится значением 0
    "ВЫБРАТЬ
    |    Ном.Ссылка,
    |    ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК Остаток
    |ИЗ
    |    Справочник.Номенклатура КАК Ном
  |     ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
    |        ПО (ТоварыНаСкладахОстатки.Номенклатура = Ном.Ссылка)";
 

Также отмети что тип NULL желательно ВСЕГДА заменять на какое-то значение, т.к. сравнение с типом NULL всегда дает ЛОЖЬ даже если вы сравниваете NULL с NULL. Чаще всего значения NULL образуются в результате соединения таблиц (все виды соединений кроме внутреннего).
 
 

7. Функция ПРЕДСТАВЛЕНИЕ - позволяет получить представление поля запроса
 
 Синтаксис:        ПРЕДСТАВЛЕНИЕ(<НаименованиеПоля>)
 
Пример использования:
 
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ПРЕДСТАВЛЕНИЕ(СвободныеОстаткиОстатки.Номенклатура) КАК Номенклатура,
    |    ПРЕДСТАВЛЕНИЕ(СвободныеОстаткиОстатки.Склад) КАК Склад,
    |    СвободныеОстаткиОстатки.ВНаличииОстаток
    |ИЗ
    |    РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки";
 
 

Конструкции в языке запросов 1с

Выше мы рассмотрели с Вами функции языка запросов 1с, теперь пришло время рассмотреть конструкции в языке запросов 1с, они не менее важны и полезны, приступаем.
 
1. Конструкция ССЫЛКА - представляет из себя логический оператор проверки ссылочного типа. Наиболее часто встречается при проверки поля составного типа на конкретный тип.
 
 Синтаксис:        ССЫЛКА <Имя таблицы>
 
Пример использования:
  
    Запрос.Текст =
        "ВЫБРАТЬ
        //если тип значения регистратора документ Приходная,
        //тогда запрос вернет "Поступление товаров", иначе "Реализация товаров"
        |    ВЫБОР
        |        КОГДА Остатки.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
        |            ТОГДА ""Приход""
        |        ИНАЧЕ ""Расход""
        |    КОНЕЦ КАК ВидДвижения
        |ИЗ
        |    РегистрНакопления.ОстаткиТоваровНаСкладах КАК Остатки"
;
 
 

2. Конструкция МЕЖДУ - данный оператор проверяет входит ли значение в указанный диапазон.
 
 Синтаксис:        МЕЖДУ <Выражение> И <Выражение>
  
Пример использования:
 
    Запрос.Текст =
         //получим всю номенклатуру код которой лежит в диапазоне от 1 до 100
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Номенклатура.Код МЕЖДУ 1 И 100"
;
 
 

3. Конструкция В и В ИЕРАРХИИ - проверяют находится ли значение в передаваемом списке (в качестве списка могут передаваться массивы, таблицы значений и т.д.). Оператор В ИЕРАРХИИ позволяет просматривать иерархию (пример использования ПланСчетов).
 
 Синтаксис:        В(<СписокЗначений>), В ИЕРАРХИИ(<СписокЗначений>)
  
Пример использования:
 
    Запрос.Текст =
        //выбираем все субсчета счета

        "ВЫБРАТЬ
        |    Хозрасчетный.Ссылка КАК Счет
        |ИЗ
        |    ПланСчетов.Хозрасчетный КАК Хозрасчетный
        |ГДЕ
        |    Хозрасчетный.Ссылка В ИЕРАРХИИ ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)"
;
 
 

4. Конструкция ПОДОБНО - эта функция позволяет нам сравнивать строку с шаблоном строки.
 
 Синтаксис:        ПОДОБНО "<ТекстШаблона>"
 
Варианты шаблона строки:
 
    % - последовательность, содержащая любое количество произвольных символов
    _ - один произвольный символ
    [...] - любой одиночный символ, либо последовательность символов из перечисленных внутри квадратных скобок. В перечислении могут задаваться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона
    [^...] - любой одиночный символ, либо последовательность символов из перечисленных внутри квадратных скобок кроме тех, которые перечислены следом за значком отрицания
 
Пример использования:
   
    Запрос.Текст =
        //найдем всю номенклатуру которая содержит корень ТАБУР и начинается
                //либо с маленькой либо с большой буквы т
        "ВЫБРАТЬ
        |    Номенклатура.Ссылка
        |ИЗ
        |    Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |    Товары.Наименование ПОДОБНО ""[Тт]абур%"""
;
       
       
 
 

5. Конструкция РАЗРЕШЕННЫЕ - этот оператор позволяет выбрать только те записи из БД, на которые вызывающий имеет право чтения. Данные права настраиваются на уровне записей (RLS).
 
 Синтаксис:       РАЗРЕШЕННЫЕ пишется после ключевого слова ВЫБРАТЬ
 
Пример использования:
               
    Запрос.Текст =
                "ВЫБРАТЬ РАЗРЕШЕННЫЕ
                |             Контрагенты.Ссылка
                |ИЗ
                |             Справочник.Контрагенты КАК Контрагенты"
;
 

Только у нас лучшая цена за час работы программиста 1с

6. Конструкция РАЗЛИЧНЫЕ - позволяет выбрать записи в которых отсутствуют повторные записи
 
 Синтаксис:       РАЗЛИЧНЫЕ пишется после ключевого слова ВЫБРАТЬ
 
Пример использования:
               
    Запрос.Текст =
                //выбирает записи на которые есть права у читающего
                "ВЫБРАТЬ РАЗЛИЧНЫЕ
                |             Контрагенты.Наименование
                |ИЗ
                |             Справочник.Контрагенты КАК Контрагенты"
;
 
Также Конструкция РАЗЛИЧНЫЕ может использоваться с оператором РАЗРЕШЕННЫЕ и другими операторами.
 
Пример использования:
               
    Запрос.Текст =
                //выбирает различные записи на которые есть права у читающего
                "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
                |             Контрагенты.Наименование
                |ИЗ
                |             Справочник.Контрагенты КАК Контрагенты"
;
 
 

7. Конструкция ПЕРВЫЕ - выбирает указанное в параметре число записей из результата запроса
 
 Синтаксис:        ПЕРВЫЕ  <число>
 
Пример использования:
               
    Запрос.Текст =
                //выбирают первые 4 номера ГТД из справочника
                "ВЫБРАТЬ ПЕРВЫЕ 4
                |             НомераГТД.Ссылка
                |ИЗ
                |             Справочник.НомераГТД КАК НомераГТД"
;
 
 

8. Конструкция ДЛЯ ИЗМЕНЕНИЯ - позволяет заблокировать таблицу, работает только в транзакциях (актуально только для автоматических блокировок)
 
 Синтаксис:        ДЛЯ ИЗМЕНЕНИЯ <НаименованиеТаблицы>
 
Пример использования:
 
    Запрос.Текст =
                "ВЫБРАТЬ
                |             СвободныеОстаткиОстатки.Номенклатура,
                |             СвободныеОстаткиОстатки.Склад,
                |             СвободныеОстаткиОстатки.ВНаличииОстаток
                |ИЗ
                |             РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
                |ДЛЯ ИЗМЕНЕНИЯ  
                |   РегистрНакопления.СвободныеОстатки.Остатки"
;
 
 

9. Конструкция УПОРЯДОЧИТЬ ПО - упорядочивает данные по определенному полю. Если полем является ссылка то при установке флага АВТОУПОРЯДОЧИВАНИЕ будет происходить сортировка по представлению ссылки, если флаг выключен то ссылки сортируются по старшинству адреса ссылки в памяти
 
 Синтаксис:        УПОРЯДОЧИТЬ ПО <НаименованиеПоля> АВТОУПОРЯДОЧИВАНИЕ
 
Пример использования:
 
    Запрос.Текст =
    "ВЫБРАТЬ
    |    СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
    |    СвободныеОстаткиОстатки.Склад КАК Склад,
    |    СвободныеОстаткиОстатки.ВНаличииОстаток
    |ИЗ
    |    РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номенклатура
    |АВТОУПОРЯДОЧИВАНИЕ";
 
 

10. Конструкция СГРУППИРОВАТЬ ПО - используется для группировки строк запроса по определенным полям. Числовые поля должны использоваться с любой агрегатной функцией.
 
 Синтаксис:        СГРУППИРОВАТЬ ПО <НаименованиеПоля1>, .... , <НаименованиеПоляN>
 
Пример использования:

   Запрос.Текст =
                "ВЫБРАТЬ                |             ТоварыНаСкладах.Номенклатура КАК Номенклатура,
                |             ТоварыНаСкладах.Склад,
                |             СУММА(ТоварыНаСкладах.ВНаличии) КАК ВНаличии
                |ИЗ
                |             РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
                |
                |СГРУППИРОВАТЬ ПО
                |             ТоварыНаСкладах.Номенклатура,
                |             ТоварыНаСкладах.Склад"
;
 
 

11. Конструкция ИМЕЮЩИЕ - позволяет применить агрегатную функцию к условию выборки данных, похожа на конструкцию ГДЕ
 
 Синтаксис:        ИМЕЮЩИЕ <агрегатная функция с условием>
 
Пример использования:
 
    Запрос.Текст =
                //выбирает сгруппированные записи где поле ВНаличии больше 3
                "ВЫБРАТЬ
                |             ТоварыНаСкладах.Номенклатура КАК Номенклатура,
                |             ТоварыНаСкладах.Склад,
                |             СУММА(ТоварыНаСкладах.ВНаличии) КАК ВНаличии
                |ИЗ
                |             РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
                |
                |СГРУППИРОВАТЬ ПО
                |             ТоварыНаСкладах.Номенклатура,
                |             ТоварыНаСкладах.Склад
                |ИМЕЮЩИЕ СУММА(ТоварыНаСкладах.ВНаличии) > 3 "
;
 
 

12. Конструкция ИНДЕКСИРОВАТЬ ПО - используется для индексации поле запроса. Запрос с индексацией дольше выполняется, но ускоряет поиск по индексированным полям. Можно использовать только в виртуальных таблицах.
 
 Синтаксис:        ИНДЕКСИРОВАТЬ ПО <Поле1, ... , ПолеN>
 
Пример использования:
 
    Запрос.Текст =
                "ВЫБРАТЬ
                |             Тз.НаименованиеОС,
                |             Тз.НомерПапки,
                |             Тз.КодОС,
                |             Тз.Срок,
                |             Тз.Тип
                |ПОМЕСТИТЬ ДанныеТз
                |ИЗ
                |             &Тз КАК Тз
                |ИНДЕКСИРОВАТЬ ПО
                |             Тз.НаименованиеОС,
                |             Тз.КодОС
                |;
                "
;
 
 

13. Конструкция ГДЕ - позволяет наложить условие на любые поля выборки. В результат попадут записи только удовлетворяющие условию. 
 Синтаксис:        ГДЕ <Условие1 ОператорЛогСоединения УсловиеN>
 
Пример использования:
 
    Запрос.Текст =
                //выбираются все записи у которых КомпенсацияОстаток <> 0 и
                //СуммаДляРасчКомпОстаток > 100
                "ВЫБРАТЬ
                |             КомпенсацияРПОстатки.Контрагент,
                |             КомпенсацияРПОстатки.Ребенок,
                |             КомпенсацияРПОстатки.КомпенсацияОстаток,
                |             КомпенсацияРПОстатки.СуммаДляРасчКомпОстаток
                |ПОМЕСТИТЬ ДанныеТз
                |ИЗ
                |             РегистрНакопления.КомпенсацияРП.Остатки КАК КомпенсацияРПОстатки
                |ГДЕ
                |             КомпенсацияРПОстатки.КомпенсацияОстаток <> 0
                |             И КомпенсацияРПОстатки.СуммаДляРасчКомпОстаток > 100"
;
 
 

14. Конструкция ИТОГИ ... ПО ОБЩИЕ - применяется для подсчета итогов, в конструкции указываются поля по которым будут считаться итоги и агрегатные функции применяемые к итоговым полям. При использовании итогов на каждое поле следующее после конструкции ИТОГИ производится группировка данных. Есть необязательная конструкция ОБЩИЕ, ее использование также обеспечивает дополнительную группировку. Пример результата запроса вы увидите ниже.
 
 Синтаксис:        ИТОГИ <АгрегатнаяФункция1, ... , АгрегатнаяФункцияN>
                                ПО <ОБЩИЕ> <Поле1, ... , ПолеN>    

 
 
Пример использования:
 
Запрос.Текст
=
"ВЫБРАТЬ

|    Расчеты.ДоговорКонтрагента.ВидДоговора КАК ВидДоговора,
|    Расчеты.ДоговорКонтрагента КАК Договор,
|    Расчеты.Контрагент,
|    Расчеты.СуммаВзаиморасчетовОстаток КАК Остаток
|ИЗ
|    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК Расчеты
|ИТОГИ
|    СУММА(Остаток)
|ПО
|    ОБЩИЕ,
|    ВидДоговора";
 
 

Результат запроса с конструкцией ИТОГИ

 
 
На рисунке обведены группировки которые образовались в ходе выполнения запроса, самая верхняя относится к секции ОБЩИЕ, а вторая к полю ДоговорКонтрагентаВидДоговора.

Остались вопросы? Задавайте, поможем!