Описание языка запросов 1С 8
Язык запросов 1С — одно из основных отличий между версиями 7.7 и 8. Одним из важнейших пунктов в изучении 1С-программирования является язык запросов. В 1С 8.3 запросы — самый мощный и эффективный инструмент получения данных. Язык запросов позволяет в удобном виде получать информацию из базы данных.
Сам синтаксис очень сильно напоминает классический T-SQL, за исключением того, что в 1С с помощью языка запросов можно только получать данные, используя конструкцию Выбрать(select). Язык поддерживает и более сложные конструкции, например, вложенные запросы (запрос в запросе). Запросы в 1С 8 можно составлять как на кириллице, так и на латинице.
В статье я постараюсь рассказать про основные ключевые слова в языке запросов 1С:
А так же небольшие хитрости языка 1С, применяя которые вы сможете оптимально построить текст запроса.
Для отладки запросов в системе 1С предусмотрен специальный инструмент — консоль запросов. Увидеть описание и скачать его можно по ссылке — консоль запросов 1C.
Основные конструкции языка запросов
Рассмотрим самые важные и интересные операторы языка запросов 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с язык запросов между
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: операторы МЕЖДУ и В
Автор уроков и преподаватель школы: Владимир Милькин
Логический оператор МЕЖДУ
Таким образом, вместо
можно написать более лаконичное
А результат будет один и тот же:
Если же необходимо наоборот выбрать всю еду, калорийность которой не входит в диапазон [200;300], то подойдёт следующая форма отрицания (появилась частица НЕ):
Оператор МЕЖДУ можно применять не только к числовым диапазонам. С датами он также хорошо работает:
Логический оператор В
Проверка совпадения с одним из перечисленных
Таким образом, вместо
можно написать более лаконичное
А результат будет один и тот же:
Если же необходимо наоборот выбрать всю еду, цвет которой не совпадает ни с одним значением из списка, то подойдёт следующая форма отрицания (появилась частица НЕ):
Проверка совпадения значения с одним из результата запроса
Пусть нам требуется выбрать из базы только те цвета, которые присутствуют в описании еды. Таким образом, в отобранном списке не должен присутствовать, например, чёрный цвет, так как еды чёрного цвета в нашей базе нет. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
В качестве отступления упомяну, что из внутреннего запроса есть возможность обращаться к полям внешнего запроса.
Опять же, для этой формы оператора В, также доступно использование частицы НЕ перед ним.
Проверка принадлежности по иерархии для справочников
Для справочников проверка может осуществляться и на принадлежность по иерархии.
Для начала давайте рассмотрим пример иерархического справочника. Откройте справочник «Города» в нашей базе:
Группы отличаются от обычных элементов тем, что могут включать в себя другие группы и элементы. Подобно тому как папки включают в себя другие папки и файлы.
Чтобы просмотреть содержимое группы, сделайте на ней двойной щелчок мышкой:
Чтобы выйти на уровень выше, снова сделайте двойной щелчок по группе:
Таким образом иерархический справочник может содержать как обычные элементы (например, Рио-де-Жанейро, Салвадор), так и группы (например, Бразилия, Индия). Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь.
У каждого элемента (будь то группа или обычный элемент) может быть родитель. Например, родителем элемента Рио-де-Жанейро является группа Бразилия:
И это верно, потому что Рио-де-Жанейро входит в состав группы Бразилия в иерархии справочника:
Теперь давайте напишем такой запрос, который будет запрашивать выбранную группу-страну и все элементы-города, входящие в неё.
После того, как мы вставим этот запрос в консоль и нажмем кнопку «Выполнить» для обновления, у нас появится возможность задать этот параметр:
Выберите в качестве его значения группу «Россия» (кнопка Выбрать):
Если теперь мы нажмём кнопку «Выполнить», то результат запроса будет следующим:
В результат запроса попала сама группа (Россия) и все элементы, которые входят в её состав (Пермь, Красноярск и Воронеж).
Если вместо России, выбрать «Бразилия», то результат будет таким:
Таким образом результатом оператора В ИЕРАРХИИ будет ИСТИНА, если значение выражения слева является ссылкой на элемент справочника и входит во множество значений справа (Бразилия) или иерархически принадлежит какой-нибудь группе, содержащейся в этом множестве (Сан-Паулу, Рио-де-Жанейро, Салвадор).
В качестве множества значений, на совпадение с которыми выполняется проверка, может фигурировать и результат запроса. В этом случае справа от оператора В необходимо указать описание запроса:
Для оператора В ИЕРАРХИИ также доступно использование частицы НЕ перед ним.
Источник
Все функции и конструкции языка запросов 1С 8.2 и 1с 8.3
В этой статье мы хотим обсудить с Вами все функции языка запросов 1с, а также конструкции языка запросов. Чем же отличается функция от конструкции? Функция вызывается со скобками и возможными параметрами в них, а конструкция пишется без скобок. Безусловно все конструкции и функции языка запросов 1с делают процесс получения данных гибким и многофункциональным. Данные функции и конструкции применимы к полям запроса, а некоторые также применимы в условиях.
Функции языка запросов 1с
Поскольку понятное описание функций языка запросов 1с встречается намного реже, чем описание конструкций, мы решили начать рассматривать именно функции. Теперь давайте разберем каждую по отдельности, описав ее назначение, синтаксис и пример использования, итак:
Синтаксис: ВЫБОР КОГДА ТОГДА ИНАЧЕ КОНЕЦ
Синтаксис: ВЫРАЗИТЬ(НазваниеПоля КАК НазваниеТипа)
Еще есть вариант использования функции ВЫРАЗИТЬ в полях смешанных типах, где такие встречаются? Самый простой пример это «Регистратор» у любого регистра. Так зачем нам может понадобиться уточнять тип в регистраторе? Давайте рассмотрим ситуацию когда мы из регистратора выбираем поле «Номер», из какой таблицы будет выбран номер? Правильный ответ из всех! Поэтому чтобы наш запрос работал быстро следует указывать явный тип с помощью функции ВЫРАЗИТЬ
Также отметим что тип NULL желательно ВСЕГДА заменять на какое-то значение, т.к. сравнение с типом NULL всегда дает ЛОЖЬ даже если вы сравниваете NULL с NULL. Чаще всего значения NULL образуются в результате соединения таблиц (все виды соединений кроме внутреннего).
Конструкции в языке запросов 1с
Выше мы рассмотрели с Вами функции языка запросов 1с, теперь пришло время рассмотреть конструкции в языке запросов 1с, они не менее важны и полезны, приступаем.
Синтаксис: В( ), В ИЕРАРХИИ( )
Варианты шаблона строки:
Синтаксис: РАЗРЕШЕННЫЕ пишется после ключевого слова ВЫБРАТЬ
Синтаксис: РАЗЛИЧНЫЕ пишется после ключевого слова ВЫБРАТЬ
Также Конструкция РАЗЛИЧНЫЕ может использоваться с оператором РАЗРЕШЕННЫЕ и другими операторами.
Синтаксис: ДЛЯ ИЗМЕНЕНИЯ
Синтаксис: УПОРЯДОЧИТЬ ПО АВТОУПОРЯДОЧИВАНИЕ
Синтаксис: ИНДЕКСИРОВАТЬ ПО
Синтаксис: ИТОГИ ПО
На рисунке обведены группировки которые образовались в ходе выполнения запроса, самая верхняя относится к секции ОБЩИЕ, а вторая к полю ДоговорКонтрагентаВидДоговора.
Источник
Функции языка запросов 1С. Работа с датами
Функции работы с датами
Дата — один из примитивных типов данных в системе 1С:Предприятие. Дата всегда имеет формат год, месяц, день, час, минута, секунда. Таким образом, переменная типа дата содержит не только дату, но и время.
Одной из первых моих статей в этой рубрике была небольшая шпаргалка по работе с датами, но о датах в запросах там было написано очень мало. В запросах 1С с датами приходится работать довольно часто, особенно когда запрос строится к объектам метаданных в которых содержится периодическая информация. Как правило это регистры (сведений, накопления, расчета, бухгалтерии).
Функция Год
Функция Квартал
Возвращает номер квартала даты (целочисленное значение от 1 до 4)
Предположим, в ЗаказПокупателя передаем заказ №100 от 12.03.2016, в этом случае наш запрос вернет НомерКвартала = 1
Функция Месяц
Принимает параметр типа ДАТА. Возвращает номер месяца даты (целочисленное значение от 1 до 12).
Функция ДеньГода
Принимает параметр типа ДАТА. Возвращает номер дня в году (целочисленное значение от 1 до 366).
Запрос вернет — 175
Функция День
Принимает параметр типа ДАТА. Возвращает номер дня в месяце (целочисленное значение от 1 до 31).
Функция Неделя
Принимает параметр типа ДАТА. Возвращает номер недели в году.
Функция ДеньНедели
Принимает параметр типа ДАТА. Возвращает номер дня недели (целочисленной значение от 1 (понедельник) до 7 (воскресенье)).
Функция Час
Принимает параметр типа ДАТА. Возвращает час суток (целочисленное значение от 0 до 23).
Функция Минута
Принимает параметр типа ДАТА. Возвращает минуты часа (целочисленное значение от 0 до 59).
Функция Секунда
Принимает параметр типа ДАТА. Возвращает секунды минуты (целочисленное значение от 0 до 59).
Функция НачалоПериода
Функция возвращает для указанной даты начало периода в который она входит. Период может принимать следующие значения: МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ
Запрос вернет – 01.06.2016
Функция КонецПериода
Функция возвращает для указанной даты конец периода в который она входит. Период может принимать следующие значения: МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ
Запрос вернет – 30.06.2016
Функция ДобавитьКДате
Функция добавляет к дате указанное количество временных интервалов.
Получаем дату 15.10.2016 0:00:00 Очень удобно, что не приходится задумываться о количестве дней в месяцах.
Количество может быть и отрицательным. Тогда отсчет интервала производится в обратную сторону.
Функция РазностьДат
Функция рассчитывает календарную разницу между двумя датами и ее нельзя использовать в местах, где необходимо рассчитать банковских или рабочих дней. Тип может принимать следующие значения: МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ
Источник
1с язык запросов между
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: условный оператор
Автор уроков и преподаватель школы: Владимир Милькин
Условный оператор в запросе
Давайте напишем запрос, который получает названия и калорийность еды:
А теперь добавим в результат запроса колонку, в которую будем выводить жирность еды по следующим правилам:
Как этого можно добиться, ведь в таблице Справочник.Еда нет колонки Жирность?
Оказывается, эту колонку мы можем добавить сами, используя условный оператор внутри запроса:
Давайте внимательнее присмотримся к тексту запроса:
В секции ВЫБРАТЬ идёт перечисление полей выборки: Наименование, Калорийность, а затем вместо третьего поля идёт конструкция условного оператора, результат которого и попадает в третью колонку.
Поэтому новый запрос вернёт такую таблицу:
Отступление
Обратите внимание, что третья колонка в таблице, которую вернул запрос, называется Поле1. Это имя было сгенерировано системой автоматически, потому что третьей колонке не соответствует никакого реального поля в таблице Справочник.Еда, откуда можно было бы это имя получить.
Псевдонимы можно присваивать любым полям, в том числе тем, у которых уже есть имя. Давайте сделаем псевдоним Еда для поля Наименование:
Но вернёмся к условному оператору в запросах.
Более сложные логические выражения в условиях оператора
В логических условиях оператора выбора можно использовать и более сложные выражения.
Пример использования логического оператора ПОДОБНО:
Пример использования функции ПОДСТРОКА:
Более сложные результаты условного оператора
Конечно, результатом условного оператора может быть не только константная строка, но и любое другое выражение, допустимое в запросе.
Источник