В какой последовательности могут идти ключевые слова в запросе 1с
Перейти к содержимому

В какой последовательности могут идти ключевые слова в запросе 1с

  • автор:

Язык запросов 1с — оператор Выбрать

Язык запросов 1С 8 — незаменимый инструмент для программиста 1С, он позволяет писать более лаконичный, простой, понятный код, использовать меньшее количество ресурсов системы при работе с данными. Данная статья открывает серию уроков, посвященных языку запросов 1С 8. На первом уроке мы рассмотри структуру главного оператора данного языка — ВЫБРАТЬ. При помощи этого оператора можно создавать выборки из таблиц базы данных. Выбранные данные таблиц можно сортировать, накладывать на них условия, связывать и объединять с данными других таблиц, группировать по различным полям и много другое.

Язык запросов 1с предприятия 8 — Структура оператора ВЫБРАТЬ

Рассмотрим структуру оператора ВЫБРАТЬ (в квадратных скобках указаны необязательные части оператора). Язык запросов 1С предоставляет широкий набор инструментов для создания выборок данных.

Ключевые слова и блоки работы с полями

  • ВЫБРАТЬ — ключевое слово обозначающее начало оператора;
  • РАЗРЕШЕННЫЕ указывает, что в выборку должны попадать записи таблиц, доступ на чтение к которым разрешен для данного пользователя;
  • РАЗЛИЧНЫЕ указывает, что в выборку должны попадать только различные (по всем полям) стоки. Иными словами, из выборки будут исключены повторяющиеся строки;
  • ПЕРВЫЕ A если указать данное ключевое слово, то в выборку попадут только первые A из выбранных запросом строк, где A — натуральное число;
  • Блок полей — в данном блоке указываются поля, которые необходимо включить в выборку. Эти поля будут случить столбцами выборки. В самом простом случае поле выглядит следующим образом:

