1с 8.3 синтаксис написания запросов. Создание и работа с запросами (для начинающих). Работа с пакетными запросами

Подписаться
Вступай в сообщество «page-electric.ru»!
ВКонтакте:

Данная статья рассчитана на читателей, которые знакомы с языком SQL.

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

Ниже представлена таблица соответствия основных операторов языка запросов и SQL:

Операторы языка запросов 1С

Оператор SQL

РАЗЛИЧНЫЕ

СОЕДИНЕНИЕ

СГРУППИРОВАТЬ ПО

ОБЪЕДИНИТЬ

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

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

Выполнение запроса 1С из программного кода осуществляется при помощи объекта встроенного языка «Запрос». Пример написания запроса к базе данных с использованием встроенного языка программирования:

Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Синоним.Ссылка КАК Ссылка |ИЗ | Справочник.Справочник1 КАК Синоним"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл // Вставить обработку выборки ВыборкаДетальныеЗаписи КонецЦикла;

Метод «Выполнить» выполняет запрос, метод «Выбрать» возвращает значение типа «ВыборкаИзРезультатаЗапроса». Также можно использовать метод «Выгрузить», который возвращает таблицу значений.

Параметры запроса хранятся в свойстве «Параметры» (в данном случае это структура, поэтому все методы структуры тут применимы – вставить, удалить и т.д.).

Пример установки параметра «Запрос.Параметры.Вставить» («Справочник», СправочникСсылка). В запросе обратиться к параметрам можно через амперсанд «&Справочник». Ниже пример запроса с использованием параметров:

Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Пользователи.Ссылка КАК Ссылка, | Пользователи.Родитель КАК Родитель, | Пользователи.Наименование КАК Наименование |ИЗ | Справочник.Пользователи КАК Пользователи |ГДЕ | Пользователи.Ссылка = &Справочник"; Запрос.Параметры.Вставить("Справочник", СправочникСсылка); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл // Вставить обработку выборки ВыборкаДетальныеЗаписи КонецЦикла;

Напомним, что язык запросов предназначен только для чтения данных из базы, поэтому в нем отсутствуют аналоги таких операторов SQL, как INS ERT и UPDATE. Данные можно модифицировать только через объектную модель встроенного языка программирования 1С. Также в языке запросов 1С существуют операторы, аналогов которых нет в SQL, например:

  • В ИЕРАРХИИ
  • ПОМЕСТИТЬ
  • ИНДЕКСИРОВАТЬ ПО

В ИЕРАРХИИ – позволяет выбрать все элементы иерархического справочника, которые входят в иерархию переданной ссылки. Пример запроса с использованием В ИЕРАРХИИ :

ВЫБРАТЬ Товары.Ссылка, Товары.Артикул ИЗ Справочник.Товары КАК Товары ГДЕ Товары.Ссылка В ИЕРАРХИИ(&Цитрусовые)"

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

Также, к примеру, стоит задача найти товар с именем «Ручка». Товар должен входить в иерархию «Канц. Товаров», то есть нам не надо искать дверную ручку. Структура номенклатуры в этом случае такова:

Канцелярия

|_ Ручки перьевые |_ Ручка красная |_ Ручка синяя |_ Ручки чернильные |_ Линейки

Фурнитура

|_ Ручки дверные |_ Ручка дверная простая |_ Ручка дверная люкс

Пишем такой запрос:

ВЫБРАТЬ Товары.Ссылка, Товары.Артикул ИЗ Справочник.Товары КАК Товары ГДЕ Товары.Наименование Подобно "Ручка%" И Товары.Ссылка В ИЕРАРХИИ(&Канцелярия)"

При использовании конструкции В ИЕРАРХИИ необходимо учитывать, что если в параметр «Канцелярия» передать пустую ссылку, выполнение запроса замедлится, так как платформа будет проверять каждый элемент на принадлежность корню.

ПОМЕСТИТЬ – Данный оператор помещает результат во временную таблицу. Пример запроса:

ВЫБРАТЬ Пользователи.Ссылка КАК Ссылка, Пользователи.Родитель КАК Родитель, Пользователи.Наименование КАК Наименование ПОМЕСТИТЬ ОтобранныеПользователи ИЗ Справочник.Пользователи КАК Пользователи ГДЕ Пользователи.Ссылка = &Справочник; ВЫБРАТЬ ОтобранныеПользователи.Ссылка КАК Ссылка, ОтобранныеПользователи.Родитель КАК Родитель, ОтобранныеПользователи.Наименование КАК Наименование ИЗ ОтобранныеПользователи КАК ОтобранныеПользователи

Данный запрос на SQL будет выполнен несколькими запросами:

  • Создание временной таблицы (платформа умеет «переиспользовать» ранее созданные временные таблицы, поэтому создание происходит не всегда);
  • Помещение данных во временную таблицу;
  • Выполнение основного запроса, а именно SEL ECT из этой временной таблицы;
  • Уничтожение/очистка временной таблицы.

Временная таблица может быть уничтожена явно, через конструкцию УНИЧТОЖИТЬ , либо неявно – при закрытии менеджера временных таблиц.

