Как в запросе получить Вид (тип) Документа? Проверка на тип значения в запросе 1с.

  • Дата: 27.03.2024

Язык запросов 1С — одно из основных отличий между версиями 7.7 и 8. Одним из важнейших пунктов в изучении 1С-программирования является язык запросов. В 1С 8.3 запросы — самый мощный и эффективный инструмент получения данных. Язык запросов позволяет в удобном виде получать информацию из базы данных.

Сам синтаксис очень сильно напоминает классический T-SQL, за исключением того, что в 1С с помощью языка запросов можно только получать данные, используя конструкцию Выбрать(select). Язык поддерживает и более сложные конструкции, например, (запрос в запросе). Запросы в 1С 8 можно составлять как на кириллице, так и на латинице.

В статье я постараюсь рассказать про основные ключевые слова в языке запросов 1С:

  • выбрать
  • разрешенные
  • различные
  • выразить
  • первые
  • для изменения
  • значение
  • тип значения (и оператор ССЫЛКА)
  • выбор
  • сгруппировать по
  • имеющие
  • ЕСТЬNULL
  • Есть NULL
  • соединения — правые, левые, внутренние, полные .

А так же небольшие хитрости языка 1С, применяя которые вы сможете оптимально построить текст запроса.

Для отладки запросов в системе 1С 8.2 предусмотрен специальный инструмент — консоль запросов. Увидеть описание и скачать его можно по ссылке — .

Рассмотрим самые важные и интересные операторы языка запросов 1С.

ВЫБРАТЬ (SELECT)

В языке запросов 1С предприятия 8 любой запрос начинается с ключевого слова ВЫБРАТЬ . В языке 1С нет конструкций UPDATE, DELETE, CREATE TABLE, INSERT, эти манипуляции производятся в объектной технике. Предназначение его — только чтение данных.

Например:

ВЫБРАТЬ
ТекущийСправочник.Наименование
ИЗ
Справочник.Номенклатура КАК ТекущийСправочник

Запрос вернёт таблицу с наименованиями номенклатуры.

Рядом с конструкцией ВЫБРАТЬ можно встретить ключевые слова ДЛЯ ИЗМЕНЕНИЯ , РАЗРЕШЕННЫЕ , РАЗЛИЧНЫЕ , ПЕРВЫЕ

РАЗРЕШЕННЫЕ — выбирает только записи из таблицы, на которые есть права у текущего пользователя.

РАЗЛИЧНЫЕ — означает, что в результат не попадет дублирующих строк.

ВЫБОР (CASE)

Очень часто данная конструкция недооценивается программистами. Пример её использования:

ТекущийСправочник.Наименование,

КОГДА ТекущийСправочник.Услуга ТОГДА

«Услуга»

КОНЕЦ КАК ВидНоменклатуры

Справочник.Номенклатура КАК ТекущийСправочник

Пример возвратит в поле «ВидНоменклатуры» текстовое значение — «Товар» или «Услуга».

ГДЕ (WHERE)

Конструкция языка запросов 1C, позволяющая наложить отбор на получаемые данные. Учтите, что от сервера система получает все данные, а только потом они отбираются по данному параметру.

ВЫБРАТЬ
Справочник.Наименование
ИЗ
ТекущийСправочник.Номенклатура КАК ТекущийСправочник
ГДЕ ТекущийСправочник.Услуга = ИСТИНА

В примере мы отбираем записи, у которых значение реквизита «Услуга» установлено в положение «Истина». В данном примере можно было бы обойтись и таким условием:

«ГДЕ Услуга»

По сути, мы отбираем строки, у которых выражение после ключевого слова равно «Истина».

В выражениях можно использовать прямые условия:

ГДЕ Код = «005215»

С помощью оператора «ЗНАЧЕНИЕ()» в условиях использовать обращение к предопределенным элементам и перечислениям в запросе 1С:

ГДЕ ТипНоменклатуры= Значение(Перечисление.ТипыНоменклатуры.Товар)

Значения времени могут указываться следующим образом:

ГДЕ ДатаПоступления > ДАТАВРЕМЯ(2012,01,01):

