Главная страница

6Глава Концепция управляемого приложения


Скачать 6.74 Mb.
Название6Глава Концепция управляемого приложения
Дата02.11.2022
Размер6.74 Mb.
Формат файлаpdf
Имя файлаLab.rabotyISiTvE.S.Merkulova.pdf
ТипДокументы
#767994
страница7 из 17
1   2   3   4   5   6   7   8   9   10   ...   17
Глава 6. Запросы
Механизм запросов - это один из способов доступа к данным, которые поддерживает платформа. Используя этот механизм, разработчик может читать и обрабатывать данные, хранящиеся в информационной базе; изменение данных с помощью запросов невозможно. Это объясняется тем, что запросы специально предназначены для быстрого получения и обработки некоторой выборки из больших массивов данных, которые могут храниться в базе данных.
6.1. Табличный способ доступа к данным
Запросы реализуют табличный способ доступа к данным, которые хранятся в базе данных. Это означает, что все данные представляются в виде совокупности связанных между собой таблиц, к которым можно обращаться как по - отдельности, так и к нескольким таблицам во взаимосвязи:
Такой способ работы с данными позволяет получать сложные выборки данных, сгруппированные и отсортированные определенным образом. Для этих выборок могут быть рассчитаны общие и промежуточные итоги, наложены ограничения на количество или состав записей и пр.
6.2. Язык запросов
Для того чтобы разработчик имел возможность использовать запросы для реализации собственных алгоритмов, в платформе реализован язык запросов. Этот язык основан на
SQL, но при этом содержит значительное количество расширений, ориентированных на отражение специфики финансово-экономических задач и на максимальное сокращение усилий по разработке прикладных решений.
Можно перечислить наиболее существенные возможности, реализуемые языком запросов:
6.2.1. Обращение к полям через точку (".")
Если поля какой-либо таблицы имеют ссылочный тип (хранят ссылки на объекты другой таблицы), разработчик может в тексте запроса ссылаться на них через ".", при этом количество уровней вложенности таких ссылок система не ограничивает.

