Описание языка запросов 1С 8
Язык запросов 1С — одно из основных отличий между версиями 7.7 и 8. Одним из важнейших пунктов в изучении 1С-программирования является язык запросов. В 1С 8.3 запросы — самый мощный и эффективный инструмент получения данных. Язык запросов позволяет в удобном виде получать информацию из базы данных.
Сам синтаксис очень сильно напоминает классический T-SQL, за исключением того, что в 1С с помощью языка запросов можно только получать данные, используя конструкцию Выбрать(select). Язык поддерживает и более сложные конструкции, например, вложенные запросы (запрос в запросе). Запросы в 1С 8 можно составлять как на кириллице, так и на латинице.
В статье я постараюсь рассказать про основные ключевые слова в языке запросов 1С:
- выбрать
- разрешенные
- различные
- выразить
- первые
- для изменения
- значение
- тип значения (и оператор ССЫЛКА)
- выбор
- сгруппировать по
- имеющие
- ЕСТЬNULL
- Есть NULL
- соединения — правые, левые, внутренние, полные.
А так же небольшие хитрости языка 1С, применяя которые вы сможете оптимально построить текст запроса.
Для отладки запросов в системе 1С предусмотрен специальный инструмент — консоль запросов. Увидеть описание и скачать его можно по ссылке — консоль запросов 1C.
Содержание
Основные конструкции языка запросов
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Рассмотрим самые важные и интересные операторы языка запросов 1С.
ВЫБРАТЬ (SELECT)
В языке запросов 1С предприятия 8 любой запрос начинается с ключевого слова ВЫБРАТЬ. В языке 1С нет конструкций UPDATE, DELETE, CREATE TABLE, INSERT, эти манипуляции производятся в объектной технике. Предназначение его — только чтение данных.
Например:
ВЫБРАТЬ
ТекущийСправочник.Наименование
ИЗ
Справочник.Номенклатура КАК ТекущийСправочник
Запрос вернёт таблицу с наименованиями номенклатуры.
Рядом с конструкцией ВЫБРАТЬ можно встретить ключевые слова ДЛЯ ИЗМЕНЕНИЯ, РАЗРЕШЕННЫЕ, РАЗЛИЧНЫЕ, ПЕРВЫЕ …
ДЛЯ ИЗМЕНЕНИЯ — блокирует записи таблицы на время транзакции (не актуально для управляемых блокировок). Подробнее в статье ДЛЯ ИЗМЕНЕНИЯ в запросах 1С.
РАЗРЕШЕННЫЕ — выбирает только записи из таблицы, на которые есть права у текущего пользователя.
РАЗЛИЧНЫЕ — означает, что в результат не попадет дублирующих строк.
ПЕРВЫЕ n — в языке 1С 8.3 запрос отберет только n первых записей.
ВЫБОР (CASE)
Очень часто данная конструкция недооценивается программистами. Пример её использования:
ВЫБРАТЬ
ТекущийСправочник.Наименование,
ВЫБОР
КОГДА ТекущийСправочник.Услуга ТОГДА
«Услуга»
ИНАЧЕ
«Товар»
КОНЕЦ КАК ВидНоменклатуры
ИЗ
Справочник.Номенклатура КАК ТекущийСправочник
Пример возвратит в поле «ВидНоменклатуры» текстовое значение — «Товар» или «Услуга».
ГДЕ (WHERE)
Конструкция языка запросов 1C, позволяющая наложить отбор на получаемые данные. Учтите, что от сервера система получает все данные, а только потом они отбираются по данному параметру.
Пример:
ВЫБРАТЬ
Справочник.Наименование
ИЗ
ТекущийСправочник.Номенклатура КАК ТекущийСправочник
ГДЕ ТекущийСправочник.Услуга = ИСТИНА
В примере мы отбираем записи, у которых значение реквизита «Услуга» установлено в положение «Истина». В данном примере можно было бы обойтись и таким условием:
«ГДЕ Услуга»
По сути, мы отбираем строки, у которых выражение после ключевого слова равно «Истина».
В выражениях можно использовать прямые условия:
ГДЕ Код = «005215»
С помощью оператора «ЗНАЧЕНИЕ()» в условиях использовать обращение к предопределенным элементам и перечислениям в запросе 1С:
ГДЕ ТипНоменклатуры= Значение(Перечисление.ТипыНоменклатуры.Товар)
Значения времени могут указываться следующим образом:
ГДЕ ДатаПоступления > ДАТАВРЕМЯ(2012,01,01):
Чаще всего условия указываются в виде параметров, передаваемых в запрос:
ГДЕ НоменклатурнаяГруппа= &НоменклатурнаяГруппа
Условие можно наложить на тип реквизита, если он составного типа:
ГДЕ РегистрНакопления.Регистратор ССЫЛКА Документ.ПоступленияТоваров
Если необходимо ограничивать отбор из списка значений или массива, можно поступить следующим образом:
ГДЕ РегистрНакопления.Регистратор В (&СписокДокументовДляОтбора)
Условие может быть и сложное, состоящее из нескольких условий:
ГДЕ ДатаПоступления > ДАТАВРЕМЯ(2012,01,01) И НоменклатурнаяГруппа= &НоменклатурнаяГруппа И НЕ Услуга
СГРУППИРОВАТЬ ПО (GROUP BY)
Конструкция языка запросов 1С, используемая для группировки результата.
Например:
ВЫБРАТЬ
ПоступлениеТоваровУслугTовары.Товар,
СУММА(ПоступлениеТоваровУслугTовары.Количество) КАК Количество,
СУММА(ПоступлениеТоваровУслугTовары.Сумма) КАК Сумма
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугTоварыСГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугTовары.Товар
Данный запрос просуммирует все поступления по сумме и количеству в разрезе номенклатуры.
Помимо ключевого слова СУММА можно использовать другие агрегатные функции: КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗНЫХ, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ.
ИМЕЮЩИЕ (HAVING)
Конструкция, о которой часто забывают, но она очень важна и полезна. Она позволяет указать отбор в виде агрегатной функции, этого нельзя сделать в конструкции ГДЕ.
Пример использования ИМЕЮЩИЕ в запросе 1С:
ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.Товар,
СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК Количество,
СУММА(ПоступлениеТоваровУслугТовары.Сумма) КАК Сумма
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТоварыСГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугТовары.товарИМЕЮЩИЕ
СУММА(ПоступлениеТоваровУслугТовары.Количество) > 5
Так мы отберем количество товаров, которых поступило более 5 штук.
ЗНАЧЕНИЕ()
В запросе 1C ЗНАЧЕНИЕ () можно использовать для указания предопределенных значений, таких как значения перечисления, пустую ссылку или значение предопределенного элемента (справочника, плана счетов, ПВХ и т.д).
Например:
ГДЕ Банк = Значение(Справочник.Банки.ПустаяСсылка)
или
ГДЕ ВидНоменклатуры = Значение(Справочник.ВидыНоменклатуры.Товар)
или
ГДЕ ТипНоменклатуры= Значение(Перечисление.ТипыНоменклатуры.Услуга)
ТИП в запросе
Тип данных можно проверить следующим образом: с помощью функций ТИП() и ТИПЗНАЧЕНИЯ() или с помощью логического оператора ССЫЛКА.
Пример:
ГДЕ ТИПЗНАЧЕНИЯ(Проект.Ссылка) <> ТИП(Справочник.Проект)
или
ГДЕ Проект.Ссылка ССЫЛКА Справочник.Проект
ВЫРАЗИТЬ()
Оператор Выразить в запросах 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С 8.3
- Дата в запросах 1С
- Округление в запросе 1С 8
- Несовместимые типы ВЫРАЗИТЬ в запросе 1С
- Остаток от деления в 1С 8
- Особенность РАЗРЕШЕННЫЕ в запросах 1С 8.3
- Тип не может быть выбран в запросе в 1С 8.3
- Запрос к таблице значений в 1С 8.3
- РазностьДат в запросах 1С 8.3
- Оператор ПОДОБНО и служебные символы
- ДЛЯ ИЗМЕНЕНИЯ в запросах 1С 8
- Описание конструктора запросов 1С
- Как пользоваться консолью запросов 1С
- Вложенные запросы в 1С Предприятие 8.3
- Использование ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ в языке запросов 1С
- Проверка на пустой результат запроса 1С
- Найти битые ссылки запросом 1С и не только
- Пустая ссылка, дата или строка в запросе 1С 8.3
- Оптимизация запросов в 1С 8.3
Видеокурс по 1С
Если вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые виде):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
СПРОСИТЕ в комментариях!
Алексей:
Забыли про внутреннее соединение в запросе
Программист 1С:
Спасибо огромное, как это я так… 🙂
Исправил)
Алексей:
В соединениях наверное все-таки не
ПО
Клиенты.Наименование = Банки.Наименование, а
ПО
Клиенты.Банк.Наименование = Банки.Наименование
Кирилл:
Нет:)
Там в примере такая задумка: вывести контрагентов с таким же названием как банк
Shadow:
Нет, скорее он имел ввиду, что клиент — это банк, а не как думаете Вы , что банк у клиента равен Банк.Наименование
Михаил:
Простенько и со вкусом, приятный пост можно развить тему использования консоли запросов а потом конструктора, получится весьма интересный сет статей.
Программист 1С:
Спасибо за комментарий и очень дельный совет!
В ближайшее время добавлю эти статьи
Snik:
Знание языка запросов обязательно для 1с-ника! Спасибо
Денис:
Огромное спасибо, искал ресурс для изучения 8ки, наконец нашел, все кратко, просто, лаконично!!!
В примере
ВЫБРАТЬ
ПоступлениеТоварвУслугTовары.Товар,
СУММА(ПоступлениеТоварвУслугTовары.Количество) КАК Количество,
СУММА(ПоступлениеТоварвУслугTовары.Сумма) КАК Сумма
…
Не работает, у меня заработало при смене
ПоступлениеТоварвУслугTовары.Товар на ПоступлениеТоварвУслугTовары.Номенклатура
Еще раз большое спасибо!!!
Программист 1С:
Спасибо за тёплые слова, приходите почаще 🙂
Просто у нас разные конфигурации — у меня позиция товара называется «Товар», а у вас — номенклатура 🙂
Денис:
Так точно, примеры отрабатываю на Бухгалтерии 2.0 🙂
Дмитрий:
Спасибо, в меру кратко и очень понятно
Программист 1С:
Временно явление — тестируем, через день-два уберем.
Спасибо за отзыв! 🙂
Кирилл:
ПЕРВЫЕ n — в языке 1С 8.3 — n есть возможность указать параметрически?
esqado:
Да, если текст запроса собирается динамически.
G.P.:
Ничего не сказали про сортировку результатов запроса и слово УПОРЯДОЧИТЬ
G.P.:
А в целом статья отличная, мне как новичку подошла для изучения азов.
Слава:
Добрый день! Вот кусок запроса из консоли отчетов:
…
ИЗ
Документ.ЗаказПокупателя.Товары КАК ЗаказПокупателяТовары
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ПО (ЗаказПокупателяТовары.Ссылка = РеализацияТоваровУслугТовары.Ссылка.Сделка)
И (ЗаказПокупателяТовары.Номенклатура = РеализацияТоваровУслугТовары.Номенклатура)
и как бы я ни манипулировал СОЕДИНЕНИЯМИ — в отчете не отображаются те товары, которые есть в Заказе, но отсутствуют в Реализации.
Какой смысл имеют скобки после ПО? — они то появляются, то исчезают. А в таблице связей Конструктора кроме «В…» и «П…» ни черта не видно — хоть на 3 экрана расширь!
Спасибо.
Владислав:
Убедитесь что поле выбирается из таблицы заказов
(ВЫБРАТЬ ЗаказПокупателяТовары.Товар…)
Аноним:
добрый вечер, помогите написать формулу наценки товара от его цены, в 7ке вроде было так ?([ЦенаПоступления]>=100 и [ЦенаПоступления]=200 и [ЦенаПоступления]=300 и [ЦенаПоступления]<400,[ЦенаПоступления]*1.3,
[ЦенаПоступления]*1.2)))
в 8.3 пробую пробую, читал смотрел ничего не понял и не нашел!
заранее спасибо!
esqado:
Вам необходимо использовать конструкцию выбор когда
Александр:
При установки параметров в консоли запросов выдает ошибку. Индекс находится за границами массива
liptan:
Что означает условие «ГДЕ ИСТИНА» в запросе:
ВЫБРАТЬ
Банки.Ссылка
ИЗ
Справочник.Банки КАК Банки
ГДЕ
ИСТИНА
Нет ни в одном описании языка запросов.
esqado:
Ничего не значит.Поставьте ложь — посмотрите результат.
Влад:
Можно ли запросом выбрать строки справочника, в наименовании которых есть определенное слово, например: «Цемент»?
Влад:
Разобрался сам…
ГДЕ Спр.Наименование ПОДОБНО %Цемент%
или
ГДЕ Спр.Наименование ПОДОБНО «%»+&Наименование+»%»
Вероника:
как в запросе выбрать несколько значений из справочника (где справочник.Наименование 1 значение, 2 значение…)