Функции языка запросов
К полям запроса можно применять различные функции. В этом разделе я рассмотрю наиболее часто применяемые (лично мною) из них.
ДАТАВРЕМЯ - задает константное поле с типом Дата. Синтаксис:
ДАТАВРЕМЯ(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)
Запрос.Текст =
"ВЫБРАТЬ
| ДАТАВРЕМЯ(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, если заинтересует работа каких-либо еще - пишите в комментариях.