107
Выбрать
Контрагенты.Партнер.ОсновнойМенеджер.ФизическоеЛицо.Наименование
Из
Справочник.Контрагенты
как
Контрагенты
6.2.2. Обращение к вложенным таблицам (табличным частям
документов и элементов справочников)
Система поддерживает обращения к вложенным табличным частям и как к отдельным таблицам, и как к целым полям одной таблицы. Например, при обращении к документу
Реализация товаров (содержащему табличную часть Товары с составом отгружаемых товаров), мы можем считать табличную часть как отдельную таблицу:
Выбрать
РеализацияТоваров.Номенклатура,
РеализацияТоваров.Количество,
РеализацияТоваров.Цена,
РеализацияТоваров.Сумма
Из
Документ. РеализацияТоваровИУслуг.Товары
как
РеализацияТоваров
Но также мы можем считать заголовочную запись документа, в которой значением поля Товары будут все записи вложенной таблицы, подчиненные этому объекту
(документу):
Выбрать
РеализацияТоваров.товары(
Номенклатура,
Количество,
Цена,
Сумма
Из
Документ. РеализацияТоваровИУслуг
как
РеализацияТоваров.
6.2.3. Автоматическое упорядочивание
Для выбора наиболее правильного ("естественного") порядка вывода информации на экран или в отчет разработчику в большинстве случаев достаточно задать режим автоматического упорядочивания.
Выбрать
РеализацияТоваров.Номенклатура,
РеализацияТоваров.Количество,

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

109
6.2.6. Стандартные SQL операции
В языке запросов поддерживаются стандартные для SQL операции, такие, как объединение (Union), соединение (Join) и т.д. Рассмотрим несколько примеров.
Пример 1.
Выбрать
СвободныеОстатки.Свободно,
Номенклатура.Наименование
Из
РегистрНакопления.СвободныеОстатки
как
СвободныеОстатки
Внутреннее соединение
Справочсник.Номенклатура
как
Номенклатура
По
СвободныеОстатки.Номенклатура
=
Номенклатура.Ссылка
Пример 2.
Выбрать
СвободныеОстатки.Свободно,
Номенклатура.Наименование
Из
РегистрНакопления.СвободныеОстатки
как
СвободныеОстатки
Левое соединение
Справочсник.Номенклатура
как
Номенклатура
По
СвободныеОстатки.Номенклатура
=
Номенклатура.Ссылка
Пример 3.

110
ВЫБРАТЬ
НаклСостав.Номенклатура,
НаклСостав.Цена КАК Цена
ИЗ
Документ.РасходнаяНакладная.Состав
КАК
НаклСостав
где
НаклСостав.Ссылка.Дата
МЕЖД
У &НачДата И &КонДата
ОБЪЕДИНИТЬ
ВЫБРАТЬ
НаклСостав.Номенклатура,
НаклСостав.Цена
ИЗ
Документ.ПриходнаяНакладная.Состав
КАК
НаклСостав
ГДЕ
НаклСостав.Ссылка,Дата
МЕЖДУ
&НачДата И &КонДата
6.2.7. Операции выбора в языке запросов (ВЫБОР / CASE)
ВЫБРАТЬ Наименование, ЗакупочнаяЦена КАК Цена,
ВЫБОР
Когда ЭтоГруппа = Истина Тогда "Это группа"
Когда ЗакупочнаяЦена >=1000 Тогда "1000 и выше"
Когда ЗакупочнаяЦена >= 100 Тогда "100-1000"
Когда ЗакупочнаяЦена >= 10 Тогда "10-100"
Когда ЗакупочнаяЦена > 0 Тогда "0 - 10"
Иначе "Не задана"
КОНЕЦ
КАК
Диапазон
ИЗ
Справочник.Номенклатура
6.2.8.
Встроенные функции языка запросов
Могут быть использованы в списке полей выборки предложения ВЫБРАТЬ и в условии отбора предложения ГДЕ
ВЫБРАТЬ
Наименование, ДатаПриема
ПОДСТРОКА
(Наименование ,1,2) КАК Сокращение,
ДЕНЬ
(ДатаПриема)
КАК
Число,
МЕСЯЦ
(ДатаПриема)
КАК
Месяц,
ГОД
(ДатаПриема)
КАК
Год
ИЗ
Справочник. Сотрудники
6.2.9. Временные таблицы
Язык запросов позволяет использовать в запросах временные таблицы. С их помощью можно повысить производительность запросов, в некоторых случаях снизить количество блокировок и сделать текст запроса более легким для восприятия.

111
Предположим, нужно получить данные из двух регистров накопления. Данные из одного регистра поместим во временную таблицу:
Запрос, использующий временную таблицу, будет иметь вид:
6.2.10. Пакетные запросы
Для более удобной работы с временными таблицами в языке запросов поддерживается работа с пакетными запросами - таким образом, создание временной таблицы и ее использование помещаются в один запрос. Пакетный запрос представляет собой последовательность запросов, разделенных символом ";". Запросы исполняются один за другим. Результатом выполнения пакетного запроса в зависимости от используемого метода будет являться либо результат, возвращаемый последним запросом пакета, либо массив результатов всех запросов пакета в той последовательности, в которой следуют запросы в пакете.
Выбрать
СвободныеОстатки.Свободно,
Номенклатура.Наименование

112
ПОМЕСТИТЬ ОстаткиНоменклатуры
Из
РегистрНакопления.СвободныеОстатки
как
СвободныеОстатки
Левое соединение
Справочсник.Номенклатура
как
Номенклатура
По
СвободныеОстатки.Номенклатура
=
Номенклатура.Ссылка
;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Выбрать
ОстаткиНоменклатуры.Номенклатура,
ОстаткиНоменклатуры.СвободноОстаток,
Заказы.ЗаказКлиента как ЗаказКлиента,
Заказы.КоличествоОстаток как КоличествоОстаток
Из
ОстаткиНоменклатуры Как ОстаткиНоменклатуры
Левое соединение
РегистрНакопления.ЗаказыЛлиентов.Остатки
как
Заказы
ПО
ОстаткиНоменклатуры.Номенклатура
=
Заказы.Номенклатура
6.2.11. Обработка результатов запроса
Получение и проверка результата запроса
Запрос = Новый Запрос;
ТекстЗапроса = "ВЫБРАТЬ * ИЗ Справочник.Сотрудники";
Запрос.Текст = ТекстЗапроса;
РезультатЗапроса = 3апрос.
Выполнить
();
Если
НЕ Результат.Пустой()
Тогда
ВыборкаИзРезультатаЗапроса = Результат.Выбрать();
КонецЕсли
Выборка из результата запроса
Обход выборки может быть линейный, иерархический или по группировкам
Запрос:
ВЫБРАТЬ Номенклатура, Количество
ИЗ Документ.РасходнаяНакладная.Состав
УПОРЯДОЧИТЬ ПО Номенклатура
ИТОГИ СУММА(Количество) ПО Номенклатура, номенклатура
Иерархия
1
) линейная выборка
:
Выборка = РезультатЗапроса.Выбрать();
Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.
Прямой)
;
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Номенклатура);
КонецЦикла;
Данные из таблицы результата запроса читаются последовательно, в порядке их расположения там.