У объекта «Запрос» встроенного языка программирования есть свойство «МенеджерВременныхТаблиц», которое предназначено для работы с временными таблицами. Пример кода:

МВТ = Новый МенеджерВременныхТаблиц(); Запрос = Новый Запрос; Запрос.МенеджерВременныхТаблиц = МВТ;

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

МВТ.Закрыть();

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

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

Бесплатная консультация эксперта

Спасибо за Ваше обращение!

Специалист 1С свяжется с вами в течение 15 минут.

Особенности некоторых операторов языка запросов

ДЛЯ ИЗМЕНЕНИЯ – данный оператор предназначен для блокировки определенной таблицы запроса (или всех таблиц, которые участвуют в запросе). Блокировка осуществляется наложением U блокировки на таблицу. На SQL это реализуется через hint UPDLOCK. Данная конструкция необходима для предотвращения блокировок типа deadlock. Пример запроса с конструкцией ДЛЯ ИЗМЕНЕНИЯ:

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

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



СОЕДИНЕНИЕ – запрос поддерживает соединения ЛЕВОЕ/ПРАВОЕ, ПОЛНОЕ, ВНУТРЕННЕЕ, что соответствует соединениям в SQL – LEFT/RIGHT JOIN, OUTER JOIN, INNER JOIN.

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

Синтаксически соединение выглядит так:

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

В языке запросов 1С отсутствует оператор для соединения декартова произведения (CROSS JOIN). Однако отсутствие оператора не означает, что язык запросов не поддерживает такого соединения. Соединить таблицы при необходимости можно таким образом:

ВЫБРАТЬ Таблица1.Ссылка КАК Ссылка ИЗ Справочник.Справочник1 КАК Таблица1 ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Справочник2 КАК Таблица2 ПО ИСТИНА

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

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



ПОДОБНО. В отличие от аналогичного оператора языка SQL – LIKE, шаблон для ПОДОБНО можно задать, используя только некоторые спец символы:

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

ИТОГИ ПО аналогом на SQL можно назвать оператор ROLLUP. Пример использования оператора ИТОГИ:

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

Результат будет такой:

Кровать

9833,333

Утюг

Ручка

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

Работа с пакетными запросами

1С позволяет работать с пакетами запросов. В пакетном запросе тексты запросов разделяются точкой с запятой (;). Выполнение пакетного запроса 1С осуществляется последовательно. Пример текста пакетного запроса:

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

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

Рассматривая язык запросов, стоит упомянуть о такой особенности, как виртуальные таблицы. Виртуальные таблицы отсутствуют в базе данных, это своеобразная обертка, которая выполняется на стороне СУБД как запрос с использованием подзапросов. Пример запроса 1С с использованием виртуальных таблиц:

ВЫБРАТЬ РегистрОбязательствОбороты.Обязательство КАК Обязательство ИЗ РегистрНакопления.РегистрОбязательств.Обороты() КАК РегистрОбязательствОбороты

Такой запрос на СУБД будет выглядеть так:

SEL ECT T1.Fld25931RRef FR OM (SELECT T2._Fld25931RRef AS Fld25931RRef, CAST(SUM(T2._Fld25936) AS NUMERIC(38, 8)) AS Fld25936Turnover_, CAST(SUM(T2._Fld25937) AS NUMERIC(38, 8)) AS Fld25937Turnover_ FR OM dbo._AccumRgTn25938 T2 WH ERE ((T2._Fld949 = @P1)) AND ((T2._Fld25936 @P2 OR T2._Fld25937 @P3)) GROUP BY T2._Fld25931RRef HAVING (CAST(SUM(T2._Fld25936) AS NUMERIC(38, 8))) 0.0 OR (CAST(SUM(T2._Fld25937) AS NUMERIC(38, 8))) 0.0) T1>>>>

Видно, что не похоже на SQL, поскольку есть подзапрос, группировка. Виртуальные таблицы, по большому счету – это «синтаксический сахар», то есть созданы, в общем-то, для удобства разработки запросов, чтобы запросы были компактнее и читабельнее.

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



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



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

РегистрНакопления.РегистрОбязательств.Обороты(, Операция = &Операция) КАК РегистрОбязательствОбороты

Для удобства написание запросов, то есть создания текстов запросов, в 1С существует конструктор, который можно вызвать через контекстное меню (правой кнопкой мыши):



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


Конструктор запросов является очень гибким визуальным инструментом для создания запросов любой сложности. Он доступен только в режиме конфигуратора. В режиме Предприятия есть так называемая «Консоль запросов» – это внешняя обработка, поставляемая на диске ИТС. Для управляемого приложения консоль запросов можно скачать на сайте its.1c.ru.

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

Причины неоптимальной работы запросов

Ниже приведен список основных причин (но не всех), которые приводят к замедлению выполнения запроса.

  • Использования соединения с подзапросами

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

  • Использование виртуальных таблиц в соединениях запроса

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

  • Использование условий в запросе, неподходящих под существующие индексы

