выбрать первые 0 что делает

Предложение ВЫБРАТЬ (SELECT) в языке запросов 1С:Предприятия 8

В данной статье рассмотрено предложение ВЫБРАТЬ, его место и роль в языке запросов 1С:Предприятия 8.

Предложение ВЫБРАТЬ является единственным обязательным элементом любого запроса, поэтому изучение языка запросов начинается именно с него. Основная цель предложения ВЫБРАТЬ заключается в том, чтобы указать поля выборки, которые должны попасть в результат запроса.

Ниже рассмотрены следующие темы:

Место предложения ВЫБРАТЬ в структуре запроса

Структуру запроса 1С:Предприятия 8 можно представить в виде следующей схемы:

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Из приведенной схемы можно сделать следующие выводы:

Примеры запросов с предложением ВЫБРАТЬ

1. Выборка всех полей (кроме виртуальных) из таблиц

Вместо перечисления списка полей можно указать звездочку («*») и тогда в результат запроса попадут все поля таблицы-источника, кроме виртуальных. Например:

//обращение к таблице справочника
ВЫБРАТЬ * ИЗ Справочник.Номенклатура

//обращение к таблице документа
ВЫБРАТЬ * ИЗ Документ.РасходныйКассовыйОрдер

//обращение к основной таблице регистра накопления
ВЫБРАТЬ * ИЗ РегистрНакопления.ПродажиКомпании

//обращение к виртуальной таблице регистра накопления
ВЫБРАТЬ * ИЗ РегистрНакопления.ПродажиКомпании.Обороты

Замечание: В языке запросов есть возможность обойтись без предложения ИЗ, если описание поля содержит полный путь к нему с указанием таблицы-источника, например,

//выборка всех невиртуальных полей из таблицы справочника
ВЫБРАТЬ Справочник.Номенклатура.*

//выборка определенных полей из таблицы справочника
ВЫБРАТЬ
Справочник.Номенклатура.Код,
Справочник.Номенклатура.Наименование,
Справочник.Номенклатура.Представление //виртуальное поле

2. Выборка только определенных полей из таблиц

Самым обычным способом является перечисление нескольких полей из таблицы-источника запроса, тогда только эти поля попадут в результат запроса.

//обращение к таблице справочника
ВЫБРАТЬ Код, Наименование, Артикул, СтранаПроисхождения
ИЗ Справочник.Номенклатура

//обращение к таблице документа
ВЫБРАТЬ Номер, Дата, ПодразделениеКомпании, СуммаДокумента
ИЗ Документ.РасходныйКассовыйОрдер

3. Виртуальные поля

Некоторые поля в таблицах-источниках виртуальные, например, поле «Представление» для таблицы справочника и документа, или поле «МоментВремени» для документа. Это значит, что они не хранятся в базе данных, а генерируются «на лету». Виртуальные поля не включаются в результат запроса, когда вместо списка полей указана звездочка («*»), их нужно указывать явно, например «ВЫБРАТЬ *, Представление ИЗ Справочник.Товары». Такое решение было принято для ускорения выполнения классического запроса «ВЫБРАТЬ * ИЗ. ». В этом случае не требуется генерировать представления для элементов справочников и документов, следовательно запросы будут выполняться быстрее.

//обращение к таблице справочника (выбрать два обычных поля и одно виртуальное)
ВЫБРАТЬ Код, Наименование, Представление
ИЗ Справочник.Номенклатура

//обращение к таблице документа (выбрать все невиртуальные поля и два виртуальных)
ВЫБРАТЬ *, Представление, МоментВремени
ИЗ Документ.РасходныйКассовыйОрдер

4. Разыменование ссылочных полей

В 1С:Предприятии 8 допускается обращение к свойствам объектов через одну или несколько точек, например, «Номенклатура.Поставщик.Страна». Это позволяет значительно упростить написание запросов. Рекомендуется всегда пользоваться разыменованием полей там, где это возможно, чтобы не усложнять запросы лишними конструкциями.

5. Псевдонимы полей (ключевое слово КАК / AS)

Для поля может быть назначен псевдоним с помощью ключевого слова КАК. Это позволяет обращаться к полю по псевдониму при указании итогов и порядка сортировки, а также при обходе выборки из результата запроса, например:

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

Ключевое слово КАК является необязательным, то есть вышеприведенный запрос можно записать так:

ВЫБРАТЬ
Ссылка Документ,
Ответственный МатериальноОтветственный
ИЗ Документ.АвансовыйОтчет

6. Обращение к табличной части как вложенной таблице

В этом случае поле результата запроса будет иметь тип РезультатЗапроса, то есть содержать вложенный результат запроса, сформированный на основе табличной части.

//получение табличной части как вложенной таблицы результата запроса
ВЫБРАТЬ Номер, Дата, Товары
ИЗ Документ.АвансовыйОтчет

//получение нескольких колонок табличной части как вложенной таблицы
ВЫБРАТЬ Номер, Дата, Товары.(Номенклатура, Количество)
ИЗ Документ.АвансовыйОтчет