Ключевые слова и блоки работы с таблицами

  • ПОМЕСТИТЬ ИмяВременнойТаблицы — ключевое слово ПОМЕСТИТЬ предназначено для создания временной таблицы с определенным именем, которая будет храниться в оперативной памяти в данном сеансе 1С 8, пока он не завершится или пока временная таблица не будет уничтожена. Следует заметить, что имена временных таблиц в одном сеансе 1С 8 не должны повторяться;
  • Блок таблиц и связей — в блоке указываются все таблицы используемые в данном запросе, а также связи между ними. Начинается блок с ключевого слова ИЗ, за ним следует имя и псевдоним первой таблицы. Если данная таблица связана с другими таблицами, то указываются связи. Язык запросов 1С содержит следующий набор типов связей:
    • ВНУТРЕННЕЕ СОЕДИНЕНИЕ — запись из левой таблицы попадет в выборку только при выполнении условия связи, запись из правой таблицы попадет в выборку только при выполнении условия связи;
    • ЛЕВОЕ СОЕДИНЕНИЕ — запись из левой таблицы попадет в выборку в любом случае, запись из правой таблицы попадет в выборку только при выполнении условия связи;
    • ПОЛНОЕ СОЕДИНЕНИЕ — запись из левой таблицы попадет в выборку сначала в любом случае, потом только при выполнении условия связи, запись из правой таблицы попадет в выборку сначала в любом случае, потом только при выполнении условия связи. При этом получившиеся в результате связи повторяющиеся строки исключаются из выборки.

    Ключевые слова и блоки преобразования данных

    • Блок группировок — данный блок служит для группировки строк таблицы. Строки объединяются в одну, если значения полей указанных после ключевого слова СГРУППИРОВАТЬ ПО оказываются одинаковыми. При этом все остальные поля суммируются, усредняются, максимизируются, либо минимизируются при помощи агрегатных функций. Агрегатные функции используют в блоке полей. Пример:
    • Блок условий — в данном блоке после ключевого слова ГДЕ указываются условные выражения разделенные логическими операторами И, ИЛИ, для того чтобы любая из выбранных строк попала в выборку, необходимо, чтобы все условия в совокупности имели значение Истина.
    • ОБЪЕДИНИТЬ ВСЕ — данное ключевое слово используется для объединения запросов (операторов ВЫБРАТЬ). Язык запросов 1С позволяет объединять несколько запросов в один. Для того, чтобы запросы можно было объединить у них должен быть одинаковый набор полей;
    • «;» — точка с запятой используется для разделения не зависимых друг от друга операторов ВЫБРАТЬ;
    • ИНДЕКСИРОВАТЬ ПО — ключевое слово используется для индексации полей указанных после него;
    • Блок итогов — используется для построения древовидных выборок. По каждому из группировочных полей, указанных после ключевого слова ПО, будет создана отдельная строка в выборке. В этой строке при помощи агрегатных функций будут посчитаны итоговые значения полей указанных после ключевого слова ИТОГИ.

    Хотите продолжить изучать язык запросов 1с 8? Тогда прочтите следующую статью: Программная работа с запросом в 1С 8

    Научитесь пользоваться конструктором запросов: Конструктор запросов 1С — обучение на примерах

    17 правил для составления оптимального ЗАПРОСа к данным базы 1С

    Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос. Создается этот объект вызовом конструкции Новый Запрос. Запрос удобно использовать, когда требуется получить сложную выборку данных, сгруппированную и отсортированную необходимым образом. Классический пример применения запроса — получение сводки по состоянию регистра накопления на определенный момент времени. Так же, механизм запросов позволяет легко получать информацию в различных временных разрезах.

    Текст запроса – это инструкция, в соответствии с которой должен быть выполнен запрос. В тексте запроса описывается:

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

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

    Язык запросов платформы 1С очень похож на синтаксис других SQL-языков, но имеются отличия. Основными преимуществами встроенного языка запросов являются: разыменование полей, наличие виртуальных таблиц, удобная работа с итогами, нетипизированные поля в запросах.

    Рекомендации по написанию запросов к базе данных на языке запросов платформы 1С:

    1) Текст запроса может содержать предопределенные данные конфигурации, такие как:

    • значения перечислений;
    • предопределенные данные:
    • справочников;
    • планов видов характеристик;
    • планов счетов;
    • планов видов расчетов;
    • пустые ссылки;
    • значения точек маршрута бизнес-процессов.

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

    Пример использования литерала ЗНАЧЕНИЕ:

    • ГДЕ Город = ЗНАЧЕНИЕ(Справочник.Города.Москва)
    • ГДЕ Город = ЗНАЧЕНИЕ(Справочник.Города.ПустаяСсылка)
    • ГДЕ ТипТовара = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)
    • ГДЕ ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
    • ГДЕ ТочкаМаршрута = ЗНАЧЕНИЕ(БизнесПроцесс.БизнесПроцесс1.ТочкаМаршрута.Действие1

    2) Использование инструкции АВТОУПОРЯДОЧИВАНИЕ в запросе может сильно время выполнения запроса, поэтому, если сортировка не требуется, то лучше вообще ее не использовать. Во большинстве случаях лучше всего применять сортировку с помощью инструкции УПОРЯДОЧИТЬ ПО.

    Автоупорядочивание работает по следующим принципам:

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

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

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

    4) Если в запросе имеется поле с составным типом, то для таких полей возникает необходимость привести значения поля к какому-либо определенному типу с помощью инструкции ВЫРАЗИТЬ, что позволит убрать лишние таблицы из левого соединения с полем составного типа данных и ускорить выполнение запроса. Пример:

    Имеется регистра накопления ОстаткиТоваров, у которого поле Регистратор имеет составной тип. В запросе выбираются Дата и Номер документов ПоступлениеТоваров, при этом при обращении к реквизитам документа через поле Регистратор не происходит множество левых соединений таблицы регистра накопления с таблицами документов-регистраторов.

    Если приведение типа считается не осуществимым, то результатом приведения типа будет значение NULL.

    5) Не стоит забывать про инструкцию РАЗРЕШЕННЫЕ, которая означает, что запрос выберет только те записи, на которые у текущего пользователя есть права. Если данное слово не указать, то в случае, когда запрос выберет записи, на которые у пользователя нет прав, запрос отработает с ошибкой.

    6) В случае, если в запросе используется объединение, и в некоторых частях объединения присутствуют вложенные таблицы (документ с табличной частью), а в некоторых нет, возникает необходимость дополнения списка выборки полями – пустыми вложенными таблицами. Делается это при помощи ключевого слова ПУСТАЯТАБЛИЦА, после которого в скобках указываются псевдонимы полей, из которых будет состоять вложенная таблица. Пример:

    7) Что бы в результат запроса не попали повторяющиеся строки, следует использовать инструкцию РАЗЛИЧНЫЕ, потому что так нагляднее и понятнее, а инструкция СГРУППИРОВАТЬ ПО применяется для группировки с помощью агрегатных функций. Ксати, при использовании агрегатных функций предложение СГРУППИРОВАТЬ ПО может быть и не указано совсем, при этом все результаты запроса будут сгруппированы в одну единственную строку. Пример:

    8) Инструкция СГРУППИРОВАТЬ ПО позволяет обращаться к полям верхнего уровня, без группировки результатов по этим полям, если агрегатные функции применены к полям вложенной таблицы. Хотя в справке 1С написано, при группировке результатов запроса в списке полей выборки обязательно должны быть указаны агрегатные функции, а помимо агрегатных функций в списке полей выборки допускается указывать только поля, по которым осуществляется группировка. Пример:

    9) Инструкция ЕСТЬNULL предназначена для замены значения NULL на другое значение, но не забываем, что второй параметр будет преобразован к типу первого в случае, если тип первого параметра является строкой или числом.

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

    Пример (поиск документов, содержащих в табличной части определенный товар):

    Преимущество этого запроса перед запросом к подчиненной таблице Приходная.Товары в том, что если есть дубли в документах, результат запроса вернет только уникальные документы без использования ключевого слова РАЗЛИЧНЫЕ.

    11) Интересный вариант оператора В — это проверка вхождения упорядоченного набора в множество таких наборов (Поле1, Поле2, . , ПолеN) В (Поле1, Поле2, . , ПолеN).

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

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

    Все виртуальные таблицы параметризованы, т. е. разработчику предоставляется возможность задать некоторые параметры, которые система будет использовать при формировании запроса создания виртуальной таблицы. В зависимости от того, какие параметры виртуальной таблицы указаны разработчиком, система может формировать РАЗЛИЧНЫЕ запросы для получения одной и той же виртуальной таблицы, причем они будут оптимизированы с точки зрения переданных параметров.

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

    13) В клиент-серверном варианте работы функция ПОДСТРОКА() реализуется при помощи функции SUBSTRING() соответствующего оператора SQL, передаваемого серверу баз данных SQL Server, который вычисляет тип результата функции SUBSTRING() по сложным правилам в зависимости от типа и значений ее параметров, а так же в зависимости от контекста, в котором она используется. В большинстве случаев эти правила не оказывают влияния на выполнение запроса, но бывают случаи, когда для выполнения запроса существенна максимальная длина строки результата, вычисленная SQL Server. Важно иметь в виду, что в некоторых контекстах использования функции ПОДСТРОКА() максимальная длина ее результата может оказаться равной максимальной длине строки ограниченной длины, которая в SQL Server равна 4000 символам. Это может привести к неожиданному аварийному завершению выполнения запроса:

    Microsoft OLE DB Provider for SQL Server: Warning: The query processor could not produce a query plan from the optimizer because the total length of all the columns in the GROUP BY or ORDER BY clause exceeds 8000 bytes.

    HRESULT=80040E14, SQLSTATE=42000, native=8618

    Чтобы избежать такой ошибки, не рекомендуют использовать функцию ПОДСТРОКА() с целью приведения строк неограниченной длины к строкам ограниченной длины. Вместо нее лучше использовать операцию приведения типа ВЫРАЗИТЬ().

    14) С осторожностью используйте ИЛИ в конструкции ГДЕ, так как использование условия с ИЛИ может значительно «утяжелить» запрос. Решить проблему можно конструкцией ОБЪЕДИНИТЬ ВСЕ. Пример:

    15) Условие НЕ В в конструкции ГДЕ увеличивает время исполнения запроса, так как это своего рода НЕ (ИЛИ1 ИЛИ2 . ИЛИn), поэтому для больших таблиц старайтесь использовать ЛЕВОЕ СОЕДИНЕНИЕ с условием ЕСТЬ NULL. Пример:

    16) При использовании Временных таблиц нужно индексировать поля условий и соединений в этих таблицах, НО, при использовании индексов запрос может выполняться еще медленнее. Поэтому необходимо анализировать каждый запрос с применением индекса и без, замерять скорость выполнения запроса и принимать окончательное решение.

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

    17) Если вы не используете Менеджер временных таблиц, то явно удалять временную таблицу не требуется, она будет удалена после завершения выполнения пакетного запроса, иначе следует удалить временную таблицу одним из способов: командой УНИЧТОЖИТЬ в запросе, вызвать метод МенеджерВременныхТаблиц.Закрыть().

    И в дополнении видео от Евгения Гилева : Типовые ошибки при написании запросов на 1С:

    Запросы

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

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

    Виды таблиц

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

    Если используется какое-либо условие при обращении к виртуальной таблице, необходимо указывать его в параметрах виртуальной таблицы, а не на закладке «Условия». Так как если указать условие в параметрах фильтр будет наложен в момент выполнения запроса к реальной таблице, а если указать в условии, то данные сначала будут получены, в полном объеме а уже потом наложен фильтр. В некоторых случаях такой запрос может оказаться просто "неподъемным" для сервера.

    Не следует переоценивать роль параметров виртуальной таблицы. Бывает начинающие разработчики разобравшись как устанавливаются параметры в виртуальных таблицах, начинают использовать их вместо реальных, даже когда в этом нет необходимости, объясняя это тем, что параметры виртуальной таблицы, работают быстро, а условие в запросе медленно. Так как обращение к виртуальной таблице, это все равно, сложный развернутый запрос к реальной таблице, то такой подход, конечно, не имеет смысла. Запрос объявляется следующим образом:

    Основной синтаксис языка запросов.

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

    Таблицы и поля

    Любой запрос начинается с выражения «Выбрать» или Select, далее следуют перечисление полей которые вы хотите видеть в запросе и источник откуда будут браться эти поля как в запросе выше, в качестве источника могут быть как таблицы базы данных, так и связи этих таблиц. Если в запросе создаются временные таблицы, после перечисления полей должно стоять ключевое слово "Поместить" и имя временной таблицы.

    Группировка строк запроса.

    При формировании запроса очень часто бывает необходимо "свернуть" данные запроса, то есть к примеру у нас в результате выборки получились такие записи

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

    Не следует путать группировку и итоги, что бы закрепить понимание, нужно запомнить, что в результате группировки записей будет или меньше, или столько же(если нет записей которые можно сгруппировать). Помимо функции Сумма, доступны и другие функции для группировки, полный список смотрите в конструкторе. Когда вы применяете группировку, поле должно либо быть группируемым(быть в верхней правой части на закладке "Группировка"), либо к нему должна применяться какая то агрегатная функция(поле должно быть в нижней части на закладке "Группировка"). При использовании других функций("количество различных" например) суммируемое поле, может быть не числовым. Пример запроса с группировкой

    Условие и параметры в запросе

    На результат выборки запроса, можно накладывать условия, которые могут быть достаточно разнообразными, в качестве условия могут выступать строковые или числовые константы, значения перечислений, предопределенные элементы справочников, подзапросы или любое значение переданное в параметре запроса. Для того, что бы указать, что выражение является параметром, перед ним указывают символ "&". За указание условия в запросе, отвечает секция "ГДЕ"

    Передать параметр в запрос, можно следующим образом:

    Псевдонимы

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

    Объединения

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

    Соединения

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

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

    Вложенные запросы

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

    Сортировка

    Если необходимо упорядочить результаты запроса, такое поведение, можно настроить на закладке конструктора Порядок , на этой закладке, можно перечислить список полей по которым нужно производить сортировку или можно в тексте запроса указать конструкцию "УПОРЯДОЧИТЬ ПО" и перечислить поля по которым необходимо производить сортировку. Также доступно выражение "АВТОУПОРЯДОЧИВАНИЕ", с помощью которого для ссылочных типов данных происходит сортировка по представлению ссылки.

    Тип данных NULL

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

    Использование функций

    Язык запросов обладает ограниченным набором функций, для обработки данных, так как считается, что запросы это средство для получения данных, а не для их обработки. Но необходимый минимум, все таки имеется. Например нет возможность получить дату без времени, но есть возможность привести дату к началу дня, месяца, года, с помощью функции, начало периода. Условный оператор тоже присутствует в виде функции "Выбор". Функция "Значение" позволяет в запросе получать значения перечислений, и к некоторым значениям системных перечислений(например вид движения регистра) или значений предопределенных значений справочника. Описание функций языка запросов, отсутствует во встроенном синтаксис помощнике, но его можно найти в справке которая находится в меню «Справка» или по кнопке F1. Там нужно открыть содержание справки (можно сразу его открывать из этого же меню, или по shift F1) и выбрать Встроенный язык – Работа с запросами – Синтаксис языка запросов – Ключевые слова и функции – Функции.

    Получение данных из табличных частей документов

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

    А вот так будет правильно:

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

    Язык запросов 1С 8.3 и 8.2 — краткое руководство по всем конструкциям

    Язык запросов является одним из основополагающих механизмов 1С 8.3 для разработчиков. При помощи запросов можно быстро получить любые данные, хранящиеся в базе. Его синтаксис очень похож на SQL, но есть и отличия.

    Основные достоинства языка запросов 1С 8.3 (8.2) перед SQL:

    • разыменование ссылочных полей (обращение черед одну или несколько точек к реквизитам объектов);
    • работа с итогами очень удобная;
    • возможность создавать виртуальные таблицы;
    • запрос можно писать как на английском, так и на русском языках;
    • возможность блокировать данные для исключения взаимных блокировок.

    Недостатки языка запросов в 1С:

    • в отличие от SQL, в 1С запросы не позволяют изменять данные;
    • отсутствие хранимых процедур;
    • невозможность преобразования строки в число.

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

    ВЫБРАТЬ (Select)

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

    В рассмотренном ниже примере выбираются наименования всей номенклатуры из справочника «Номенклатура». После слова «КАК» указываются псевдонимы (имена) для таблиц и полей.

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

    Рядом с командой «ВЫБРАТЬ» можно указать ключевые слова:

    • РАЗЛИЧНЫЕ. Запрос будет отбирать только отличающиеся хотя бы по одному полю строки (без дублей).
    • ПЕРВЫЕ n, где n – количество строк с начала результата, которые необходимо отобрать. Чаще всего такая конструкция используется совместно с сортировкой (УПОРЯДОЧИТЬ ПО). Например, когда нужно отобрать определенное количество последних по дате документов.
    • РАЗРЕШЕННЫЕ. Данная конструкция позволяет выбирать из базы только те записи, которые доступны текущему пользователю. Баз использования этого ключевого слова пользователю будет выведено сообщение об ошибке при попытке обращения запроса к тем записям, доступа к которым у него нет.

    Эти ключевые слова могут использоваться как все вместе, так и по отдельности.

    ДЛЯ ИЗМЕНЕНИЯ

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

    Чаще всего предложение «ДЛЯ ИЗМЕНЕНИЯ» используется при получении остатков. Ведь при одновременной работе нескольких пользователей в программе, пока один получает остатки, другой может их изменить. В таком случае полученный остаток будет уже не верен. Если же заблокировать данные этим предложением, то пока первый сотрудник не получит корректный остаток и не совершит с ним все необходимые манипуляции, второй сотрудник будет вынужден ждать.

    Получите понятные самоучители по 1С бесплатно:

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

    ГДЕ (WHERE)

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

    Ниже приведен пример запроса получения контактных лиц с определенной должностью. Параметр отбора имеет формат: &ИмяПараметра (имя параметра произвольное).

    ВЫБРАТЬ
    КонтактныеЛица.Ссылка
    ИЗ
    Справочник.КонтактныеЛица КАК КонтактныеЛица
    ГДЕ
    КонтактныеЛица.Должность = &ИмяПараметра

    ВЫБОР (CASE)

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

    В приведенном ниже примере «ДополнительноеПоле» будет содержать текст в зависимости от того проведен документ или нет:

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

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

    Соединения связывают две таблицы по определенному условию связи.

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

    Суть ЛЕВОГО соединения заключается в том, что полностью берется первая указанная таблица и к ней по условию связи привязывается вторая. Если записей, соответствующих первой таблице во второй не нашлось, то в качестве их значений подставляется NULL. Проще говоря, главной является первая указанная таблица и к её данным уже подставляются данные второй таблицы (если они есть).

    Например, необходимо получить номенклатурные позиции из документов «Поступление товаров и услуг» и цены из регистра сведений «Цены номенклатуры». В данном случае, если цена у какой-либо позиции не найдена, вместо нее подставиться NULL. Из документа все позиции будут выбраны вне зависимости от того, есть ли на них цена или нет.

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

    В ПРАВОМ все в точности да наоборот.

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

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

    При использовании в предыдущем примере полного соединения будут выбраны все позиции номенклатуры из документа «Поступление товаров и услуг» и все последние цены из регистра «Цены номенклатуры». Значения не найденных записей, как в первой, так и во второй таблице будут равняться NULL.

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

    Отличием ВНУТРЕННЕГО соединения от ПОЛНОГО является то, что если хотя бы в одной из таблиц не найдена запись, то запрос не выведет ее вообще. В результате будут выбраны только те номенклатурные позиции из документа «Поступление товаров и услуг», для которых в регистре сведений «Цены номенклатуры» есть записи, если в предыдущем примере заменить «ПОЛНОЕ» на «ВНУТРЕННЕЕ».

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

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

    Результатом следующего запроса будет список видов номенклатуры с максимальными ценами по ним.

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

    ИТОГИ

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

    Итоги можно подводить по всей таблице целиком (с использованием ключевого слова «ОБЩИЕ»), по нескольким полям, по полям с иерархической структурой (ключевые слова «ИЕРАРХИЯ», «ТОЛЬКО ИЕРАРХИЯ»). При подведении итогов не обязательно использовать агрегатные функции.

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

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

    ИМЕЮЩИЕ (HAVING)

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

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

    ВЫБРАТЬ
    Цены.Номенклатура.ВидНоменклатуры,
    МАКСИМУМ(Цены.Цена) КАК Цена
    ИЗ
    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
    СГРУППИРОВАТЬ ПО
    Цены.Номенклатура.ВидНоменклатуры
    ИМЕЮЩИЕ
    МАКСИМУМ(Цены.Цена) > 1000

    УПОРЯДОЧИТЬ ПО

    Оператор «УПОРЯДОЧИТЬ ПО» сортирует результат запроса. Для того, чтобы гарантированно выводить записи в постоянном порядке, используется АВТОУПОРЯДОЧИВАНИЕ. Примитивные типы сортируются по обычным правилам. Ссылочные типы сортируются по GUID.

    Пример получения списка сотрудников, отсортированного по наименованию:

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

    Прочие конструкции языка запросов 1С

    • ОБЪЕДИНИТЬ – результаты двух запросов в один.
    • ОБЪЕДИНИТЬ ВСЕ – аналог ОБЪЕДИНИТЬ, но без группировки одинаковых строк.
    • ПУСТАЯ ТАБЛИЦА – иногда используется при объединении запросов для указания пустой вложенной таблицы.
    • ПОМЕСТИТЬ – создает временную таблицу для оптимизации сложных запросов 1С. Такие запросы называются пакетными.

    Функции языка запросов

    • ПОДСТРОКА обрезает строку с определенной позиции на указанное количество символов.
    • ГОД…СЕКУНДА позволяют получить выбранное значение числового типа. Входным параметром является дата.
    • НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА используются при работе с датами. В качестве дополнительного параметра указывается тип периода (ДЕНЬ, МЕСЯЦ, ГОД и т. п.).
    • ДОБАВИТЬКДАТЕ позволяет прибавить или отнять от даты указанное время определенного типа (СЕКУНДА, МИНУТА, ДЕНЬ и т. п.).
    • РАЗНОСТЬДАТ определяет разницу между двумя датами с указанием типа выходного значения (ДЕНЬ, ГОД, МЕСЯЦ и т. п.).
    • ЕСТЬNULL заменяет отсутствующее значение на указанное выражение.
    • ПРЕДСТАВЛЕНИЕ и ПРЕДСТАВЛЕНИЕССЫЛКИ получают строковое представление указанного поля. Применяются для любых значений и только ссылочных соответственно.
    • ТИП, ТИПЗНАЧЕНИЯ используются для определения типа входного параметра.
    • ССЫЛКА является логическим оператором сравнения для типа значения реквизита.
    • ВЫРАЗИТЬ используется для преобразования значения к нужному типу.
    • ДАТАВРЕМЯ получает значение типа «Дата» из числовых значений (Год, Месяц, День, Час, Минута, Секунда).
    • ЗНАЧЕНИЕ в запросе 1С используется для указания предопределенных значений — справочников, перечислений, планов видов характеристик. Пример использования: «Где ЮрФизЛицо = Значение(Перечисление.ЮрФизЛица.ФизЛицо)«.

    Конструктор запросов

    Для создания запросов с 1С есть очень удобный встроенный механизм – конструктор запросов. Он содержит следующие основные вкладки:

    • «Таблицы и поля» — содержит поля, которые необходимо выбрать и их источники.
    • «Связи» — описывает условий для конструкции СОЕДИНЕНИЕ.
    • «Группировка» — содержит описание конструкций группировок и суммируемых полей по ним.
    • «Условия» — отвечает за отборы данных в запросе.
    • «Дополнительно» — дополнительные параметры запроса, такие как ключевые слова команды «ВЫБРАТЬ» и пр.
    • «Объединения/Псевдонимы» — указываются возможности объединения таблиц и задаются псевдонимы (конструкция «КАК»).
    • «Порядок» — отвечает за сортировку результата запросов.
    • «Итоги» — аналогична вкладке «Группировка», но применяется для конструкции «ИТОГИ».

    цены номенклатуры

    Текст самого запроса можно просмотреть, нажав в левом нижнем углу на кнопку «Запрос». В данной форме его можно откорректировать вручную или скопировать.

    текст запроса

    Консоль запросов

    Для быстрого просмотра результата запроса в режиме «Предприятие», либо отладки сложных запросов используется консоль запросов. В ней пишется текст запроса, устанавливаются параметры, и показывается его результат.

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

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