Skip to content
Educora
Advanced20 min10 / 14

The query language: selection, joins, grouping and totals

Select data in the 1C query language: `ВЫБРАТЬ … ИЗ … ГДЕ`, parameters, `ЛЕВОЕ` and `ВНУТРЕННЕЕ СОЕДИНЕНИЕ`, `СГРУППИРОВАТЬ ПО`, `ИТОГИ`; work with the `Запрос` object in code and use the query wizard.

Check yourself
In this lesson you will learn
  • Write queries with selection, conditions, sorting and parameters
  • Join tables, group data and get totals
  • Run a query in code and process the result as a selection or a table

If you know SQL, the 1C query language will feel familiar — the keywords are just in Russian. There are two important differences, though: queries only read data (objects and record sets change it), and the tables are not DBMS tables but metadata objects: Справочник.Товары, Документ.РасходТовара.Товары, РегистрНакопления.ОстаткиТоваров.

Your first query

1C Query
ВЫБРАТЬ
    Товары.Ссылка КАК Товар,
    Товары.Код КАК Код,
    Товары.Цена КАК Цена
ИЗ
    Справочник.Товары КАК Товары
ГДЕ
    Товары.Цена >= &МинЦена
    И НЕ Товары.ПометкаУдаления
УПОРЯДОЧИТЬ ПО
    Цена УБЫВ
&МинЦена is a parameter; КАК (AS) gives aliases to fields and tables; УБЫВ (DESC) sorts in descending order.
1CEnglish syntax / SQL
ВЫБРАТЬ, РАЗЛИЧНЫЕ, ПЕРВЫЕ 10SELECT, DISTINCT, TOP 10
ИЗ, КАК, ГДЕFROM, AS, WHERE
СГРУППИРОВАТЬ ПО, ИМЕЮЩИЕGROUP BY, HAVING
УПОРЯДОЧИТЬ ПО … УБЫВORDER BY … DESC
ЛЕВОЕ / ВНУТРЕННЕЕ / ПОЛНОЕ СОЕДИНЕНИЕ … ПОLEFT / INNER / FULL JOIN … ON
ОБЪЕДИНИТЬ ВСЕUNION ALL
И, ИЛИ, НЕ, В, МЕЖДУ, ПОДОБНО, ЕСТЬ NULLAND, OR, NOT, IN, BETWEEN, LIKE, IS NULL
СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕSUM, COUNT, MAX, MIN, AVG

In a query you can go through a reference field with a dot: РасходТовары.Ссылка.Дата gives the document date, and Товары.Ссылка.Родитель.Наименование the group name. Behind the scenes the platform builds a hidden join for this.

To choose a value by condition inside a query, use the ВЫБОР КОГДА … ТОГДА … ИНАЧЕ … КОНЕЦ (CASE WHEN) construct; to refer to an enumeration value, a predefined item or an empty reference, use the ЗНАЧЕНИЕ() (VALUE) function. This lets you write an enumeration value directly in the text without a parameter.

1C Query
ВЫБРАТЬ
    Оплаты.Ссылка КАК Документ,
    ВЫБОР
        КОГДА Оплаты.ВидОплаты = ЗНАЧЕНИЕ(Перечисление.ВидыОплаты.Наличные)
            ТОГДА "Наличные"
        ИНАЧЕ "Безналичные"
    КОНЕЦ КАК Способ
ИЗ
    Документ.Оплата КАК Оплаты
ГДЕ
    Оплаты.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) excludes documents whose counterparty is not filled in.

The `Запрос` object in code

1C
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|    Товары.Наименование КАК Наименование,
|    Товары.Цена КАК Цена
|ИЗ
|    Справочник.Товары КАК Товары
|ГДЕ
|    Товары.Цена >= &МинЦена
|УПОРЯДОЧИТЬ ПО
|    Цена УБЫВ";
Запрос.УстановитьПараметр("МинЦена", 5);

Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
    Сообщить("Ничего не найдено");
КонецЕсли;

Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.Наименование + " - " + Выборка.Цена);
КонецЦикла;