Чаще всего условия указываются в виде параметров, передаваемых в запрос:

Получите 267 видеоуроков по 1С бесплатно:

ГДЕ НоменклатурнаяГруппа= &НоменклатурнаяГруппа

Условие можно наложить на тип реквизита, если он составного типа:

Если необходимо ограничивать отбор из списка значений или массива, можно поступить следующим образом:

ГДЕ РегистрНакопления.Регистратор В (&СписокДокументовДляОтбора)

Условие может быть и сложное, состоящее из нескольких условий:

ГДЕ ДатаПоступления > ДАТАВРЕМЯ(2012,01,01) И НоменклатурнаяГруппа= &НоменклатурнаяГруппа И НЕ Услуга

СГРУППИРОВАТЬ ПО (GROUP BY)

Конструкция языка запросов 1С 8.2, используемая для группировки результата.

Например:

ВЫБРАТЬ
ПоступлениеТоваровУслугTовары.Товар,
СУММА(ПоступлениеТоваровУслугTовары.Количество) КАК Количество,
СУММА(ПоступлениеТоваровУслугTовары.Сумма) КАК Сумма
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугTовары

СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугTовары.Товар

Данный запрос просуммирует все поступления по сумме и количеству в разрезе номенклатуры.

Помимо ключевого слова СУММА можно использовать другие агрегатные функции: КОЛИЧЕСТВО , КОЛИЧЕСТВО РАЗНЫХ , МАКСИМУМ , МИНИМУМ , СРЕДНЕЕ .

ИМЕЮЩИЕ (HAVING)

Конструкция, о которой часто забывают, но она очень важна и полезна. Она позволяет указать отбор в виде агрегатной функции, этого нельзя сделать в конструкции ГДЕ .

Пример использования ИМЕЮЩИЕ в запросе 1С:

ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.Товар,
СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК Количество,
СУММА(ПоступлениеТоваровУслугТовары.Сумма) КАК Сумма
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары

СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугТовары.товар

СУММА(ПоступлениеТоваровУслугТовары.Количество) > 5

Так мы отберем количество товаров, которых поступило более 5 штук.

ЗНАЧЕНИЕ()

Например:

ГДЕ Банк = Значение(Справочник.Банки.ПустаяСсылка)

ГДЕ ВидНоменклатуры = Значение(Справочник.ВидыНоменклатуры.Товар)

ГДЕ ТипНоменклатуры= Значение(Перечисление.ТипыНоменклатуры.Услуга)

ТИП в запросе

Тип данных можно проверить следующим образом: с помощью функций ТИП() и ТИПЗНАЧЕНИЯ() или с помощью логического оператора ССЫЛКА.

ВЫРАЗИТЬ()

Оператор Выразить в запросах 1С служит для преобразования типов данных.

Синтаксис: ВЫРАЗИТЬ(<Выражение> КАК <Тип значения>)

С помощью него можно преобразовать строковые значения в дату или ссылочные в строковые данные и так далее.

В практическом применении оператор Выразить() очень часто используется для преобразования полей неограниченной длины, потому что поля неограниченной длины нельзя отбирать, группировать и тд. Если такие поля не преобразовывать, Вы получите ошибку Нельзя сравнивать поля неограниченной длины и поля несовместимых типов .

ВЫБРАТЬ
КонтактнаяИнформация.Объект,
ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(150)) КАК Представление
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация

СГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(150)),
КонтактнаяИнформация.Объект

ЕСТЬNULL (ISNULL)

Достаточно полезная функция языка запросов 1С, которая проверяет значение в записи, и если оно равно NULL, то позволяет заменить на своё значение. Чаще всего используется при получении виртуальных таблиц остатков и оборотов, чтобы скрыть NULL и поставить понятный 0 (ноль).

ЕСТЬNULL(НалогиПредМесяца.ПримененнаяЛьготаФСС, 0)

Такая функция языка запросов 1С ЕСТЬNULL при отсутствии значения вернет ноль, что позволит избежать ошибки.

СОЕДИНЕНИЕ (JOIN)