Обратите внимание, что если выполнить следующий запрос, то в результате запроса будет две вложенные таблицы: в первой — одна колонка Номенклатура, а во второй — колонка Количество:

ВЫБРАТЬ Номер, Дата, Товары.Номенклатура, Товары.Количество
ИЗ Документ.АвансовыйОтчет

7. Обращение к табличной части как таблице-источнику

При таком способе обращения имя вложенной таблицы фигурирует в имени таблицы-источника (предложение ИЗ или полные имена полей) и в результате запроса нет вложенных таблиц.

//выборка всех полей из табличной части
ВЫБРАТЬ * ИЗ Документ.АвансовыйОтчет.Товары

// выборка определенных полей из табличной части
ВЫБРАТЬ Номенклатура, Количество, Цена, Сумма
ИЗ Документ.АвансовыйОтчет.Товары

//задание псевдонимов для полей табличной части
ВЫБРАТЬ Документ.АвансовыйОтчет.Товары.(Номенклатура, Сумма КАК СуммаПоСтроке)

//обращение к реквизитам документа и реквизитам табличной части (поле Ссылка)
ВЫБРАТЬ
Ссылка.Номер, Ссылка.Дата, Ссылка.Ответственный, //реквизиты документа
Номенклатура, Количество, Цена, Сумма //реквизиты табличной части
ИЗ Документ.АвансовыйОтчет.Товары

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

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

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

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

Данное ключевое слово позволяет ограничить выборку несколькими первыми записями. Часто это ключевое слово применяется в комбинации с сортировкой (предложение УПОРЯДОЧИТЬ ПО).

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

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

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

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

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

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

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

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

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

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

Таким образом, предложение ВЫБРАТЬ является важнейшим элементом языка запросов, поскольку позволяет указать требуемые поля результата запроса. Гибкие возможности предложения ВЫБРАТЬ позволяют использовать язык запросов для решения самых разнообразных задач.

Источник

Подзапросы с Выбрать Первые

Часто нужно использовать аналог Выбрать первые отсортированные по нескольким полям. Нашел решение такое

ВЫБРАТЬ ПЕРВЫЕ 1000
РеализацияТоваровУслуг.Ссылка,
ВложенныйЗапрос.НомерСтроки
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
РеализацияТоваровУслугТовары.Ссылка КАК Ссылка,
РеализацияТоваровУслугТовары.НомерСтроки КАК НомерСтроки
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
(РеализацияТоваровУслугТовары.Ссылка, РеализацияТоваровУслугТовары.НомерСтроки) В
(ВЫБРАТЬ ПЕРВЫЕ 1
Док.Ссылка,
Док.НомерСтроки КАК НомерСтроки
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Док
ГДЕ
Док.Ссылка = РеализацияТоваровУслугТовары.Ссылка
УПОРЯДОЧИТЬ ПО
НомерСтроки УБЫВ,Количество УБЫВ)) КАК ВложенныйЗапрос
ПО РеализацияТоваровУслуг.Ссылка = ВложенныйЗапрос.Ссылка

УПОРЯДОЧИТЬ ПО
РеализацияТоваровУслуг.Дата

Что трансформируется в

SELECT TOP 1000
_Document196_Q_000_T_001._IDRRef AS f_2,
#V8TblAli1_Q_000_T_002._Q_001_F_001 AS f_3,
_Document196_Q_000_T_001._Date_Time AS _sf_1
FROM
_Document196 _Document196_Q_000_T_001 WITH(NOLOCK)
LEFT OUTER JOIN (
SELECT
_Document196_VT4933_Q_001_T_001._Document196_IDRRef AS _Q_001_F_000RRef,
_Document196_VT4933_Q_001_T_001._LineNo4934 AS _Q_001_F_001
FROM
_Document196_VT4933 _Document196_VT4933_Q_001_T_001 WITH(NOLOCK)
WHERE
EXISTS(
SELECT
CAST(1 AS NUMERIC(1,0)) AS f_1
FROM
(
SELECT TOP 1
_Document196_VT4933_Q_002_T_001._Document196_IDRRef AS _Q_002_F_000RRef,
_Document196_VT4933_Q_002_T_001._LineNo4934 AS _Q_002_F_001
FROM
_Document196_VT4933 _Document196_VT4933_Q_002_T_001 WITH(NOLOCK)
WHERE
_Document196_VT4933_Q_002_T_001._Document196_IDRRef = _Document196_VT4933_Q_001_T_001._Document196_IDRRef
ORDER BY
_Document196_VT4933_Q_002_T_001._LineNo4934 DESC,
_Document196_VT4933_Q_002_T_001._Fld4938 DESC
) #V8TblAli1
WHERE
_Document196_VT4933_Q_001_T_001._Document196_IDRRef = #V8TblAli1._Q_002_F_000RRef AND _Document196_VT4933_Q_001_T_001._LineNo4934 = #V8TblAli1._Q_002_F_001)
) #V8TblAli1_Q_000_T_002
ON _Document196_Q_000_T_001._IDRRef = #V8TblAli1_Q_000_T_002._Q_001_F_000RRef
ORDER BY
_Document196_Q_000_T_001._Date_Time

Но выполняется очень долго. Может есть более эффетивное решение

Источник

Описание языка запросов 1С 8

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

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

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

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

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

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

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

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

ВЫБРАТЬ (SELECT)

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

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

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

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

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

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

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

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

ВЫБОР (CASE)

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

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

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

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

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

ГДЕ (WHERE)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ИМЕЮЩИЕ (HAVING)

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

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

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

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

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

ЗНАЧЕНИЕ()

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

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

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

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

ТИП в запросе

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

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

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

ВЫРАЗИТЬ()

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

Синтаксис: ВЫРАЗИТЬ( КАК )

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

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

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

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

ЕСТЬNULL (ISNULL)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

Рубрикатор статей сайта по запросам

Видеокурс по 1С

Если вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые виде):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Источник

