Построение запросов к базе на 1С Предприятие 8.3

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

ВЫБРАТЬ (SELECT)

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

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

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

ДЛЯ ИЗМЕНЕНИЯ — блокирует записи таблицы на время транзакции (не актуально для управляемых блокировок).

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

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

ПЕРВЫЕ n — в языке 1С 8.3 запрос отберет только n первых записей.

 

ВЫБОР (CASE)

ВЫБРАТЬ
	ТекущийСправочник.Наименование,
ВЫБОР
	КОГДА ТекущийСправочник.Услуга ТОГДА
	«Услуга»
ИНАЧЕ
	«Товар»
	КОНЕЦ КАК ВидНоменклатуры
ИЗ
	Справочник.Номенклатура КАК ТекущийСправочник

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

 

ГДЕ (WHERE)

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

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

ГДЕ Услуга

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

ГДЕ Код = "005215"

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

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

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

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

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

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

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

ГДЕ РегистрНакопления.Регистратор ССЫЛКА Документ.ПоступленияТоваров

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

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

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

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

 

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

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

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

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

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

 

ИМЕЮЩИЕ (HAVING)

Позволяет указать отбор в виде агрегатной функции, этого нельзя сделать в конструкции ГДЕ.

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

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

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

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

 

ЗНАЧЕНИЕ()

В запросе 1C ЗНАЧЕНИЕ () можно использовать для указания предопределенных значений, таких как значения перечисления, пустую ссылку или значение предопределенного элемента (справочника, плана счетов, ПВХ и т.д).

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

или

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

или

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

 

ТИП в запросе

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

ГДЕ ТИПЗНАЧЕНИЯ(Проект.Ссылка) <> ТИП(Справочник.Проект)

или

ГДЕ Проект.Ссылка ССЫЛКА Справочник.Проект

 

ВЫРАЗИТЬ()

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

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

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

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

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

 

ЕСТЬNULL (ISNULL)

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

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

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

 

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

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

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

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

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

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

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

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

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

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

ВЫБРАТЬ
	Клиенты.Ссылка КАК Клиенты,
	Банки.Ссылка КАК Банк
ИЗ
	Справочник.Контрагенты КАК Клиенты

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

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

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

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

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

ВЫБРАТЬ
	Клиенты.Ссылка КАК Клиенты,
	Банки.Ссылка КАК Банк

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

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

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

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

 

Агрегатные функции (СУММА, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, КОЛИЧЕСТВО)

ВЫБРАТЬ
       ПодразделениеКомпании,
       СУММА(СуммаДокумента),
       МАКСИМУМ(СуммаДокумента),
       МИНИМУМ(СуммаДокумента),
       СРЕДНЕЕ(СуммаДокумента),
       КОЛИЧЕСТВО(*)
ИЗ Документ.АвансовыйОтчет
СГРУППИРОВАТЬ ПО ПодразделениеКомпании

 

Ключевое слово РАЗЛИЧНЫЕ / DISTINCT

Ключевое слово РАЗЛИЧНЫЕ позволяет оставить в результате запроса только отличающиеся строки.

ВЫБРАТЬ РАЗЛИЧНЫЕ Ответственный
ИЗ Документ.АвансовыйОтчет

 

Ключевое слово ПЕРВЫЕ / TOP

ВЫБРАТЬ ПЕРВЫЕ 10 Номер, Дата, СуммаДокумента
ИЗ Документ.АвансовыйОтчет
УПОРЯДОЧИТЬ ПО СуммаДокумента УБЫВ

 

Выражения в списке полей выборки

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

  • Литералы типов: число, строка (в кавычках), булево (значения Истина и Ложь), Null, Неопределено. [Замечание: Чтобы указать литерал типа «дата», можно воспользоваться ключевым словом языка запросов ДАТАВРЕМЯ или передать дату через параметр запроса].
  • Параметры запроса (со знаком &)
  • Имя поля
  • Имя табличной части
  • Разыменование ссылочного поля (через одну или несколько точек)
  • Арифметические операции (+, -, /, *) [Замечание: операция получения остатка % в языке запросов не поддерживается]
  • Операция конкатенации строк (+) [Замечание: операцию конкатенации нельзя использовать для виртуальных полей]
  • Встроенные функции языка запросов (ДЕНЬ, МЕСЯЦ, ГОД и т.д.)
  • Операция выбора ВЫБОР / CASE — позволяет получить одно из возможных значений в соответствии с указанными условиями.
  • Операция приведения типов ВЫРАЗИТЬ / CAST

Ниже приведено несколько примеров с выражениями в списке полей выборки:

//арифметические операции
ВЫБРАТЬ
       Номенклатура,
       Количество * Цена КАК РасчСумма1,
       Сумма / Количество КАК РасчСумма2
ИЗ Документ.АвансовыйОтчет.Товары

//литералы типа "булево", "число", "строка", "дата"
ВЫБРАТЬ Истина, Ложь, 10.5, "Текст", ДАТАВРЕМЯ(2003,12,25)

//конкатенация строк
ВЫБРАТЬ "Сотрудник " + Ответственный.Наименование
ИЗ Документ.АвансовыйОтчет

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

//операция приведения типов
ВЫБРАТЬ
       Ссылка,       
       Номенклатура,
       ВЫРАЗИТЬ(Сумма / 3 КАК Число(5,2)) КАК ТретьСуммы
ИЗ Документ.АвансовыйОтчет.Товары

 

Один из источников: https://its.1c.ru/db/metod8dev/content/2590/hdoc