Таблица = Результат.Выгрузить();  // ТаблицаЗначений
In English syntax: Новый Запрос = New Query, УстановитьПараметр = SetParameter, Выполнить = Execute, Выбрать = Select, Следующий = Next, Выгрузить = Unload.

Выбрать() returns a selection that reads the result row by row — economical for large results. Выгрузить() loads everything into memory as a ТаблицаЗначений — convenient for sorting, grouping or passing to a form. Never glue values into the query text by string concatenation — always use &Parameter and УстановитьПараметр.

Joins and grouping

1C Query
ВЫБРАТЬ
    Товары.Ссылка КАК Товар,
    ЕСТЬNULL(Продажи.Количество, 0) КАК Продано
ИЗ
    Справочник.Товары КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            РасходТовары.Товар КАК Товар,
            СУММА(РасходТовары.Количество) КАК Количество
        ИЗ
            Документ.РасходТовара.Товары КАК РасходТовары
        ГДЕ
            РасходТовары.Ссылка.Проведен
            И РасходТовары.Ссылка.Дата МЕЖДУ &Начало И &Конец
        СГРУППИРОВАТЬ ПО
            РасходТовары.Товар) КАК Продажи
        ПО Товары.Ссылка = Продажи.Товар
УПОРЯДОЧИТЬ ПО
    Продано УБЫВ
All products, even those never sold: ЛЕВОЕ СОЕДИНЕНИЕ keeps every row of the left table, and ЕСТЬNULL (ISNULL) replaces NULL with 0.
JoinWhich rows remain
ВНУТРЕННЕЕ СОЕДИНЕНИЕonly rows that have a match in both tables
ЛЕВОЕ СОЕДИНЕНИЕall rows on the left; right-hand fields are NULL without a match
ПОЛНОЕ СОЕДИНЕНИЕall rows of both tables

СГРУППИРОВАТЬ ПО (GROUP BY) groups rows, and aggregate functions such as СУММА, КОЛИЧЕСТВО, МАКСИМУМ calculate per group. To filter groups, write ИМЕЮЩИЕ (HAVING), not ГДЕ: ИМЕЮЩИЕ СУММА(РасходТовары.Сумма) > 1000. ГДЕ filters rows before grouping, ИМЕЮЩИЕ after it.

Totals: `ИТОГИ`

ИТОГИ (TOTALS) is a 1C feature that SQL lacks: it adds total rows per group to the result. You then walk the result with nested selections using ОбходРезультатаЗапроса.ПоГруппировкам (by groupings): first the warehouse total, then its products.

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

ВыборкаСклад = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСклад.Следующий() Цикл
    Сообщить(СтрШаблон("%1: %2", ВыборкаСклад.Склад, ВыборкаСклад.Сумма));
    ВыборкаСтрок = ВыборкаСклад.Выбрать();
    Пока ВыборкаСтрок.Следующий() Цикл
        Сообщить(СтрШаблон("    %1: %2", ВыборкаСтрок.Товар, ВыборкаСтрок.Сумма));
    КонецЦикла;
КонецЦикла;
  1. 1
    Open the wizard

    Right-click in a module → Конструктор запроса… (Query wizard). If you also need code, choose Конструктор запроса с обработкой результата… — it writes the Запрос object and the loop as well.

  2. 2
    Pick tables and fields

    On the Таблицы и поля tab drag tables and fields; set joins on Связи, conditions on Условия, and the rest on Группировка and Порядок.

  3. 3
    Test in a console

    Before running a complex query from code, try it in the query console (the Консоль запросов data processor) in 1C:Enterprise mode: enter the parameters and see the result immediately.

Key points

  • Queries only read; the sources are metadata objects (Справочник.X, Документ.X.Товары).
  • Pass values with &Parameter and УстановитьПараметр.
  • ЛЕВОЕ СОЕДИНЕНИЕ + ЕСТЬNULL is the standard way to keep rows without a match.
  • ГДЕ filters before grouping, ИМЕЮЩИЕ after; ИТОГИ adds group totals.
  • Выбрать() gives a row-by-row selection, Выгрузить() a ТаблицаЗначений.

Check yourself

10 questions. Every correct answer earns XP.

1 / 10
How is a value passed into a query from outside?