Запросы 1С 8 от А до Я

Что такое язык запросов

Язык запросов в 1С 8 — это упрощенный аналог широко известного «структурированного языка программирования» (как чаще его называют, SQL). Но в 1С он используется только для чтения данных, для изменения данных применяется объектная модель данных.

Еще одно интересное отличие языка запросов 1С – русский синтаксис. Хотя на самом деле Вы можете использовать и англоязычные конструкции.

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

Данный запрос позволит увидеть нам информацию о наименовании и корреспондентском счете всех существующих в базе данных банков.

Язык запросов – самой простой и эффективный способ получения информации. Как видно из примера выше, в языке запросов нужно апеллировать именами метаданных (метаданные в 1С 8.3 – это список объектов системы, из которых состоит конфигурация, т.е справочники, документы, регистры и т.д.).

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

Структура запросов

Для получения данных достаточно использовать конструкции «ВЫБРАТЬ» (select) и «ИЗ» (from). Простейший запрос выглядит следующим образом:

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

Где «*» означает выбор всех полей таблицы, а Справочники.Номенклатура – имя таблицы в базе данных.

Рассмотрим более сложный и общий пример:

В данном запросе мы выбираем данные полей «ИмяПоля1» и «ИмяПоля1» из таблиц «ИмяТаблицы1» и «ИмяТаблицы», присваиваем полям синонимы с помощью оператора «КАК», соединяем их по некому условию «УсловиеСоединениеТаблиц».

Из полученных данных мы отбираем только данные, соответствующие условию из «ГДЕ» «УсловиеОтбораДанных».Далее мы группируем запрос по полю «ИмяПоля1», при этом суммируя «ИмяПоля2».Создаём итоги по полю «ИмяПоля1» и итоговым полем «ИмяПоля2».

Последним действием мы сортируем запрос с помощью конструкции «УПОРЯДОЧИТЬ ПО».

Общие конструкции

Рассмотрим общие конструкции языка запросов 1С.

ПЕРВЫЕ n

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

ВЫБРАТЬ ПЕРВЫЕ 100
Банки.Наименование,
Банки.Код КАК БИК
ИЗ
Справочник.Банки КАК Банки
УПОРЯДОЧИТЬ ПО
Банки.Наименование

Запросом будет получено первых 100 записей справочника «Банки», упорядоченных по алфавиту.

РАЗРЕШЕННЫЕ

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

Если пользователь пытается с помощью запроса прочитать записи недоступные ему, он получит сообщение об ошибке. Чтобы этого избежать, следует использовать конструкцию «РАЗРЕШЕННЫЕ», т.е запрос будет читать только разрешенные ему записи.

ВЫБРАТЬ РАЗРЕШЕННЫЕ
ХранилищеДополнительнойИнформации.Ссылка
ИЗ
Справочник.ХранилищеДополнительнойИнформации

РАЗЛИЧНЫЕ

Использование «РАЗЛИЧНЫЕ» позволит исключить попадание строк-дублей в результат запроса 1С. Дублирование означает совпадение всех полей запроса.

ВЫБРАТЬ ПЕРВЫЕ 100
Банки.Наименование,
Банки.Код КАК БИК
ИЗ
Справочник.Банки КАК Банки

ПустаяТаблица

Данная конструкция используется очень редко для объединения запросов. При объединении может возникнуть необходимость указать в одной из таблиц пустую вложенную таблицу. Для этого как раз подойдет оператор «ПустаяТаблица»

Пример из справки 1С 8:

ВЫБРАТЬ Ссылка.Номер, ПУСТАЯТАБЛИЦА.(Ном, Тов, Кол) КАК Состав
ИЗ Документ.РасхНакл
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Ссылка.Номер, Состав.(НомерСтроки, Товар, Количество)
ИЗ Документ.РасхНакл Документ.РасходнаяНакладная.Состав.*

ЕСТЬNULL

Очень полезная функция, которая позволяет избежать многих ошибок. ЕстьNULL() позволяет заменить значение NULL на нужное. Очень часто используется в проверках на наличие значения в присоединенных таблицах, например:

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