Соединения бывают 4 типов: ЛЕВОЕ , ПРАВОЕ , ПОЛНОЕ, ВНУТРЕННЕЕ .

ЛЕВОЕ и ПРАВОЕ СОЕДИНЕНИЕ

Соединения используются для связи двух таблиц по определенному условию. Особенность при ЛЕВОМ СОЕДИНЕНИИ в том, что мы берём первую указанную таблицу полностью и привязываем по условию вторую таблицу. Поля второй таблицы, которые не удалось привязать по условию, заполняются значением NULL .

Пример левого соединения в запросе 1С:

Вернет всю таблицу и заполнит поле «Банк» лишь в тех местах, где будет соблюдаться условие «Контрагенты.Наименование = Банки.Наименование». Если условие не соблюдается, в поле Банк будет установлено NULL .

ПРАВОЕ СОЕДИНЕНИЕ в языке 1С 8.3 абсолютно аналогично ЛЕВОМУ соединению , за исключением одного отличия: в ПРАВОМ СОЕДИНЕНИИ «главная» таблица — вторая, а не первая.

ПОЛНОЕ СОЕДИНЕНИЕ

ПОЛНОЕ СОЕДИНЕНИЕ отличается от левого и правого тем, что выводит все записи из двух таблиц, соединяет лишь те, которые может соединить по условию.

Например:

ПОЛНОЕ СОЕДИНЕНИЕ
Справочник.Банки КАК Банки

ПО

Язык запросов вернет обе таблицы полностью лишь по выполненному условию Соединить записи. В отличие от левого/правого соединения возможно появления NULL в двух полях.

ВНУТРЕННЕЕ СОЕДИНЕНИЕ

ВНУТРЕННЕЕ СОЕДИНЕНИЕ отличается от полного тем, что выводит только те записи, которые смогли соединить по заданному условию.

Например:

ИЗ
Справочник.Контрагенты КАК Клиенты

ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Справочник.Банки КАК Банки

ПО
Клиенты.Наименование = Банки.Наименование

Данный запрос вернет только строки, в которых у банка и контрагента будет одинаковое наименование.

Заключение

Это лишь небольшая часть синтаксиса из языка запросов 1С 8, в дальнейшем я попробую рассмотреть более подробно некоторые моменты, показать и многое другое!

В этой статье разберем возможности приведения типов в языке запросов 1С, которые предоставляет функция «Выразить».
Рассмотрим несколько вариантов применения этой функции.
И первый вариант – округление чисел.

Для этого необходимо использовать функцию Выразить в следующем формате:

Выразить(<Число> как Число(<ДлинаЧисла>,<Точность>))

Где:
Число — поле, параметр которое нужно округлить
ДлинаЧисла — максимальная длина числа
Точность — точность округления числа

Параметры и длинна и точность должны быть целыми положительными числами.
Посмотрите, как работает эта функция на рисунке ниже.

Второй вариант применения – приведение строк. Очень часто в конфигурациях используются строки неограниченной длинны, что накладывает некоторые ограничения. Например, мы не можем сравнивать строки неограниченной длины.
В запросе, который приведен ниже, поле ПолноеНаименование имеет тип строка неограниченной длины, и этот запрос не будет работать.

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

