- 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
ВЫБРАТЬ
Товары.Ссылка КАК Товар,
Товары.Код КАК Код,
Товары.Цена КАК Цена
ИЗ
Справочник.Товары КАК Товары
ГДЕ
Товары.Цена >= &МинЦена
И НЕ Товары.ПометкаУдаления
УПОРЯДОЧИТЬ ПО
Цена УБЫВ&МинЦена is a parameter; КАК (AS) gives aliases to fields and tables; УБЫВ (DESC) sorts in descending order.| 1C | English syntax / SQL |
|---|---|
ВЫБРАТЬ, РАЗЛИЧНЫЕ, ПЕРВЫЕ 10 | SELECT, DISTINCT, TOP 10 |
ИЗ, КАК, ГДЕ | FROM, AS, WHERE |
СГРУППИРОВАТЬ ПО, ИМЕЮЩИЕ | GROUP BY, HAVING |
УПОРЯДОЧИТЬ ПО … УБЫВ | ORDER BY … DESC |
ЛЕВОЕ / ВНУТРЕННЕЕ / ПОЛНОЕ СОЕДИНЕНИЕ … ПО | LEFT / INNER / FULL JOIN … ON |
ОБЪЕДИНИТЬ ВСЕ | UNION ALL |
И, ИЛИ, НЕ, В, МЕЖДУ, ПОДОБНО, ЕСТЬ NULL | AND, 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.
ВЫБРАТЬ
Оплаты.Ссылка КАК Документ,
ВЫБОР
КОГДА Оплаты.ВидОплаты = ЗНАЧЕНИЕ(Перечисление.ВидыОплаты.Наличные)
ТОГДА "Наличные"
ИНАЧЕ "Безналичные"
КОНЕЦ КАК Способ
ИЗ
Документ.Оплата КАК Оплаты
ГДЕ
Оплаты.Контрагент <> ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка) excludes documents whose counterparty is not filled in.The `Запрос` object in code
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Наименование КАК Наименование,
| Товары.Цена КАК Цена
|ИЗ
| Справочник.Товары КАК Товары
|ГДЕ
| Товары.Цена >= &МинЦена
|УПОРЯДОЧИТЬ ПО
| Цена УБЫВ";
Запрос.УстановитьПараметр("МинЦена", 5);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщить("Ничего не найдено");
КонецЕсли;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование + " - " + Выборка.Цена);
КонецЦикла;
Таблица = Результат.Выгрузить(); // ТаблицаЗначенийНовый Запрос = 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
ВЫБРАТЬ
Товары.Ссылка КАК Товар,
ЕСТЬNULL(Продажи.Количество, 0) КАК Продано
ИЗ
Справочник.Товары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
РасходТовары.Товар КАК Товар,
СУММА(РасходТовары.Количество) КАК Количество
ИЗ
Документ.РасходТовара.Товары КАК РасходТовары
ГДЕ
РасходТовары.Ссылка.Проведен
И РасходТовары.Ссылка.Дата МЕЖДУ &Начало И &Конец
СГРУППИРОВАТЬ ПО
РасходТовары.Товар) КАК Продажи
ПО Товары.Ссылка = Продажи.Товар
УПОРЯДОЧИТЬ ПО
Продано УБЫВЛЕВОЕ СОЕДИНЕНИЕ keeps every row of the left table, and ЕСТЬNULL (ISNULL) replaces NULL with 0.| Join | Which 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.
Запрос.Текст =
"ВЫБРАТЬ
| РасходТовары.Ссылка.Склад КАК Склад,
| РасходТовары.Товар КАК Товар,
| РасходТовары.Сумма КАК Сумма
|ИЗ
| Документ.РасходТовара.Товары КАК РасходТовары
|ИТОГИ
| СУММА(Сумма)
|ПО
| Склад";
ВыборкаСклад = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаСклад.Следующий() Цикл
Сообщить(СтрШаблон("%1: %2", ВыборкаСклад.Склад, ВыборкаСклад.Сумма));
ВыборкаСтрок = ВыборкаСклад.Выбрать();
Пока ВыборкаСтрок.Следующий() Цикл
Сообщить(СтрШаблон(" %1: %2", ВыборкаСтрок.Товар, ВыборкаСтрок.Сумма));
КонецЦикла;
КонецЦикла;- 1Open the wizard
Right-click in a module →
Конструктор запроса…(Query wizard). If you also need code, chooseКонструктор запроса с обработкой результата…— it writes theЗапросobject and the loop as well. - 2Pick tables and fields
On the
Таблицы и поляtab drag tables and fields; set joins onСвязи, conditions onУсловия, and the rest onГруппировкаandПорядок. - 3Test 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
&ParameterandУстановитьПараметр. ЛЕВОЕ СОЕДИНЕНИЕ+ЕСТЬNULLis 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.