Можно использовать и по-другому. Например, если для каждой строки не известно, в какой таблице существует значение:

КАК – оператор, который позволяет нам присвоить имя (синоним) таблицы или полю. Пример использования мы видели выше.

ПРЕДСТАВЛЕНИЕ и ПРЕДСТАВЛЕНИЕССЫЛКИ

Данные конструкции очень похожи – они позволяют получить строковое представление нужного значения. Единственное отличие в том, что ПРЕДСТАВЛЕНИЕ преобразует любые значения в строковый тип, а ПРЕДСТАВЛЕНИЕССЫЛКИ — только ссылочные. ПРЕДСТАВЛЕНИЕССЫЛКИ рекомендуется применять в запросах системы компоновки данных для оптимизации, если, конечно, поле ссылочных данных не планируется использовать в отборах отчета на СКД.

ВЫБРАТЬ
Представление(Ссылка), //строка, например «Авансовый отчет №123 от 10.10.2015
Представление(ПометкаУдаления) КАК ПометкаУдаленияТекст, //строка, «Да» или «Нет»
ПредставлениеСсылки(ПометкаУдаления) КАК ПометкаУдаленияБулево //булево, Истина или Ложь
ИЗ
Документ.АвансовыйОтчет

ВЫРАЗИТЬ

Выразить позволяет преобразовать значения поля к нужному типу данных. Можно преобразовать значение как к примитивному типу, так и к ссылочному типу.

Выразить для ссылочного типа используется для ограничения запрашиваемых типов данных в полях составного типа, часто используется для оптимизации работы системы. Пример:

ВЫРАЗИТЬ(ТаблицаЗатрат.Субконто1 КАК Справочник.СтатьиЗатрат).ВидДеятельностиДляНалоговогоУчетаЗатрат

Для примитивных типов эта функция часто используется для ограничения количества символов в полях неограниченной длины (с такими полями нельзя сравнивать). Чтобы избежать ошибки «Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов
», необходимо выразить такие поля следующим образом:

РАЗНОСТЬДАТ

Оператор РазностьДат позволяет узнать разницу между двумя датами. В функции три параметра: Первая дата, Вторая дата, Тип получаемого результата. Тип результата может принимать значения: Секунда, Минута, Час, День, Декада, Месяц, Квартал, Полугодие, Год.

РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1962, 04, 16, 00, 00, 00), ДАТАВРЕМЯ(2014, 06, 01, 00, 00, 00), ДЕНЬ) // получим 19039 дней
РАЗНОСТЬДАТ(ДАТАВРЕМЯ(1962, 04, 16, 00, 00, 00), ДАТАВРЕМЯ(2014, 06, 01, 00, 00, 00), ДЕНЬ) // или 626 месяцев

ДОБАВИТЬКДАТЕ

ДОБАВИТЬКДАТЕ позволяет прибавлять или вычитать время из указанного выражения. Синтаксис: Дата, Тип вычитания/прибавления, Количество. Тип вычитания/прибавления: Секунда, Минута, Час, День, Декада, Месяц, Квартал, Полугодие, Год. Если из даты необходимо вычесть, используется «Количество» с минусом

НАЧАЛОПЕРИОДА … КОНЕЦПЕРИОДА

С помощью этих функций можно получить конец или начало периода по указанному типу. Параметры: Дата, Тип периода. Тип периода: Минута, Час, День, Декада, Месяц, Квартал, Полугодие, Год.

НачалоПериода(ДАТАВРЕМЯ(1962, 04, 16, 22, 33, 00), День), // получим начало дня

НачалоПериода(ДАТАВРЕМЯ(1962, 04, 16, 22, 33, 00), Год), // 01.01.1962

СЕКУНДА … ГОД

С помощью этих операторов можно получить временное значение конкретного типа из поля типа «Дата». Возвращаемое значение имеет тип «Число». Бывают функции: Секунда, Минута, Час, День, ДеньНедели, ДеньГода, Декада, Месяц, Квартал, Полугодие, Год.

Год(ДАТАВРЕМЯ(1962, 04, 16, 00, 00, 00)), //1962
ДеньГода(ДАТАВРЕМЯ(1962, 04, 16, 00, 00, 00)), // 106

ПОДСТРОКА

Аналог функции Сред() из объектной модели. Она позволяет выделить подстроку из исходной строки. Синтаксис: Исходная строка, Позиция символа, с которого начинается выделение, Сколько символов выделяется. Если длина строки меньше, чем указана во втором параметра, то функция вернет пустую строку.

Пример использования функции ПОДСТРОКА в запросе 1С:

ПОДСТРОКА(«Лопата»,2,3) // «лопата» превращается в «опа»

ВЫБОР КОГДА … ИНАЧЕ … КОНЕЦ

Очень полезная функция, которая позволяет прописать прямо в запросе условия. Функция часто может помочь, когда необходимо в запросе менять значение поля в зависимости от других полей.

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

Отборы