Выразить(<Строка> как Строка(<ДлинаСтроки>)

Где
ДлинаСтроки – максимальная длина, к которой будет приведена строка.
Переделаем запрос: будем в условии приводить неограниченную строку к строке с определенной длинной. Тогда ни каких ошибок не будет.

Рассмотрим последний и, я бы сказал, самый главный вариант её применения: при работе с полями составного типа.
Ниже приведены два запроса, в которых используются поля составного типа. Первый неправильный, а второй правильный.

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

Выразить(<Документ> как Документ.<ИмяТаблицы>)
Выразить(<Справочник> как Справочник.< ИмяТаблицы >)
.

Где
ИмяТаблицы — название объекта в .

Всегда используйте функцию выразить, когда работаете с составными типами, это существенно оптимизирует запрос.

Если Вы всё еще «плаваете» в конструкциях языка запросов, и у Вас вызывают трудности даже самые простые запросы, то рекомендую вам мой курс «Запросы в 1С от новичка до профи» . Где эти и многие другие вопросы рассматриваются более подробно.

В чем особенность этого курса:
Курс рассчитан на тех, кто не знаком с языком запросов в 1С;
Учебный материал грамотно скомпонован и прост в освоении;
Несколько десятков уроков;
Полезные практические примеры;
Все уроки изложены понятным и простым языком

Для моих читателей, купон на скидку 25%: hrW0rl9Nnx

Я стараюсь как можно чаще выпускать различные интересные бесплатные статьи и видеоуроки. Поэтому буду очень рад, если Вы поддержите мой проект перечислив любую сумму:

Можете перечислить любую сумму напрямую:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655

Вступайте в мои группы.

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

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

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

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

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

Пример использования:

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

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

Пример использования:

Запрос.Текст = "ВЫБРАТЬ | РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2015, 4, 17), ДАТАВРЕМЯ(2015, 2, 1), ДЕНЬ) | КАК КолвоДней";

3. Функция ЗНАЧЕНИЕ - задает константное поле с предопределенной записью из базы данных, также можно получить пустую ссылку любого типа.

Синтаксис: ЗНАЧЕНИЕ(<Имя>)

Пример использования:

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

4. Функция ВЫБОР - перед нами аналог конструкции ЕСЛИ который используется в коде, только эта используется в запросах 1С.

Синтаксис: ВЫБОР КОГДА <Выражение> ТОГДА <Выражение> ИНАЧЕ <Выражение> КОНЕЦ

Пример использования:

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

5. Функция ВЫРАЗИТЬ - позволяет выразить константное поле определенным типом.

Синтаксис: ВЫРАЗИТЬ(НазваниеПоля КАК НазваниеТипа)

Пример использования:

Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | Продажи.Регистратор.Номер, | ВЫБОР | КОГДА Продажи.Регистратор ССЫЛКА Документ.Расходная | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.Расходная) | ИНАЧЕ ВЫБОР | КОГДА Продажи.Регистратор ССЫЛКА Документ.Реализация | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.Реализация) | КОНЕЦ | ... | КОНЕЦ КАК Номер | ИЗ | РегистрНакопления.Закупки КАК Закупки";

Еще есть вариант использования функции ВЫРАЗИТЬ в полях смешанных типах, где такие встречаются? Самый простой пример это "Регистратор" у любого регистра. Так зачем нам может понадобиться уточнять тип в регистраторе? Давайте рассмотрим ситуацию когда мы из регистратора выбираем поле "Номер", из какой таблицы будет выбран номер? Правильный ответ из всех! Поэтому чтобы наш запрос работал быстро следует указывать явный тип с помощью функции ВЫРАЗИТЬ

Пример использования:

Запрос.Текст = "ВЫБРАТЬ | ВЫРАЗИТЬ(Номенклатура.Комментарий КАК Строка(300)) КАК Комментарий, | ВЫРАЗИТЬ(Номенклатура.Сумма КАК Число(15,2)) КАК Сумма |ИЗ | Справочник.Номенклатура КАК Номенклатура";

6. Функция ISNULL (альтернативное написание ЕСТЬNULL) - если поле имеет тип NULL, то оно заменяется на второй параметр функции.

Синтаксис: ЕСТЬNULL(<Поле>, <ПодставляемоеЗначение>)

Пример использования:

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

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

7. Функция ПРЕДСТАВЛЕНИЕ - позволяет получить представление поля запроса.

Синтаксис: ПРЕДСТАВЛЕНИЕ(<НаименованиеПоля>)

Пример использования:

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

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

Выше мы рассмотрели с Вами функции языка запросов 1с , теперь пришло время рассмотреть конструкции в языке запросов 1с , они не менее важны и полезны, приступаем.

1. Конструкция ССЫЛКА - представляет из себя логический оператор проверки ссылочного типа. Наиболее часто встречается при проверки поля составного типа на конкретный тип. Синтаксис: ССЫЛКА <Имя таблицы>

Пример использования:

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

