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

К полям запроса можно применять различные функции. В этом разделе я рассмотрю наиболее часто применяемые (лично мною) из них.

ДАТАВРЕМЯ - задает константное поле с типом Дата. Синтаксис:

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

Запрос.Текст =

"ВЫБРАТЬ

| ДАТАВРЕМЯ(2013, 1, 1) КАК ОМГ";//1 января 2013

РАЗНОСТЬДАТ - возвращает разность 2-х дат в указанном измерении (год, месяц, день, час, минута, секунда). Синтаксис:

РАЗНОСТЬДАТ(<Дата1>, <Дата2>, <Тип>)

Запрос.Текст =

"ВЫБРАТЬ

| РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2013, 2, 28), ДАТАВРЕМЯ(2013, 1, 1), ДЕНЬ)

| КАК ДнейДоКонцаЗимы";

ЗНАЧЕНИЕ - задает константное поле с предопределенной записью одной из таблиц БД, также можно передать пустую ссылку. Синтаксис:

ЗНАЧЕНИЕ(<Имя>)

Запрос.Текст =

"ВЫБРАТЬ

//предопределенный элемент справочника

| ЗНАЧЕНИЕ(Справочник.Валюты.Рубли) КАК Рубль,

//пустая ссылка на документ

| ЗНАЧЕНИЕ(Документ.СчетНаОплатуПокупателю.ПустаяСсылка) КАК ПустойСчет,

//значение перечисления

| ЗНАЧЕНИЕ(Перечисление.ПолФизическихЛиц.Мужской) КАК Мужчина,

//предопределенный счет из плана счетов

| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары) КАК Счет_41";

ВЫБОР - аналог конструкции ЕСЛИ для языка запросов 1С. Синтаксис:

Пример 1:

ВЫБОР

КОГДА <Выражение> ТОГДА <Выражение>

ИНАЧЕ <Выражение>

КОНЕЦ

Запрос.Текст =

"ВЫБРАТЬ

//если цена меньше 100, то запрос все равно вернет 100

//в противном случае запрос вернет реальную цену

| ВЫБОР

| КОГДА Товары.Цена > 100

| ТОГДА Товары.Цена

| ИНАЧЕ 100

| КОНЕЦ КАК Цена

|ИЗ

| Справочник.Товары КАК Товары";

Пример 2:

|ВЫБРАТЬ

| ВзаиморасчетыСКонтрагентамиОбороты.Организация КАК Организация,

| ВзаиморасчетыСКонтрагентамиОбороты.Контрагент КАК Контрагент,

| ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,

| ВзаиморасчетыСКонтрагентамиОбороты.ДокументРасчетовСКонтрагентом КАК ДокументАванса,

| ВзаиморасчетыСКонтрагентамиОбороты.ДокументРасчетовСКонтрагентом.ВалютаДокумента КАК ВалютаРасчетов,

| ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход КАК СуммаАванса,

| ВзаиморасчетыСКонтрагентамиОбороты.СуммаРеглРасход,

| ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента.РасчетыВУсловныхЕдиницах КАК РасчетыВУсловныхЕдиницах,

| ВЫБОР

| КОГДА |ВзаиморасчетыСКонтрагентамиОбороты.ДокументРасчетовСКонтрагентом.ВалютаДокумента В (ВЫБРАТЬ

| Константы.ВалютаРегламентированногоУчета

| ИЗ

| Константы КАК Константы)

| ТОГДА ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовРасход

| ИНАЧЕ ВзаиморасчетыСКонтрагентамиОбороты.СуммаРеглРасход

| КОНЕЦ КАК ВалютнаяСуммаАванса

|ИЗ

| РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Обороты(

| &НачалоПериода,

| &КонецПериода,

| Период,

| Организация = &Организация)

ССЫЛКА - логический оператор проверки ссылочного типа.

Чаще всего используется для проверки поля составного типа на конкретный тип. Синтаксис:

ССЫЛКА <Имя таблицы>

Запрос.Текст =

"ВЫБРАТЬ

//если тип значения регистратора документ Приходная,

//тогда запрос вернет "Поступление товаров", иначе "Реализация товаров"

| ВЫБОР

| КОГДА Остатки.Регистратор ССЫЛКА Документ.Приходная

| ТОГДА ""Поступление товаров""

| ИНАЧЕ ""Реализация товаров""

| КОНЕЦ КАК ВидДвижения

|ИЗ

| РегистрНакопления.Остатки КАК Остатки";

МЕЖДУ - проверяет значение на вхождение в диапозон.

Синтаксис:

МЕЖДУ <Выражение> И <Выражение>

Запрос.Текст =

//получим все товары в диапазоне цен от 100 до 1000

"ВЫБРАТЬ

| Товары.Товар

|ИЗ

| Справочник.Товары КАК Товары

|ГДЕ

| Товары.Цена МЕЖДУ 100 И 1000";

В и В ИЕРАРХИИ - проверяют наличие значения в передаваемом списке. В ИЕРАРХИИ также развернет иерархические элементы вниз и поищет значение среди подчиненных элементов. Синтаксис:

В(<СписокЗначений>), В ИЕРАРХИИ(<СписокЗначений>)

Запрос.Текст =

//получим все субсчета 41-го и 10-го счета

"ВЫБРАТЬ

| Хозрасчетный.Ссылка КАК Счет

|ИЗ

| ПланСчетов.Хозрасчетный КАК Хозрасчетный

|ГДЕ

| Хозрасчетный.Ссылка В ИЕРАРХИИ (ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары),

| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы))";

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

Построение шаблона:

% (процент): последовательность, содержащая любое количество произвольных символов

_ (подчеркивание): один произвольный символ

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

[^...] (в квадратных скобках значок отрицания, за которым следует один или несколько символов): любой одиночный символ, кроме тех, которые перечислены следом за значком отрицания

Синтаксис:

ПОДОБНО "<ТекстШаблона>"

Запрос.Текст =

//найдем все стулья в справочнике номенклатура

"ВЫБРАТЬ

| Товары.Товар

|ИЗ

| Справочник.Товары КАК Товары

|ГДЕ

| Товары.Наименование ПОДОБНО ""[Cc]тул%""";

//этот запрос вернет Стул, стул, стульчик, стул офисный и т.д.,

//но стол в этом списке не окажется

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

Синтаксис:

ЕСТЬNULL(<Выражение>, <Выражение>)

Запрос.Текст =

//Если поле не определено (NULL)? то присвоим ему пустую ссылку

"ВЫБРАТЬ

| ЕСТЬNULL(Товары.Ссылка, ЗНАЧЕНИЕ(Справочник.Товары.ПустаяСсылка)) КАК Товар

|ИЗ

| Справочник.Товары КАК Товары";

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

после соединения таблиц, кроме внутреннего (о соединениях следующая статья);

после выбора реквизитов определенных только для групп справочников и наоборот;

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

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