Если в условиях запроса (в операторе ГДЕ или в условиях виртуальной таблицы) используются поля, которые не все входят в индекс, данный запрос будет выполнен с использованием SQL конструкции table scan или index scan (полностью или частично). Это скажется не только на времени выполнения запроса, но также будет наложена избыточная S блокировка на лишние строки, что в свою очередь может привести к эскалации блокировок, то есть будет заблокирована вся таблица.

  • Использование ИЛИ в условиях запроса

Использование логического оператора ИЛИ в конструкции ГДЕ может также приводить к сканированию таблицы (table scan). Это происходит из-за того, что СУБД не может корректно использовать индекс. Вместо ИЛИ можно применить конструкцию ОБЪЕДИНИТЬ ВСЕ.

  • Получение данных через точку для полей составного типа

Не рекомендуется получать значения через точку (в конструкции ВЫБРАТЬ, ГДЕ ), поскольку если реквизит объекта окажется составным типом, соединение будет происходить с каждой таблицей, входящей в этот составной тип. В результате запрос на СУБД будет значительно усложнен, это может помешать оптимизатору в выборе корректного плана выполнения запроса.

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

Создание запроса

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

//Создаем запрос
Запрос = новый Запрос;

//Заполняем текст запроса
Запрос. Текст= "Тут пишем текст запроса" ;

//Передаем в запрос параметры
Запрос. УстановитьПараметр("ИмяПараметра" , ЗначениеПараметра) ;

//Выполняем запрос
Результат= Запрос. Выполнить() ;

//Выгружаем результат запроса в выборку
Выборка= Результат. Выбрать() ;

//Выгружаем результат запроса в таблицу значений
Таблица= Результат. Выгрузить() ;

//Последние действия можно объединить
Выборка= Запрос. Выполнить() . Выбрать() ;
//или
Таблица= Запрос. Выполнить() . Выгрузить() ;

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

Простейшие и наиболее часто применяемые запросы служат для получения данных из какого-то источника. Источником могут являться практически все объекты, содержащие какие-либо данные: справочники, документы, регистры, константы, перечисления, планы видов характеристик и т.д.

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

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

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

Запрос. Текст = "ВЫБРАТЬ
| *
|ИЗ
| Справочник.Контрагенты"
;

Если же нужно получить только отдельные реквизиты, то — так:

Запрос. Текст = "ВЫБРАТЬ
| Код,
| Наименование,
| Родитель
|ИЗ
| Справочник.Контрагенты"
;

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

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

Запрос. Текст = "ВЫБРАТЬ
| Клиенты.Код КАК Номер,

| 1000 КАК ПолеСоЗначением
|ИЗ
;

Выборка = Запрос. Выполнить() . Выбрать() ;

Пока Выборка. Следующий() Цикл
НомерКлиента = Выборка. Номер;
ИмяКлиента = Выборка. Имя;
Знач = Выборка. ПолеСоЗначением;
КонецЦикла ;

Для задания псевдонимов служит вкладка Объединения/Псевдонимы в Конструкторе запросов.

А поле с фиксированным или рассчитываемым значением создается вручную на вкладке Таблицы и поля , в колонке Поля.

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

//Упорядочим клиентов по имени от А до Я и выберем первых 10
Запрос. Текст = "ВЫБРАТЬ ПЕРВЫЕ 10
| Клиенты.Код КАК Номер,
| Клиенты.Наименование КАК Имя,
| 1000 КАК ПолеСоЗначением
|ИЗ

|УПОРЯДОЧИТЬ ПО
| Имя"
;

//Выберем самого последнего по алфавиту клиента
Запрос. Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
| Клиенты.Код КАК Номер,
| Клиенты.Наименование КАК Имя,
| 1000 КАК ПолеСоЗначением
|ИЗ
| Справочник.Контрагенты КАК Клиенты
|УПОРЯДОЧИТЬ ПО
| Имя УБЫВ"
;

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

//Выборка разрешенных пользователю данных
Запрос. Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Клиенты.Код КАК Номер,
| Клиенты.Наименование КАК Имя,
| 1000 КАК ПолеСоЗначением
|ИЗ
| Справочник.Контрагенты КАК Клиенты"
;

//Выборка неповторяющихся элементов
Запрос. Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
| Клиенты.Код КАК Номер,
| Клиенты.Наименование КАК Имя,
| 1000 КАК ПолеСоЗначением
|ИЗ
| Справочник.Контрагенты КАК Клиенты"
;

Порядок задается на вкладке Порядок в Конструкторе запросов, количество выбираемых элементов, параметры разрешенности и повторяемости — на вкладке Дополнительно.

Продолжение следует…

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

1. Конструкция "ИЗ".

Для того, чтобы получить данные из базы совсем необязательно использовать конструкцию "ИЗ".
Пример: Нам необходимо выбрать все сведения о банках из справочника банки.
Запрос:

ВЫБРАТЬ Справочник.Банки.*

Выбирает все поля из справочника Банки. И является аналогичным запросу:

ВЫБРАТЬ Банки.* ИЗ Справочник.Банки КАК Банки