113 2)
Иерархический обход
:
ОбходРезультатаЗапроса.ПоГруппировкамСИерархией:
СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
Выборка = РезультатЗапроса.Выбрать(СпособВыборки);
Обходятся только записи, находящиеся на одном уровне иерархии в иерархическом справочнике, т.е. читаются только группы (для двухуровневого справочника), и не читаются элементы справочника. Для прочтения остальных записей выборки нужен вложенный цикл.
ОбходРезультатаЗапроса.ПоГруппировкамСИерархией;
Выборка = Запрос.Выполнить().Выбрать(СпособВыборки);
Пока Выборка.Следующий() Цикл
// обработка верхнего уровня иерархии записей
Выборка1=Выборка. Выбрать(СпособВыборки);
Пока Выборка1.Следующий() Цикл
// обработка второго уровня иерархии записей
и т.д.
3)
Обход по группировкам
СпособВыборки = ОбходРезультатаЗапроса.ПоГруппировкам;
Выборка = РезультатЗапроса.Выбрать(СпособВыборки);
Пока Выборка.Следующий() Цикл
//получим записи –все группы
Сообщить("Группа товаров: " + СокрЛП(Выборка.Наименование) +
"Количество: " + СокрЛП(Выборка.Количество));
//выберем дочерние (все прочие ) записи линейным способом
ВыборкаДочерних = Выборка.Выбрать();
Пока ВыборкаДочерних.Следующий() Цикл
Сообщить(" Товар: " + СокрЛП(Выборка.Наименование) + " Количество: " +
СокрЛП(Выборка.Количество));
КонецЦикла;
КонецЦикла;
6.2.12. Конструкторы запроса
Для облегчения труда разработчика технологическая платформа содержит два специальных конструктора. Они служит для того, чтобы помочь разработчику составить правильный текст запроса, используя только визуальные средства. Выбирая мышью нужные поля таблиц, разработчик может составить работоспособный запрос, даже не зная синтаксиса языка запросов.

114
Конструктор запроса (Query Builder)
Конструктор запроса - это один из инструментов разработки. Он позволяет составить текст запроса на языке запросов исключительно визуальными средствами.
Конструктор запроса можно вызвать, если курсор находится в любом программном модуле. Тогда в главном меню конфигуратора появляется дополнительное подменю
«Текст», рис. 6.1..
Рис. 6.1. Вызов конструктора запроса
После выбора конструктора запросов открывается следующая система окон, рис. 6.2.:
Рис. 6.2. Конструктор запроса

115
С помощью кнопок Далее и Назад можно перемещаться по закладкам конструктора и указывать, какие данные должны присутствовать в результате запроса, как они связаны, сгруппированы, какие итоги следует рассчитать, работать с временными таблицами, редактировать пакет запросов:
Рис. 6.3. Конструктор запроса после выбора таблицы-источника и полей в таблице
Результатом работы конструктора будет являться синтаксически правильный текст запроса. Таким образом, разработчик может составить работоспособный запрос, даже не владея синтаксисом языка запросов - необходимые синтаксические конструкции конструктор сгенерирует автоматически. Готовый текст запроса может быть сразу же вставлен в текст модуля или скопирован в буфер обмена.
Кроме этого конструктор запросов позволяет редактировать уже имеющийся в программе текст запроса. Для этого достаточно установить курсор внутри существующего текста запроса и вызвать конструктор. Имеющийся текст запроса будет проанализирован и представлен в конструкторе в виде соответствующих выбранных полей базы данных и набора заданных связей, группировок, условий и т.д.

116
Конструктор запроса с обработкой результата
Помимо текста запроса формирует фрагмент программного кода, который исполняет запрос и выводит результаты в табличный документ или диаграмму.
Конструктор запроса с обработкой результата - это один из инструментов разработки. Он позволяет составить текст запроса и сформировать фрагмент программного кода, который исполняет запрос и выводит результаты в табличный документ или диаграмму.
На первом шаге своей работы конструктор предлагает выбрать один из возможных вариантов обработки результата запроса: просто обход результата для его дальнейшей программной обработки или вывод данных в табличный документ или диаграмму.
Рис. 6.4. Конструктор запроса с обработкой результата
Следующие шаги работы конструктора позволяют создать текст запроса к базе данных.
Эти возможности аналогичны тем, которые предоставляет конструктор запроса
Результатом работы конструктора запроса с обработкой результата является готовый фрагмент программного кода и, например, макет табличного документа. Разработчик может внести в них, при необходимости, свои изменения.
Пример. Разработать отчет, выводящий список сотрудников, с использованием конструктора запросов с обработкой результата.
Вводим в конфигураторе новый объект-отчет. Создаем форму отчета, заходим в модуль отчета, вызываем конструктор запросов с обработкой результата. Получаем:

117
Рис. 6.5. Конструктор запроса с обработкой результата. Первый шаг
Переходим на закладку «Таблицы», выбираем нужную таблицу-источник, в выбранной таблице выбираем нужные поля для отчета.
Рис. 6.6. Конструктор запроса с обработкой результата. Второй шаг.
Далее, на закладке «порядок» выбираем порядок сортировки с иерархией для того, чтобы строки справочника выводились в отчет в учетом их вложенности в группы, т.е. в соответствии с иерархией групп и элементов.

118
Рис. 6.7. Конструктор запроса с обработкой результата. Третий шаг.
Нажимаем ОК. Получаем:
А) Автоматически сформированный макет
Рис. 6.8. Автоматически сформированный конструктором макет.
Б) Фрагмент программного кода в модуле отчета:
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
//При повторном использовании конструктора, внесенные вручную
// изменения будут утеряны!!!
Макет =
Отчеты.СписокСотрудников_С_КонструктомЗапросаСПечатью.ПолучитьМ
акет("Макет");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Сотрудники.Код,
|
Сотрудники.Наименование,
|
Сотрудники.Пол,
|
Сотрудники.Образование,
|
Сотрудники.Оклад КАК Оклад,
|
Сотрудники.Адрес
|ИЗ
|
Справочник.Сотрудники КАК Сотрудники

119
|
|УПОРЯДОЧИТЬ ПО
|
Сотрудники.Ссылка ИЕРАРХИЯ";
Результат = Запрос.Выполнить();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗап
иси);
ТабДок.Вывести(ОбластьДетальныхЗаписей,
ВыборкаДетальныеЗаписи.Уровень());
КонецЦикла;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
Очевидно, что данный фрагмент требует модификации. Сначала необходимо на форме сделать кнопку вызова печати, на форму установить элемент типа
ТабличныйДокумент

120
Рис. 6.9. Настройка формы отчета
Далее, корректируем текст программы:
&НаКлиенте
Процедура Печать(Команда)
ТабДок=ПечатьОтчета();
КонецПроцедуры
Функция ПечатьОтчета()
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную
//изменения будут утеряны!!!
Макет =
Отчеты.СписокСотрудников_С_КонструктомЗапросаСПечатью.ПолучитьМ
акет("Макет");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|
Сотрудники.Код,
|
Сотрудники.Наименование,
|
Сотрудники.Пол,
|
Сотрудники.Образование,
|
Сотрудники.Оклад КАК Оклад,
|
Сотрудники.Адрес
|ИЗ
|
Справочник.Сотрудники КАК Сотрудники
|

121
|УПОРЯДОЧИТЬ ПО
|
Сотрудники.Ссылка ИЕРАРХИЯ";
Результат = Запрос.Выполнить();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
ТабДок=Новый ТабличныйДокумент();
ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗап
иси);
ТабДок.Вывести(ОбластьДетальныхЗаписей,
ВыборкаДетальныеЗаписи.Уровень());
КонецЦикла;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
Возврат ТабДок;
КонецФункции
Результат:
Рис. 6.10. Готовый отчет

122
Для улучшения внешнего вида отчета, а также для добавления новых возможностей
(расшифровки, примечания) необходимо продолжить корректировку как макета, так и модуля отчета.
6.3. Варианты заданий
Разработать отчет с нестандартной расшифровкой вывода списка элементов основного справочника (см. варианты заданий в главе 4). Для этого необходимо:
 Создать новую подсистему «Лабораторная работа 3». Все новые объекты данного задания поместить в данную подсистему.
 Создать в конфигурации новый объект-отчет.
 Создать форму отчета. Для формирования отчета использовать конструктор запроса с обработкой результата.
 Внести корректировку в результаты работы конструктора, обеспечивающие вывод отчета и его нестандартную расшифровку по правилам главы 5.
1   2   3   4   5   6   7   8   9   10   ...   17


написать администратору сайта