Как правило, из всех полученных данных в запросе нам необходимо меньше 1% информации. Чтобы не обрабатывать все записи, необходимо установить отборы только по нужным нам условиям.

В языке запросов 1С 8 используется следующие ограничения для получаемых данных:

Конструкция «ГДЕ»

В обычном случае для отборов используется конструкция «ГДЕ». Например:

ВЫБРАТЬ * ИЗ Справочник.Номенклатура ГДЕ (Наименование = «Лопата» И Услуга = Истина)

После «где» необходимо установить Задать логическое условие, по которому необходимо отобрать строки.

Если говорить грубо, программа обходит все строки таблицы и сравнивает их с условием. Если для строки логическое выражение после «ГДЕ» равно Истина, то такая запись нам подходит, и мы выведем её в результате запроса 1С.

«ГДЕ» не следует использовать для виртуальных таблиц запроса. Это грубейшая ошибка с точки зрения оптимизации. Для них используются специальные отборы виртуальных таблиц.

Отборы в виртуальных таблицах

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

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

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

В тексте запроса это выглядит так:

ВЫБРАТЬ
ВзаиморасчетыССотрудникамиОстатки.Сотрудник,
ВзаиморасчетыССотрудникамиОстатки.СуммаВзаиморасчетовОстаток
ИЗ
РегистрНакопления.ВзаиморасчетыССотрудниками.Остатки(
&Дата,
Организация = &Организация И Сотрудник В (&СписокСотрудников)) КАК ВзаиморасчетыССотрудникамиОстатки

ИМЕЮЩИЕ

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

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

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

Логические выражения

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

ВЫБРАТЬ
НоменклатураСпр.Ссылка,
ЕстьNULL(ОстаткиТовара.КоличествоОстаток,0) КАК КоличествоОстаток
ИЗ
Справочник.Номенклатура КАК НоменклатураСпр
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ОстаткиТовара
ПО (НоменклатураСпр.Ссылка = РеализованныеТоварыКомитентовОстатки.Номенклатура)
ГДЕ
(НоменклатураСпр.Услуга = Истина И ОстаткиТовара.КоличествоОстаток > 10)

В данном запросе логические операции подчеркнуты.

Это классические математические операции сравнения: равно, больше, меньше. Символы «<>» означают НЕ равно, его также можно заменить на приставку «НЕ».

ГДЕ
(НоменклатураСпр.Услуга <> Истина И И ОстаткиТовара.КоличествоОстаток > 10)

ГДЕ
(НЕ НоменклатураСпр.Услуга = Истина И И ОстаткиТовара.КоличествоОстаток > 10)

В, В ИЕРАРХИИ

Конструкция «В» позволяет сравнить значения поля с произвольным списком значения, массива или другого запроса. Если поле присутствует в указанном списке, выражение вернет ИСТИНА. Примеры:

НоменклатураСпр.Наименование В («Лопата», «Грабли», «Совок»)

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

НоменклатураСпр.Наименование В (&СписокНаименований)

«В ИЕРАРХИИ» — конструкция, которой нет аналогов в обычном языке SQL. Она проверяет принадлежность значения к вложенной иерархии.

НоменклатураСпр.Ссылка В (&Группа)

МЕЖДУ

Оператор «МЕЖДУ» позволяет определить вхождение значения в какой-то интервал.

НоменклатураСпр.ЦенаНоменклатуры МЕЖДУ 10 И 100

Такое условие отберет нам номенклатуру с ценой от 10 до 100.

ПОДОБНО

Подобно – аналог LIKE из языка запросов SQL. С помощью «ПОДОБНО» можно сравнить строковые значения по частичному вхождению или маске.

Служебные символы для шаблонов:

ЕСТЬ NULL

Оператор ЕСТЬ NULL (или IS NULL) сравнивает значение с типом NULL. В языке запросов нельзя использовать сравнение вида «Поле = NULL», так как подобная конструкция будет работать в разных СУБД по-разному. Связано это с не типизированным значением NULL в различных СУБД (особенности работы разных СУБД для 1С).

Пример использования ЕСТЬ NULL в запросе 1С:

ВЫБРАТЬ * ИЗ
Справочник.Номенклатура КАК НоменклатураСпр
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ОстаткиТовара
ПО НоменклатураСпр.Ссылка = РеализованныеТоварыКомитентовОстатки.Номенклатура
ГДЕ НЕ ОстаткиТовара.КоличествоОстаток ЕСТЬ NULL

ТИПЗНАЧЕНИЯ, ТИП, ССЫЛКА

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

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

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

Предопределенные значения

Помимо использования в запросах переданных параметров в языке запросов 1С можно использовать предопределенные значения или пустые ссылки. Например, перечисления, предопределенные справочники, планы счетов и так далее.Для этого используется конструкция «Значение()».

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

ГДЕ Контрагенты.ВидКонтактнойИнформации = Значение(Перечисление.ВидыКонтактнойИнформации.Телефон)