2. Упорядочивание данных по ссылочному полю

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

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

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

3.Получение текстового представления ссылочного типа. Конструкция "ПРЕДСТАВЛЕНИЕ".

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

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

4. Условие на выборку данных по шаблону.

Например, вам необходимо получить мобильные телефоны сотрудников вида (8 -123- 456-78-912). Для этого необходимо поставить такое условие в запросе:

ВЫБРАТЬ Сорудник.Наименование, Сорудник.Телефон КАК Телефон ИЗ Справочник.Сотрудники КАК Сотрудники ГДЕ Телефон ПОДОБНО "_-___-___-__-__"

Символ "_" является служебным и заменяет любой символ.

5. Одновременное использование итогов и группировок.


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

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

В этом случае запрос вернет практически тоже самое что и такой запрос:

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

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

6. Разыменование полей.

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

Запрос:

Можно представить в виде:

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

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

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

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

следует ограничить тип составного поля регистратор:

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

7. Конструкция "ГДЕ"

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

Пример. Необходимо выбрать всех Клиентов из Справочника клиенты и для тех клиентов, у которых имеется документ оплата со значением реквизита "Организация" = &Организация вывести документ "Оплата", для тех у кого нет, не выводить.

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

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

Можно обойти это условие и другим способом. необходимо наложить условие "ГДЕ" непосредственно в связи двух таблиц. Пример:

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

8. Соединения с Вложенными и Виртуальными таблицами

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

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

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

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

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

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

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

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

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

9.Проверка результата выполнения запроса.

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

РезЗапроса = Запрос.Выполнить(); Если резЗапроса.Пустой() Тогда Возврат; КонецЕсли;

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

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

Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Клиенты.Ссылка, | Клиенты.ДатаРождения |ИЗ | Справочник.Клиенты КАК Клиенты |ГДЕ | Клиенты.Ссылка = &Клиент"; Для Каждого Строка ИЗ ТаблицаКлиенты Цикл Запрос.УстановитьПараметр("Клиент", Клиент); РезультатЗапроса = Запрос.Выполнить().Выбрать(); КонецЦикла;

Это избавит систему от синтаксической проверки запроса в цикле.

11. Конструкция "ИМЕЮЩИЕ".

Конструкция, довольно редко встречающаяся в запросах. Позволяет накладывать условия на значения агрегатные функций (СУММА, МИНИМУМ, СРЕДНЕЕ и т.д.). Например, вам необходимо выбрать только тех клиентов, у которых сумма оплат в сентябре была больше 13 000 рублей. Если использовать условие "ГДЕ", то придется сначала создавать временную таблицу или вложенный запрос, там группировать записи по сумме оплаты и потом накладывать условие. Конструкция "ИМЕЮЩИЕ" поможет этого избежать.

ВЫБРАТЬ Оплата.Клиент, СУММА(Оплата.Сумма) КАК Сумма ИЗ Документ.Оплата КАК Оплата ГДЕ МЕСЯЦ(Оплата.Дата) = 9 СГРУППИРОВАТЬ ПО Оплата.Клиент ИМЕЮЩИЕ СУММА(Оплата.Сумма) > 13000

В конструкторе для этого достаточно перейти на вкладку "Условия", добавить новое условие и поставить галочку на "Произвольное". Далее просто написать Сумма(Оплата.Сумма) > 13000


12. Значение NULL

Я не буду описывать здесь принципы трехзначной логики в БД, есть множество статей на эту тему. Просто вкратце о том как NULL может повлиять на результат запроса. Значение NULL на самом деле не значение, а факт того, что значение не определено, неизвестно. Поэтому любые операции с NULL возвращают NULL, будь то сложение, вычитание, деление или сравнение. Значение NULL не может быть сравнимо со значением NULL, потому как мы не знаем, что именно сравнивать. Т.е. оба этих сравнения: NULL = NULL, NULL<>NULL - это не Истина или не Ложь, это неизвестно.

Давайте рассмотрим пример.

Нам необходимо для тех клиентов, у которых нет оплат, вывести поле "Признак" со значением "Нет оплат". Причем мы точно знаем, что такие клиенты у нас есть. И для того, чтобы отразить суть того, что писал выше сделаем это так.

ВЫБРАТЬ "Нет оплат" КАК Признак, NULL КАК Документ ПОМЕСТИТЬ тОплаты; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Клиенты.Ссылка КАК Клиент, Оплата.Ссылка КАК Оплата ПОМЕСТИТЬ тКлиентОплата ИЗ Справочник.Клиенты КАК Клиенты ЛЕВОЕ СОЕДИНЕНИЕ Документ.Оплата КАК Оплата ПО Клиенты.Ссылка = Оплата.Пайщик; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ тКлиентОплата.Клиент ИЗ тКлиентОплата КАК тКлиентОплата ВНУТРЕННЕЕ СОЕДИНЕНИЕ тОплаты КАК тОплаты ПО тКлиентОплата.Оплата = тОплаты.Документ