2. Конструкция МЕЖДУ - данный оператор проверяет входит ли значение в указанный диапазон.

Синтаксис: МЕЖДУ <Выражение> И <Выражение>

Пример использования:

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

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

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

Пример использования:

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

4. Конструкция ПОДОБНО - эта функция позволяет нам сравнивать строку с шаблоном строки.

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

Варианты шаблона строки:

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

Один произвольный символ.

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

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

Пример использования:

Запрос.Текст = //найдем всю номенклатуру которая содержит корень ТАБУР и начинается //либо с маленькой либо с большой буквы т "ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Товары.Наименование ПОДОБНО ""[Тт]абур%""" ;

5. Конструкция РАЗРЕШЕННЫЕ - этот оператор позволяет выбрать только те записи из БД, на которые вызывающий имеет право чтения. Данные права настраиваются на уровне записей (RLS).

Синтаксис: РАЗРЕШЕННЫЕ пишется после ключевого слова ВЫБРАТЬ

Пример использования:

Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | Контрагенты.Ссылка |ИЗ | Справочник.Контрагенты КАК Контрагенты";

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>

Пример использования:

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

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

Запрос.Текст = "ВЫБРАТЬ | усЕдиницыХранения.Ссылка |ИЗ | Справочник.усЕдиницыХранения КАК усЕдиницыХранения // Пример 1. сравнение с не заполненным булевым значением: |ГДЕ | усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны = Ложь // Пример 2. но если это булево определено, то лучше так: // условие на отрицательное булево: |ГДЕ | НЕ усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны // Пример 3. выборка по условию не заполненного поля, имеющего тип "справочник конкретного типа" |ГДЕ | усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка) // Пример 3а. выборка по условию не заполненного поля, имеющего тип "документ конкретного типа" |ГДЕ | НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент.ПустаяСсылка) // Пример 3б. выборка по условию не заполненного поля, имеющего тип "документы разных типов" (составное поле) |ГДЕ | (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка) | ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка) | ИЛИ...(и т.д. - последовательно перечисляем условия для всех возможных типов этого составного поля)) // Пример 4. или наоборот, если нужно выбрать заполненное значение типа "строка", то поможет условие: |ГДЕ | усЕдиницыХранения.Наименование > """" // Пример 5. если нужно выбрать документы конкретного типа, при составном типе данных, например в регистре "ВыполняемыеЗадания" ресурс "Задание" имеет составной тип, среди значений которого возможен документ "Отбор" |ГДЕ | ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор // Пример 5а. Еще аналогичный пример, когда нужно выбрать документы конкретного типа | ВЫБОР | КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.ПоступлениеТоваровУслуг) ССЫЛКА Документ.ПоступлениеТоваровУслуг | ТОГДА ""ПоступлениеТоваровУслуг"" | КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.РеализацияТоваровУслуг) ССЫЛКА Документ.РеализацияТоваровУслуг | ТОГДА ""РеализацияТоваровУслуг"" | ИНАЧЕ """" | КОНЕЦ КАК ВидДокумента // Пример 6. выбор по условию не определенного значения: |ГДЕ | СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО // Пример 7. выбор по виду движения "Приход" регистра накопления, "Расход" - аналогично): |ГДЕ | РегТоварыВРознице.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) // Пример 8. Как в запросе указать, что выполнять запрос не нужно (например, нужно программно в зависимости от какого-то условия вернуть пустой результат запроса - Запрос.Текст = СтрЗаменить(Запрос.Текст, "ГДЕ Док.Ссылка = &ДокументСсылка", "ГДЕ ЛОЖЬ");). Для этого достаточно добавить условие "Где Ложь". Кстати, независимо от объема запрашиваемых в выборке данных, такой запрос будет выполнен мгновенно. |ГДЕ ЛОЖЬ // Пример 9. Проверка на то, что результат выполнения запроса содержит данные: Если НЕ Запрос.Выполнить().Пустой() Тогда // Пример 10. выбор по условию не заполненной даты: |ГДЕ | тбСтроки.ДатаОтмены = ДАТАВРЕМЯ(1, 1, 1)