ГДЕ ОстаткиПоСчетам.СчетУчета = Значение(ПланСчетов.Хозрасчетный.ПрибылиУбытки)

Соединения

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Объединения

Конструкция ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ объединяет два результата запроса в один. Т.е. результат выполнения двух запросов будет «слит» в один, общий.

Пример запроса для вывода всех документов поступлений и реализации:

ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПоступлениеТоваровУслуг.Ссылка
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг

Запрос получит данные из двух таблиц и объединит их.

ОБЪЕДИНИТЬ часто используется для оптимизации запросов, чтобы заменить оператор «ИЛИ» в условии запроса на несколько объединенных запросов (подробнее в главе «Оптимизация запросов»).

Разница между ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ

Конструкция ОБЪЕДИНИТЬ соединяет два результата и группирует повторяющие строки, в отличие от ОБЪЕДИНИТЬ ВСЕ, которая не группирует автоматически строки результата.

Настоятельно рекомендуется использовать ОБЪЕДИНИТЬ ВСЕ в запросах, где заведомо невозможно получение одинаковых строк. Это существенно повышает производительность – система не пытается группировать строки.

Индексация полей запросов

Индексация в запросе нужна для ускорения формирования результата запроса. Как это работает? Система строит индекс для временной таблицы, чтобы быстрее найти нужное значение (подробнее – индексы в 1С).

Т.е система работает точно так же, как и обычные индексы 1С, только для временной таблицы.

Как использовать ИНДЕКСИРОВАТЬ ПО

Конструкцию рекомендуется использовать по полям временных таблиц, по которым эта временная таблица будет соединяться с другими таблицами баз данных. Это существенно повышает скорость выполнения соединения таблиц.

Однако следует учесть один момент. Построение индекса временной таблицы также требует времени на выполнение. Поэтому целесообразно использовать конструкцию ”ИНДЕКСИРОВАТЬ ПО”, только если точно известно, что во временной таблице будет не 1-2 записи. В противном случае эффект может быть обратным – быстродействие от индексированных полей не компенсирует времени построения индекса.

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

Группировка

Язык запросов 1С позволяет использовать специальные агрегатные функции при группировке результатов запросов. Группировку можно также использовать без агрегатных функций, для «устранения» дублей.

Существуют следующие функции:

Сумма, Количество, Количество разных, Максимум, Минимум, Среднее.

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

Запрос получает все строки с товарами и суммирует их по количеству и суммам в разрезе номенклатуры.

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

Данный пример отобразит список БИКов справочника «Банки» и покажет, сколько дублей существует по каждому из них.

Итоги

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

Один из самых популярных способов использования итогов в практике – партионное списание товаров.

ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровУслугТовары.Ссылка КАК Документ,
РеализацияТоваровУслугТовары.Количество КАК Количество,
РеализацияТоваровУслугТовары.Сумма КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
УПОРЯДОЧИТЬ ПО
РеализацияТоваровУслугТовары.Ссылка.Дата
ИТОГИ
СУММА(Количество),
СУММА(Сумма)
ПО
Номенклатура

В результате запроса получится следующее иерархическое дерево значений:

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Общие итоги

Если необходимо получить итоги по всем «итогам», используйте оператор «ОБЩИЕ».

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

В результате выполнения запроса получим следующий результат:

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

В котором 1 уровень группировки – агрегирование всех нужных полей.

Упорядочивание

Оператор УПОРЯДОЧИТЬ ПО используется для сортировки результата запроса.

Сортировка для примитивных типов (строка, число, булево) происходит по обычным правилам. Для полей ссылочных типов сортировка происходит по внутреннему представлению ссылки (уникальный идентификатор), а не по коду или по представлению ссылки.

ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Наименование

Запрос выведет список наименований справочника номенклатуры, отсортированного по алфавиту.

Автоупорядочивание

Результат запроса без сортировки представляет собой хаотично представленный набор строк. Разработчики платформы 1С не гарантируют вывод строк в одинаковой последовательности при выполнении одинаковых запросов.

Если необходимо выводить записи таблицы в постоянном порядке, необходимо использовать конструкцию «Автоупорядочивание».

ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
АВТОУПОРЯДОЧИВАНИЕ

Виртуальные таблицы

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

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

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

ВЫБРАТЬ
ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток,
ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот,
ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход,
ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход,
ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты КАК ТоварыНаСкладахОстаткиИОбороты

Такой запрос позволяет быстро получить большое количество данных.

Параметры виртуальных таблиц

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

Для таких таблиц считается неверным использования отбора в конструкции «ГДЕ». Помимо того, что запрос становится не оптимальным, возможно получение неверных данных.

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

РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Месяц, ДвиженияИГраницыПериода, Номенклатура = &НужнаяНоменклатура)

Алгоритм работы виртуальных таблиц

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

При использовании виртуальной таблицы система проделывает следующие манипуляции:

Такие простые действия могут существенно повысить производительность системы в целом.

Использование конструктора запросов