Обратите внимание на вторую временную таблицу тКлиентОплата. Левым соединением я выбираю всех клиентов и все оплаты по этим клиентам. Для тех же клиентов у которых нет оплат в поле "Оплата" будет NULL . Следуя логике, в первой временной таблице "тОплаты" я обозначил 2 поля, одно из них NULL, второе строка "Не имеет оплат". В третьей таблице я соединяю внутренним соединением таблицы "тКлиентОплата" и "тОплаты" по полям "Оплата" и "Документ". Мы знаем, что в первой таблице поле "Документ" это NULL, и во второй таблице у тех, у кого нет оплат в поле "Оплата" тоже NULL. Что же вернет нам такое соединение? А ничего не вернет. Потому как сравнение NULL = NULL не принимает значение Истина.

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

ВЫБРАТЬ "Нет оплат" КАК Признак, ЗНАЧЕНИЕ(Документ.Оплата.ПустаяСсылка) КАК Документ ПОМЕСТИТЬ тОплаты; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Клиенты.Ссылка КАК Клиент, ЕСТЬNULL(Оплата.Ссылка, ЗНАЧЕНИЕ(Документ.Оплата.ПустаяСсылка)) КАК Оплата ПОМЕСТИТЬ тКлиентОплата ИЗ Справочник.Клиенты КАК Клиенты ЛЕВОЕ СОЕДИНЕНИЕ Документ.Оплата КАК Оплата ПО Клиенты.Ссылка = Оплата.Пайщик; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ тКлиентОплата.Клиент ИЗ тКлиентОплата КАК тКлиентОплата ВНУТРЕННЕЕ СОЕДИНЕНИЕ тОплаты КАК тОплаты ПО тКлиентОплата.Оплата = тОплаты.Документ

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

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

13. Недокументированная особенность конструкции "ВЫБОР КОГДА...ТОГДА....КОНЕЦ".

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

ВЫБРАТЬ ВЫБОР КОГДА Пользователи.Наименование = "Вася Пупкин" ТОГДА "Наш любимый сотрудник" ИНАЧЕ "Не знаем такого" КОНЕЦ КАК Поле1 ИЗ Справочник.Пользователи КАК Пользователи

А что делать, если, к примеру, нам надо получить название месяца в запросе? Писать огромную конструкцию в запросе некрасиво и долго, поэтому нас может выручить такая форма записи выше:

ВЫБОР МЕСЯЦ(УС_РасчетПотребления_ГрафикОбороты.ПериодРасчета) КОГДА 1 ТОГДА "Январь" КОГДА 2 ТОГДА "Февраль" КОГДА 3 ТОГДА "Март" КОГДА 4 ТОГДА "Апрель" КОГДА 5 ТОГДА "Май" КОГДА 6 ТОГДА "Июнь" КОГДА 7 ТОГДА "Июль" КОГДА 8 ТОГДА "Август" КОГДА 9 ТОГДА "Сентябрь" КОГДА 10 ТОГДА "Октябрь" КОГДА 11 ТОГДА "Ноябрь" КОГДА 12 ТОГДА "Декабрь" КОНЕЦ КАК Месяц

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

14. Пакетное выполнение запроса.


Для того, чтобы не плодить запросы, можно создать один большой запрос, разбить его на пакеты и работать уже с ним.
Например, мне нужно получить из справочника "Пользователи" поля: "ДатаРождения" и доступные роли для каждого пользователя. в выгрузить это в разные табличные части на форме. Конечно можно сделать это в одном запросе, тогда придется перебирать записи или сворачивать, а можно так:

ВЫБРАТЬ Пользователи.Ссылка КАК ФИО, Пользователи.ДатаРождения, Пользователи.Роль ПОМЕСТИТЬ втПользователи ИЗ Справочник.Пользователи КАК Пользователи; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ втПользователи.ФИО, втПользователи.ДатаРождения ИЗ втПользователи КАК втПользователи СГРУППИРОВАТЬ ПО втПользователи.ФИО, втПользователи.ДатаРождения; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ втПользователи.ФИО, втПользователи.Роль ИЗ втПользователи КАК втПользователи СГРУППИРОВАТЬ ПО втПользователи.ФИО, втПользователи.ДатаРождения

тПакет = Запрос.ВыполнитьПакет();

ТП_ДатыРождения = тПакет.Выгрузить();
ТП_Роли = тПакет.Выгрузить();

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

15. Условия в пакетном запросе

Например, у нас есть пакетный запрос, где сначало мы получаем поля: "Наименование, ДатаРождения, Код" из справочника "Пользователи" и хотим из справочника "ФизЛица" получить записи с условием по этим полям.

ВЫБРАТЬ Пользователи.ФизЛицо.Наименование КАК Наименование, Пользователи.ФизЛицо.ДатаРождения КАК ДатаРождения, Пользователи.ФизЛицо.Код КАК Код ПОМЕСТИТЬ втПользователи ИЗ Справочник.Пользователи КАК Пользователи; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ФизическиеЛица.Ссылка КАК ФизЛицо ИЗ Справочник.ФизическиеЛица КАК ФизическиеЛица

Можно накложить условия таким образом:

ГДЕ ФизическиеЛица.Код В (ВЫБРАТЬ втПользователи.Код ИЗ втПользователи) И ФизическиеЛица.Наименование В (ВЫБРАТЬ втПользователи.Код ИЗ втПользователи) И ФизическиеЛица.ДатаРождения В (ВЫБРАТЬ втПользователи.ДатаРождения ИЗ втПользователи)

А Можно и так:

ГДЕ (ФизическиеЛица.Код, ФизическиеЛица.Наименование, ФизическиеЛица.ДатаРождения) В (ВЫБРАТЬ втПользователи.Код, втПользователи.Наименование, втПользователи.ДатаРождения ИЗ втПользователи)

Причем обязателено соблюдать порядок.

16. Вызов конструктора запросов для "условия" в пакетном запросе

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

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

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

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

upd1. Пункты 11,12
upd2. Пункты 13,14,15,16

Используемая литература:
Язык запросов "1С:Предприятия 8" - Е.Ю. Хрусталева
Профессиональная разработка в системе 1С:Предприятие 8".

Цель курса: дать слушателям целостное представление о языке запросов платформы «1С:Предприятие 8» - одного из наиболее важных механизмов встроенного языка системы. В курсе рассматриваются языковые конструкции: предназначение каждой конструкции и ее синтаксис. Каждая конструкция используется в учебно-практической задаче. Это, в свою очередь, в дальнейшем при практической работе позволит разработчику обоснованно выбирать те или иные конструкции языка запросов, тем самым повышая эффективность программного кода.

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

Уверенное знание языка запросов требуется разработчику 1С фактически при решении всех задач, встречающихся в его практике: программирование проведения документов самых различных классов, связанное с этим решение бухгалтерских и расчетных задач и т.д., а также совершенно необходимо при разработке отчетов с использованием Системы Компоновки Данных (СКД).

Курс рассчитан на слушателей, знакомых с основами встроенного языка платформы «1С:Предприятие 8», программными объектами и с объектами метаданных.

В стоимость очного дневного курса включено:

  • 3 дня с 10:00 до 17:00
  • методические материалы
  • обеды, кофе-брейки

В стоимость очного вечернего курса включено:

  • 6 вечеров с 18:40 до 21:40
  • методические материалы
  • кофе-брейки
  • свидетельство 1С-Учебного центра №3

В стоимость WEB-курса включено:

  • 6 недель курса, 5 вебинаров с преподавателем
  • свидетельство 1С-Учебного центра №3 (при условии выполнения практики)

В стоимость очного курса-погружения включено:

  • 5 дней с 10:00 до 17:00 или 9 вечеров с 18:30 по 21:30
  • конспект, наушники
  • обеды, кофе-брейки
  • доступ на 2 года к обновляемым видеоматериалам после окончания курса
  • свидетельство 1С-Учебного центра №3

В стоимость он-лайн трансляции включено:

  • он-лайн трансляция очного курса в режиме вебинара, 3 дня с 10:00 до 17:00 по мск времени
  • методическое пособие в печатном виде (заранее отправляется почтой России)
  • свидетельство 1С-Учебного центра №3

Форматы обучения

Очное дневное

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

Продолжительность: 24 академических часа

WEB-обучение

Что это за формат: Предлагаемый формат сочетает многие преимущества дистанционного обучения с очной составляющей, представленной видеоматериалами и онлайн-консультациями.
WEB-курс состоит из видеороликов, практических задач и вебинаров с преподавателям. Ко всем материалам курса предоставляется круглосуточный доступ через Интернет – можно заниматься в удобное время. Курс разделен на занятия. В течение занятия изучаются материалы по текущей теме, выполняются практикумы, задаются вопросы преподавателю. В конце каждого занятия проводится вебинар, на котором преподаватель разбирает все поступившие вопросы, типовые ошибки, объясняет правильное решение. Запись вебинаров доступна в портале. Таким образом проходят несколько занятий одно за другим. В конце проводится итоговая самостоятельная работа и итоговый вебинар.

Продолжительность: 6 недель

Что это за формат:


Продолжительность: 40 академических часов

Онлайн-трансляция

Что это за формат: Онлайн-трансляция – это обучение в форме он-лайн вебинара, которые стремительно набирают популярность в нашей стране. Вместо специальных видеопособий, вы получаете «живую» лекцию, транслируемую через Интернет. Тем самым достигается максимальная естественность подачи материала, аналогичная обычному очному обучению – но исчезает проблема необходимости личного присутствия в учебном центре. Отличие от очного обучения состоит только в отсутствии прямого взаимодействия с аудиторией и преподавателем.

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

Продолжительность: 24 академических часа

Что это за формат: Очный курс-погружение - формат, сочетающий в себе все плюсы очного обучения, дистанционных технологий и индивидуального обучения. Занятия проходят в оборудованном учебном классе, Вы самостоятельно изучаете материалы курса (пошаговые видеоролики) и выполняете практикумы. При этом в аудитории находится преподаватель, который готов в любой момент ответить на вопрос и помочь с решением практических задач, а также проверить правильность их выполнения.
Преимущества – индивидуальные консультации преподавателя по Вашим вопросам, подходящий лично для Вас темп прохождения материала.
Все это дает более глубокую проработку материала курса.
Этот курс возможно пройти со своего рабочего места с полным эффектом присутствия преподавателя там, где ученик! Если эта возможность Вас заинтересовала – позвоните нам!

Продолжительность: 40 академических часов

Программа курса

  1. Основные конструкции языка запросов платформы "1С:Предприятие 8"
    • Зачем нужен язык запросов?
    • Представление совокупностей объектов информационной базы в виде двумерных таблиц
    • Типы данных полей таблиц языка запросов
    • Учебная информационная база
    • Обработка "Консоль запросов"
    • Создание файла хранения списка запросов
    • Общие характеристики языка запросов Платформы
    • Первый запрос, самый простой
    • Какие прикладные объекты представляются таблицами языка запросов
    • Явное задание списка полей выборки
    • Комментарии в языке запросов
    • Псевдонимы полей и таблиц
    • Выражения в языке запросов
      • Выражения в списке полей выборки
      • Условные выражения в языке запросов. Оператор ВЫБОР
      • Фильтрация результатов запроса. Операция ГДЕ
      • Логические выражения в языке запросов
      • Параметры в языке запросов
      • Встроенные функции в выражениях языка запросов
      • Задание в запросе значений предопределенных данных конфигурации. Функция ЗНАЧЕНИЕ()
    • Групповые операции в языке запросов
      • Группировка по значению поля и агрегатные функции
      • Отбор по значению результата агрегатной функции: операция ИМЕЮЩИЕ
    • Упорядочивание записей результата запроса
    • Автоупорядочивание результата запроса
    • Получение первых N записей результата запроса. Операция ПЕРВЫЕ
    • Получение неповторяющихся комбинаций значений полей результата запроса. Операция РАЗЛИЧНЫЕ
  2. Выборка из нескольких источников данных
    • Простая задача: извлечение данных, хранящихся в таблицах разных объектов конфигурации
    • Декартово произведение (или "картезиан") множеств записей таблиц - источников данных
    • Решение поставленной задачи наложением условия на картезиан
    • Операция ВНУТРЕННЕЕ СОЕДИНЕНИЕ таблиц - источников данных
      • Операция ВНУТРЕННЕЕ СОЕДИНЕНИЕ как современная форма записи условия формирования отношения
      • Коммутативность операции ВНУТРЕННЕЕ СОЕДИНЕНИЕ
      • Соединения в запросе многих таблиц
    • Операция ЛЕВОЕ СОЕДИНЕНИЕ языка запросов
      • Задача: нахождение документов прихода, по которым нет оплат
      • Отличие операции ЛЕВОЕ СОЕДИНЕНИЕ от операции ВНУТРЕННЕЕ СОЕДИНЕНИЕ
      • Тип данных языка запросов NULL - отсутствие в поле результата запроса какого- либо значения
      • Оператор ЕСТЬ NULL и функция ЕСТЬNULL()
    • Операция ПРАВОЕ СОДИНЕНИЕ языка запросов
    • Операция ПОЛНОЕ СОЕДИНЕНИЕ языка запросов
    • Операция разыменования поля ссылочного типа
    • Обращение к табличной части объекта как к таблице - источнику данных. Поле Ссылка таблицы, представляющей табличную часть
    • Обращение к табличной части объекта в списке полей выборки
    • Вложенные запросы
    • Объединение результатов нескольких запросов
      • Запрос-объединение. Операция ОБЪЕДИНИТЬ
      • Заглушка ПУСТАЯТАБЛИЦА
    • Некоторые дополнительные операторы языка запросов
      • Оператор ВЫРАЗИТЬ
      • Логический оператор ССЫЛКА
      • Логический оператор В() с подзапросом в качестве параметра
  3. Расчет итогов в запросе
    • Получение итоговых записей в результате запроса - операция ИТОГИ
    • Итоги по нескольким измерениям
    • Представление результата запроса с итогами в виде многоуровневой (древовидной) структуры
    • Общие итоги
    • Итоги по иерархии
  4. Практическая работа с языком запросов
    • Виртуальные таблицы регистров
      • Таблицы языка запросов для регистров - физическая таблица и виртуальные таблицы
      • Синтаксис обращения к виртуальным таблицам. Параметры виртуальных таблиц
      • Виртуальные таблицы регистра накопления
      • Виртуальные таблицы регистра бухгалтерии
      • Некоторые распространенные ошибки обращения к виртуальным таблицам
      • Виртуальные таблицы периодического регистра сведений - СрезПервых и СрезПоследних
      • Особенности задания условий на значения полей для виртуальной таблицы регистра сведений
    • Работа с запросами на встроенном языке Платформы 8
      • Предварительный обзор объектной модели разработки и выполнения запросов во встроенном языке
      • Внешняя обработка РазработкаЗапросов.epf
      • Объект Запрос
      • Объект РезультатЗапроса
      • Объект ВыборкаИзРезультатаЗапроса
      • Второй параметр метода Выбрать()
      • Третий параметр метода Выбрать()
      • Временные таблицы и пакетные запросы
  5. Внешние источники (внешние базы) данных
    • Характеристика работы с внешними источниками данных
    • Подготовительная работа
    • Инфология dBase-базы данных "Поставки детских игрушек"
    • Создание описания источника данных ODBC в операционной системе Windows
    • Создание и настройка объекта Внешний источник данных
    • Установление соединения и просмотр таблиц внешнего источника данных в режиме 1С:Предприятие
    • Интерактивная установка соединения
    • Программная установка соединения
    • Установление информационно-логической связи (отношений) на таблицах внешнего источника данных. Превращение внешнего источника во внешнюю базу данных
    • Задание отношений на таблицах делает источник данных базой данных
    • Настройка объектных таблиц - объявление таблиц внешнего источника данных типообразующими (ссылочными)
    • Выборка данных из внешней базы запросом
    • Внешние базы данных на основе книг MS Excel
  6. Некоторые практические приемы построения запросов
    • Логический вентиль. Возможность отключения проверки условия в запросе при пустом значении параметра
    • Коррелированный запрос. Задача получения N последних курсов валют
    • Тэта-соединение. Задача получения курса валюты на множество разных дат
    • Получение иерархических результатов по таблицам неиерархических объектов. Задача построения полного дерева зависимости видов расчета
    • Выборка данных из объекта типа...Список по установленным отборам при помощи объекта ПостроительЗапроса
  7. Краткая справка по работе с Конструктором запроса
Читать всю программу

Наполнение курса

Всего ресурсов (Web-страниц и страниц с видео)

Видео материалы (всего минут)

Практикумы для самостоятельного выполнения

Занятие 1. Начальные возможности языка запросов, функции, агрегирование, сортировка

8 (средней сложности)

Занятие 2. Выборка из нескольких источников данных

6 (средней сложности)

Занятие 3. Расчет итогов в запросе, виртуальные таблицы регистров

3 (средней сложности)

Занятие 4. Работа с запросами на встроенном языке, внешние источники (внешние базы) данных

4 (средней сложности)

Занятие 5. Некоторые практические приемы построения запросов

2 (сложных)

Технические требования:
- доступ в Интернет
(проверить свой канал связи Вы сможете подключившись к ),
- наличие платформы 1С:Предприятие 8.2 для отработки практических заданий курса.
Достаточно «1С:Предприятие 8.2» Версия для обучения программированию.

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

Войдите на сайт как ученик

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: основы синтаксиса

Начиная с этого урока мы начинаем изучать синтаксис языка запросов.

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

Основы синтаксиса

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

ВЫБРАТЬ
СЮДА ПИШЕМ ЧТО БУДЕМ ВЫБИРАТЬ
ИЗ
СЮДА ПИШЕМ ОТКУДА БУДЕМ ВЫБИРАТЬ

Таким образом, если мы хотим написать запрос, который вернёт нам имена всех элементов справочника Еда, то рассуждение будет примерно таким:

  1. У справочника Еда есть реквизит с именем Наименование .
  2. Элементы справочника Еда хранятся в базе данных в таблице Справочник.Еда .
  3. А значит запрос будет таким:
    ВЫБРАТЬ Наименование ИЗ Справочник. Еда

Попробуйте написать этот запрос в консоли запросов, как мы это делали на первом уроке ():

И затем выполнить его (кнопка Выполнить):

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

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

Выборка нескольких свойств

Если мы хотим запросить несколько свойств (к примеру, Наименование и Цвет ), то их нужно перечислить через запятую:

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

Выборка первых N строк

Теперь давайте решим такую задачу: "Запросить названия первых 3 элементов справочника Еда ". Вы читаете ознакомительную версию урока, полноценные уроки находятся . Чтобы ограничить количество строк, которое вернёт нам запрос используем ключевое слово ПЕРВЫЕ 3 :

Дополнительные пояснения

Смотреть пояснения (от 30.07.2014)

Как выглядит таблица справочника еда? Какие в ней столбцы?

Во-первых, её полное название Справочник.Еда .

Во-вторых, её столбцы как следует из конфигуратора следующие:

  • Калорийность

Плюс стандартные для всех справочников:

  • Наименование
  • И ещё ряд реквизитов, которые нам пока не интересны.

Таким образом, чтобы обратиться к любому из этих столбцов (свойств, реквизитов) мы прямо так и напишем:

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

Отвлечёмся не надолго.

А как выглядит таблица справочника цвета?

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

  • Наименование
  • И так далее.

А теперь такой момент.

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

Конечно же через точку:

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

Но это не все данные, которые есть у документа. Как следует из конфигуратора у него есть табличная часть с именем Продукты . Это как бы ещё одна таблица, привязанная к этому документу. У этой таблицы есть свои столбцы (см. конфигуратор):

  • Количество

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

← Вернуться

×
Вступай в сообщество «page-electric.ru»!
ВКонтакте:
Я уже подписан на сообщество «page-electric.ru»