Конструктор запросов – инструмент, встроенный в систему 1С предприятие, существенно облегчающий разработку запросов к базе данных.

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Конструктор запроса имеет достаточно простой, интуитивно понятный интерфейс. Тем не менее рассмотрим применение конструктора запроса подробнее.

Запуск конструктора текста запроса производится контекстным меню (правой кнопкой мыши) в нужном месте программного кода.

Описание конструктора запроса 1С

Рассмотрим каждую вкладку конструктора подробнее. Исключение – вкладка Построитель, это тема для отдельного разговора.

Вкладка Таблицы и поля

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

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

В контекстном меню виртуальных таблиц можно задать параметры виртуальной таблицы:

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Вкладка Связи

Вкладка служит для описания соединений нескольких таблиц, создает конструкции со словом СОЕДИНЕНИЕ.

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Вкладка Группировка

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

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Вкладка Условия

Отвечает за всё, что идёт в тексте запроса после конструкции ГДЕ, т.е за все условия, накладываемые на получаемые данные.

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Вкладка Дополнительно

Вкладка Дополнительно изобилует всевозможными параметрами, которые являются очень важными. Рассмотрим каждое из свойств.

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Группировка Выборка записей:

Группировка Тип запроса определяет, какой будет тип запроса: выборка данных, создание временной таблицы или же уничтожение временной таблицы.

Ниже существует флаг Блокировать полученные данные для последующего изменения. Он позволяет включить возможность установки блокировки данных, которая обеспечивает сохранность данных от момента их чтения до изменения (актуально только для Автоматического режима блокировок, конструкция ДЛЯ ИЗМЕНЕНИЯ).

Вкладка Объединения/Псевдонимы

На этой вкладке конструктора запросов устанавливается возможность объединения разных таблиц и псевдонимов(конструкция КАК). В левой части указываются таблицы. Если установить флаги напротив таблицы, будет использоваться конструкция ОБЪЕДИНИТЬ, иначе – ОБЪЕДИНИТЬ ВСЕ (отличия двух способов тут). В правой части указываются соответствия полей в разных таблицах, если соответствие не указано, запрос будет возвращать NULL.

Вкладка Порядок

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Здесь указывается порядок сортировки значений (УПОРЯДОЧИТЬ ПО) – по убыванию (УБЫВ) или возрастанию(ВОЗР).

Также есть интересный флаг – Автоупорядочивание (в запросе – АВТОУПОРЯДОЧИВАНИЕ). По умолчанию система 1С выводит данные в “хаотичном” порядке. Если установить этот флаг, система будет сортировать данные по внутренним данным.

Вкладка Пакет запросов

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

На вкладке конструктора запросов можно создавать новые пакеты запросов, а также использовать её в роли навигации. В тексте запроса пакеты разделяются символом “;”(точка запятая).

Кнопка “Запрос” в конструкторе запросов

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

В данном окне можно внести коррективы в запрос и выполнить его.

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Использование консоли запросов

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

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Рассмотрим этот инструмент подробнее.

Скачать консоль запросов 1С

Первым делом, чтобы начать работу с консолью запросов, её нужно откуда-то скачать. Обработки обычно делятся на два вида – на управляемых формах и обычных (или, иногда, их называют на 8.1 и на 8.2/8.3).

Я постарался объединить эти два вида в одной обработке – в нужном режиме работы открывается нужная форма (в управляемом режиме консоль работает только в толстом режиме).

Авторство обработок не наше, мы лишь объединили 2 наиболее удачные, на наш взгляд, консоли.

Описание консоли запросов 1С

Начнем рассмотрение консоли запросов с описания главной панели обработки:

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

В шапке консоли запросов можно увидеть время выполнения последнего запроса с точностью до миллисекунды, это позволяет сравнивать разные конструкции по производительности.

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

Слева, в поле “Запрос”, можно создавать новые запросы и сохранять их в древовидной структуре. Вторая группа кнопок как раз отвечает за управление списком запросов. С помощью неё можно создать, скопировать, удалить, переместить запрос.

Далее идут кнопки, отвечающие за инициализацию запроса:

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Позволяют установить текущие параметры для запроса.

В окне параметров запроса интересно следующее:

Задать параметр списком значений очень просто, достаточно при выборе значения параметра нажать на кнопку очистки значения (крестик), система предложит выбрать тип данных, где надо выбрать “Список значения”:

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Также в верхней панели очень есть кнопка вызова настроек консоли запросов:

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Здесь можно указать параметры автосохранения запросов и параметры выполнения запроса.

В поле запроса консоли заносится текст запроса. Сделать это можно простым набором теста запроса или же вызовом специального инструмента – конструктора запросов.

Конструктор запроса 1С 8 вызывается из контекстного меню (правая кнопка мыши) при нажатии на поле ввода:

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Также в этом меню есть такие полезные функции, как очистка или добавление в запрос символов переноса строки (“|”) или же получения кода запроса вот в таком удобном виде:

Запрос = Новый Запрос;
Запрос.Текст = ”
|ВЫБРАТЬ
| Валюты.Ссылка
|ИЗ
| Справочник.Валюты КАК Валюты”;
РезультатЗапроса = Запрос.Выполнить();

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

выбрать первые 0 что делает. Смотреть фото выбрать первые 0 что делает. Смотреть картинку выбрать первые 0 что делает. Картинка про выбрать первые 0 что делает. Фото выбрать первые 0 что делает

Также консоль запросов кроме списка умеет отображать данные в виде дерева — для запросов, содержащих итоги.

Оптимизация запросов

Одним из важнейших пунктов в повышении производительности работы 1С предприятия 8.3 является оптимизация запросов. Этот пункт также очень важен при сдаче аттестации 1С- Эксперт по технологическим вопросам. Ниже пойдет речь о типичных причинах не оптимальной работы запросов и способах из оптимизации.

Отборы в виртуальной таблице с помощью конструкции ГДЕ

Накладывать фильтры на реквизиты виртуальной таблицы необходимо только через параметры ВТ. Ни в коем случае для отбора в виртуальной таблице нельзя использовать конструкцию ГДЕ, это грубейшая ошибка с точки зрения оптимизации. В случае с отбором с помощью ГДЕ по факту система получит ВСЕ записи и только потом отберет нужные.

ПРАВИЛЬНО:

ВЫБРАТЬ
ВзаиморасчетыСДепонентамиОрганизацийОстатки.СуммаОстаток
ИЗ
РегистрНакопления.ВзаиморасчетыСДепонентамиОрганизаций.Остатки(
,
Организация = &Организация
И Физлицо = &Физлицо) КАК ВзаиморасчетыСДепонентамиОрганизацийОстатки

НЕПРАВИЛЬНО:

ВЫБРАТЬ
ВзаиморасчетыСДепонентамиОрганизацийОстатки.СуммаОстаток
ИЗ
РегистрНакопления.ВзаиморасчетыСДепонентамиОрганизаций.Остатки(, ) КАК ВзаиморасчетыСДепонентамиОрганизацийОстатки
ГДЕ
ВзаиморасчетыСДепонентамиОрганизацийОстатки.Организация = &Организация
И ВзаиморасчетыСДепонентамиОрганизацийОстатки.Физлицо = &Физлицо

Получение значения поля составного типа через точку

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

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

НЕПРАВИЛЬНО:

ВЫБРАТЬ
НаборЗаписей.Регистратор.Дата,
НаборЗаписей.Количество
ИЗ
РегистрНакопления.ТоварыОрганизации КАК НаборЗаписей

Т.е по факту вот такой запрос будет обращаться не к одной таблице, а к 22 таблицам базы данных ( у этого регистра 21 тип регистратора).

1С рекомендует экспертам в таком случае для оптимизации пожертвовать размером хранимых данных в пользу производительности или универсальностью кода ради производительности:

ПРАВИЛЬНО:

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

Либо второй вариант – добавление такой информации в реквизит, например, в нашем случае – добавление даты.

ПРАВИЛЬНО:

ВЫБРАТЬ
ТоварыОрганизаций.Дата,
ТоварыОрганизаций.Количество
ИЗ
РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций

Подзапросы в условии соединения

Для оптимизации недопустимо использовать подзапросы в условиях соединения, это существенно замедляет работу запроса. Желательно в таких случаях использовать ВТ. Для соединения нужно использовать только объекты метаданных и ВТ, предварительно проиндексировав их по полям соединения.

НЕПРАВИЛЬНО:

ВЫБРАТЬ …
ИЗ Документ.РеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ ИЗ РегистрСведений.Лимиты
ГДЕ …
СГРУППИРОВАТЬ ПО …
) ПО …

ПРАВИЛЬНО:

ВЫБРАТЬ …
ПОМЕСТИТЬ Лимиты
ИЗ РегистрСведений.Лимиты
ГДЕ …
СГРУППИРОВАТЬ ПО …
ИНДЕКСИРОВАТЬ ПО …;

ВЫБРАТЬ …
ИЗ Документ.РеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ Лимиты
ПО …;

Соединение записей с виртуальными таблицами

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

Использование отборов по не индексируемым полям

Одна из самых распространенных ошибок при составления запросов – использование условий по не индексируемым полям, это противоречит правилам оптимизации запросов. СУБД не может выполнить запрос оптимально, если в запросе накладывается отбор по неиндексируемым полям. Если же берется временная таблица – также необходимо индексировать поля соединения.

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

Если СУБД не подобрал правильные индексы, то будет просканирована таблица полностью – это очень негативно скажется на производительности и может привести к продолжительной блокировке всего набора записей.

Использование логического ИЛИ в условиях

Настоятельно не рекомендуется злоупотреблять в условиях запросов конструкцией “ИЛИ”.

Вот и всё, в данной статье были освещены основы аспекты оптимизации запросов, которые должен знать каждый эксперт 1С.

Очень полезный бесплатный видеокурс по разработке и оптимизации запросов, категорически рекомендую новичкам и не только!

Другие статьи по 1С:

Если вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *