Основы разработки прикладных решений для 1С:Предприятие 8.1

Запросы, обработки

Разбить на страницы
Показывать лекцию целиком

Цель лекции: научиться создавать внешние обработки, изучить основные сведения о запросах.

7.1. Основные сведения о запросах

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

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

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

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

    Источники данных для запросов

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

    Реальные таблицы называются так потому, что они физически хранятся в базе данных. Реальные таблицы, в свою очередь, подразделяются на объектные (ссылочные) и необъектные (не ссылочные).

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

    В необъектных таблицах хранятся данные других типов - например - записи регистров.

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

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

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

    Написание текста запроса

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

    Выполнение запроса и обработка результатов запроса

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

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

    7.2. Создание внешней обработки КонсольЗапросов

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

    Войдем в .

    (рис 7.1) Начало создания внешней обработки

    Введем в поле имя КонсольЗапросов, для начала редактирования формы обработки нажмем на кнопку Открыть в поле Основная форма внешней обработки. Появится окно Конструктор формы обработки, оставим в нем все по умолчанию и нажмем Готово.

    Добавим в форму элемент управления Поле текстового документа, зададим ему имя ТекстЗапроса, установим в параметре Расширение значение Язык запросов. Добавим в список реквизитов формы новый реквизит, зададим ему имя ТекстЗапросов и тип Строка.

    Это позволит использовать в данном поле, при работе в режиме 1С:Предприятие, конструктор запросов, синтаксические конструкции языка запросов будут автоматически выделяться, рис 7.2.

    (рис 7.2) Добавление в форму внешней обработки поля текстового документа

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

    Теперь добавим в форму еще один элемент управления - табличное поле. Зададим ему имя - .

    (рис 7.3) Добавление в форму внешней обработки табличного поля

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

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

    Процедура КнопкаВыполнитьНажатие(Кнопка)
    	Запрос = Новый Запрос;
    	Запрос.Текст=ЭлементыФормы.ТекстЗапроса.ПолучитьТекст();
    	РезультатВыполненияЗапроса = Запрос.Выполнить().Выгрузить();
    	ЭлементыФормы.РезультатВыполненияЗапроса.СоздатьКолонки();
    КонецПроцедуры

    Поясним ее команды. Они, в основном, связаны с новым для вас объектом Запрос.

    Запрос = Новый Запрос;

    Создаем новый объект типа Запрос, записываем ссылку на него в переменную Запрос.

    Запрос.Текст=ЭлементыФормы.ТекстЗапроса.ПолучитьТекст();

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

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

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

    ЭлементыФормы.РезультатВыполненияЗапроса.СоздатьКолонки();

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

    После того, как создание обработки завершено, сохраним ее командой главного меню программы Файл > Сохранить.

    Файлы внешних обработок имеют расширение *.EPF, рис 7.4.

    (рис 7.4) Сохраняем внешнюю обработку

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

    (рис 7.5) Внешняя обработка, открытая в режиме 1С:Предприятие

    Сейчас все готово для ваших первых экспериментов с запросами.

    7.3. Изучение конструктора запросов и языка запросов

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

    Щелкнем правой кнопкой мыши по свободному пространству в поле ввода текста запроса в обработке .

    (рис 7.6) Конструктор запроса

    Конструктором запроса можно пользоваться и в режиме конфигурирования, причем, там он, преимущественно, и используется при составлении запросов.

    Окно конструктора запроса имеет несколько вкладок. Вкладка Таблицы и поля служит для указания таблиц ( реальных и виртуальных ), из которых будут отбираться данные, и конкретных полей этих таблиц, которые и попадут в результаты запроса.

    Вкладка .

    (рис 7.7) Набор таблиц базы данных

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

    Рабочая область Таблицы окна Конструктор запроса содержит список таблиц, из которых система выбирает данные. Этот список формируется переносом нужных таблиц из рабочей области База данных.

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

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

    Если вспомнить устройство справочника .

    (рис 7.8) Выбор таблиц и полей

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

    (рис 7.9) Предварительный просмотр текста запроса

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

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

    Как вы уже могли понять, в поле ТекстЗапроса попадет следующий текст:

    ВЫБРАТЬ
    	Сотрудники.ФизическоеЛицо.Фамилия
    ИЗ
    	Справочник.Сотрудники КАК Сотрудники

    Весь этот текст представляет собой описание запроса. Ключевое слово ВЫБРАТЬ обязательно должно присутствовать в начале описания. Оно показывает, какие именно данные должен получать запрос.

    Ключевое слово ИЗ позволяет задавать источники данных для запроса. В нашем случае мы видим здесь следующий текст:

    Справочник.Сотрудники КАК Сотрудники

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

    Вернемся к пояснениям области ВЫБРАТЬ. Здесь имеется следующая команда:

    Сотрудники.ФизическоеЛицо.Фамилия

    Этой командой мы обращаемся к таблице ФизическоеЛицо, которая хранится в таблице Сотрудники (напомним, что это - псевдоним) и выбираем из нее фамилию сотрудника. Полям, которые попадают в выборку данных, создаваемую запросом, так же можно назначать псевдонимы с помощью ключевого слова КАК.

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

    Теперь нажмем на кнопку .

    (рис 7.10) Результат выполнения запроса

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

    Получим из справочника ЕдиницыИзмерения коды и наименования единиц измерения. В результатах запроса поле Код должно иметь наименование " Код ", поле " Наименование " - " Название ". Справочник ЕдиницыИзмерения нужно представить в запросе как ТабЕдИзм.

    Написание запроса удобно начинать с группы ИЗ. Напишем следующий шаблон:

    ВЫБРАТЬ
    ИЗ
        Справочник.ЕдиницыИзмерения как ТабЕдИзм

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

    ВЫБРАТЬ
    	ТабЕдИзм.Код,
    	ТабЕдИзм.Наименование КАК Название
    ИЗ
        Справочник.ЕдиницыИзмерения как ТабЕдИзм

    Исполним запрос, рис 7.11.

    (рис 7.11) Результат выполнения запроса

    Усложним задачу. Результат предыдущего запроса нужно упорядочить по полю Название.

    Для этого в запросе нужно использовать конструкцию УПОРЯДОЧИТЬ ПО. Теперь наш запрос будет выглядеть так:

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

    На рис 7.12 вы можете видеть результат выполнения запроса

    (рис 7.12) Результат выполнения запроса

    При составлении запроса можно задавать выбор не всех результатов, полученных из базы, а лишь тех, которые удовлетворяют какому-либо условию. Наиболее простое проявление этого утверждения - выбор некоторого количества первых элементов результата. Реализуется это с использованием слова ПЕРВЫЕ с указанием количества отбираемых элементов. Обратите внимание на то, что элементы выбираются с учетом их упорядочивания, заданного в запросе.

    Выберем первые 2 элемента из результатов, модифицировав предыдущий запрос:

    ВЫБРАТЬ ПЕРВЫЕ 2
    	ТабЕдИзм.Код,
    	ТабЕдИзм.Наименование КАК Название
    ИЗ
        Справочник.ЕдиницыИзмерения как ТабЕдИзм
    УПОРЯДОЧИТЬ ПО 
        Название

    Выполним запрос (рис 7.13).

    (рис 7.13) Результат выполнения запроса

    Для того чтобы в выборку попали лишь различные элементы, можно воспользоваться ключевым словом РАЗЛИЧНЫЕ после слова ВЫБРАТЬ.

    Выше мы делали выборки из неиерархического справочника .

    ВЫБРАТЬ
    	*
    ИЗ
        Справочник.Номенклатура
    (рис 7.14) Результат выполнения запроса

    Как видите, в результат запроса попали не только элементы справочника ( . Это поле у обычных элементов справочника принимает значение ложь, у групп - истина.

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

    ВЫБРАТЬ
    	ТабНоменклатура.Наименование
    ИЗ
    	Справочник.Номенклатура КАК ТабНоменклатура
    ГДЕ
    	НЕ ТабНоменклатура.ЭтоГруппа
    (рис 7.15) Результат выполнения запроса

    Рассмотрим еще один вариант отбора результатов запроса, а заодно еще немного продвинемся в изучении Конструктора запроса.

    Нам нужно отобрать среди документов поступления материалов лишь те, сумма которых превышает 2000 рублей, и вывести в результаты запроса даты, номера документов, ФИО материально-ответственного лица, принявшего материалы, а так же сумму документа, упорядочив выводимые строки по сумме документа.

    Откроем :

  • ПоступлениеМатериалов.Дата
  • ПоступлениеМатериалов.Номер
  • ПоступлениеМатериалов.ОтветственныйСотрудник
  • ПоступлениеМатериалов.СтоимостьМатериалов
  • (рис 7.16) Конструктор запроса, вкладка Таблицы и поля

    Теперь нам нужно задать условие отбора. Для этого перейдем на вкладку ) нужно выбрать условие выбором их списка (мы выбрали условие "больше") и заменить выражение СтоимостьМатериалов на число 2000.

    (рис 7.17) Конструктор запроса, вкладка Таблицы и поля

    Здесь нас подстерегает одна особенность конструктора запросов. Дело в том, что и выражение СтоимостьМатериалов, и число 2000 он будет воспринимать как имя переменной, которая должна быть передана в запрос до его исполнения. Нам же нужно, чтобы 2000 было воспринято именно как число, а не как имя переменной. Для того, чтобы это сделать, установим галочку в поле Произвольное. Это приведет к тому, что поле Условие превратится в одну строку, в которой будет написано следующее:

    ПоступлениеМатериалов.СтоимостьМатериалов > 2000

    Символ .

    (рис 7.18) Конструктор запроса, вкладка Условия

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

    (рис 7.19) Конструктор запроса, вкладка Порядок

    Работа с .

    (рис 7.20) Текст запроса и результат выполнения запроса

    Вот, какой текст сгенерировал Конструктор запроса:

    ВЫБРАТЬ
    	ПоступлениеМатериалов.Дата,
    	ПоступлениеМатериалов.Номер,
    	ПоступлениеМатериалов.ОтветственныйСотрудник,
    	ПоступлениеМатериалов.СтоимостьМатериалов КАК СтоимостьМатериалов
    ИЗ
    	Документ.ПоступлениеМатериалов КАК ПоступлениеМатериалов
    ГДЕ
    	ПоступлениеМатериалов.СтоимостьМатериалов > 2000
    
    УПОРЯДОЧИТЬ ПО
    	СтоимостьМатериалов

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

    Существуют следующие виды соединения таблиц:

  • Левое внешнее соединение;
  • Правое внешнее соединение;
  • Полное внешнее соединение;
  • Внутреннее соединение;
  • Рассмотрим эти виды соединения таблиц на примере.

    В нашей конфигурации есть два взаимосвязанных справочника. А именно, речь идет о справочниках Номенклатура и ЕдиницыИзмерения. Элементам справочника Номенклатура могут быть назначены единицы измерения, взятые из справочника ЕдиницыИзмерения. Причем, в справочнике Номенклатура могут существовать элементы, которым не назначена ни одна единица измерения, а в справочнике ЕдиницыИзмерения могут присутствовать элементы, которые не назначены элементам справочника Номенклатура. В таблице 7.1 представлена таблица справочника Номенклатура - наименования номенклатурных позиций и соответствующие им единицы измерения.

    Таблица справочника Номенклатура
    Номенклатура Единица измерения Группа
    Бальзам для волос ложь
    Духи Штука ложь
    Завивка Час ложь
    Лак для волос Упаковка ложь
    Одеколон Упаковка ложь
    Парикмахерские услуги истина
    Парфюмерия истина
    Стрижка Час ложь
    Уход за волосами истина

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

    В таблице 7.2 вы можете видеть состав справочника ЕдиницыИзмерения.

    Таблица справочника ЕдиницыИзмерения
    Единица измерения
    Килограмм
    Метр
    Упаковка
    Час
    Штука

    Левое внешнее соединение

    При левом соединении таблиц Номенклатура и ЕдиницыИзмерения в выборку попадут все записи из справочника Номенклатура и только те записи из справочника ЕдиницыИзмерения, которые соответствуют условиям соединения. Если записи из справочника Номенклатура не соответствует ни одна запись из справочника ЕдиницыИзмерения, поле окажется пустым - в него будет записано значение Null.

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

    (рис 7.21) Конструктор запроса, вкладка Таблицы и поля

    В область Таблицы добавлены таблицы справочников Номенклатура и ЕдиницыИзмерения, в область Поля добавлены поля Номенклатура.Наименование и ЕдиницыИзмерения.Наименование.

    Если на вкладке .

    (рис 7.22) Конструктор запроса, вкладка Связи

    По умолчанию здесь установлен выбор всех элементов справочника Номенклатура и подбор соответствующих им полей из справочника ЕдиницыИзмерения по следующему условию:

    Номенклатура.ЕдиницаИзмерения = ЕдиницыИзмерения.Ссылка

    То есть - условие предполагает выполнение равенства реквизита ЕдиницаИзмерения справочника Номенклатура с элементом справочника ЕдиницыИзмерения.

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

    Сделаем еще некоторые настройки в .

    (рис 7.23) Конструктор запроса, вкладка Объединения/Псевдонимы

    Здесь, в поле .

    (рис 7.24) Конструктор запроса, вкладка Объединения/Псевдонимы

    Теперь настройки .

    (рис 7.25) Результат выполнения запроса

    Мы получили следующий текст запроса:

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

    Команда ЛЕВОЕ СОЕДИНЕНИЕ задает способ соединения таблиц.

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

    Правое внешнее соединение

    Правое соединение в точности противоположно левому. Из первой таблицы выбираются только те строки, которым находятся соответствия во второй таблице. А из второй выбираются все строки. Вместо "недостающих" строк первой таблицы подставляется значение Null.

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

    (рис 7.26) Результат выполнения запроса

    Вот какой текст запроса у нас получился:

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

    Как видите, таблица ЕдиницыИзмерения представлена здесь в полном объеме, а вот из таблицы Номенклатура выбраны лишь те позиции, которым назначена единица измерения.

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

    На рис 7.27 вы можете видеть вкладку Связи Конструктора запросов. Здесь мы сняли галочку из поля Все таблицы Номенклатура и установили ее в поле Все для таблицы ЕдиницыИзмерения.

    (рис 7.27) Конструктор запроса, вкладка Связи

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

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

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

    (рис 7.28) Результат выполнения запроса

    Полное внешнее соединение

    При полном внешнем соединении в результат запроса попадают все поля из таблиц, участвующих в запросе. В .

    (рис 7.29) Конструктор запроса, вкладка Связи

    Текст запроса выглядит следующим образом:

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

    На рис 7.30 представлен результат выполнения запроса:

    (рис 7.30) Результат выполнения запроса

    После того, как мы связывали таблицы правым соединением, наш запрос немного изменился. Сейчас мы, фактически, выбираем поля из таблицы ЕдиницыИзмерения и связываем с ними поля таблицы Номенклатура, однако такое изменение на правильность выполнения запроса не влияет.

    Внутреннее соединение

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

    (рис 7.31) Конструктор запроса, вкладка Связи

    Вот какой запрос сгенерировал Конструктор при таких настройках:

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

    А вот - результаты запроса, рис 7.32.

    (рис 7.32) Результат выполнения запроса

    7.4. Выводы

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

    Страницы:

    Цель лекции: научиться создавать внешние обработки, изучить основные сведения о запросах.

    7.1. Основные сведения о запросах

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

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

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

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

    Источники данных для запросов

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

    Реальные таблицы называются так потому, что они физически хранятся в базе данных. Реальные таблицы, в свою очередь, подразделяются на объектные (ссылочные) и необъектные (не ссылочные).

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

    В необъектных таблицах хранятся данные других типов - например - записи регистров.

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

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

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

    Написание текста запроса

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

    Выполнение запроса и обработка результатов запроса

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

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

    7.2. Создание внешней обработки КонсольЗапросов

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

    Войдем в .

    (рис 7.1) Начало создания внешней обработки

    Введем в поле имя КонсольЗапросов, для начала редактирования формы обработки нажмем на кнопку Открыть в поле Основная форма внешней обработки. Появится окно Конструктор формы обработки, оставим в нем все по умолчанию и нажмем Готово.

    Добавим в форму элемент управления Поле текстового документа, зададим ему имя ТекстЗапроса, установим в параметре Расширение значение Язык запросов. Добавим в список реквизитов формы новый реквизит, зададим ему имя ТекстЗапросов и тип Строка.

    Это позволит использовать в данном поле, при работе в режиме 1С:Предприятие, конструктор запросов, синтаксические конструкции языка запросов будут автоматически выделяться, рис 7.2.

    (рис 7.2) Добавление в форму внешней обработки поля текстового документа

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

    Теперь добавим в форму еще один элемент управления - табличное поле. Зададим ему имя - .

    (рис 7.3) Добавление в форму внешней обработки табличного поля

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

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

    Процедура КнопкаВыполнитьНажатие(Кнопка)
    	Запрос = Новый Запрос;
    	Запрос.Текст=ЭлементыФормы.ТекстЗапроса.ПолучитьТекст();
    	РезультатВыполненияЗапроса = Запрос.Выполнить().Выгрузить();
    	ЭлементыФормы.РезультатВыполненияЗапроса.СоздатьКолонки();
    КонецПроцедуры

    Поясним ее команды. Они, в основном, связаны с новым для вас объектом Запрос.

    Запрос = Новый Запрос;

    Создаем новый объект типа Запрос, записываем ссылку на него в переменную Запрос.

    Запрос.Текст=ЭлементыФормы.ТекстЗапроса.ПолучитьТекст();

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

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

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

    ЭлементыФормы.РезультатВыполненияЗапроса.СоздатьКолонки();

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

    После того, как создание обработки завершено, сохраним ее командой главного меню программы Файл > Сохранить.

    Файлы внешних обработок имеют расширение *.EPF, рис 7.4.

    (рис 7.4) Сохраняем внешнюю обработку

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

    (рис 7.5) Внешняя обработка, открытая в режиме 1С:Предприятие

    Сейчас все готово для ваших первых экспериментов с запросами.

    7.3. Изучение конструктора запросов и языка запросов

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

    Щелкнем правой кнопкой мыши по свободному пространству в поле ввода текста запроса в обработке .

    (рис 7.6) Конструктор запроса

    Конструктором запроса можно пользоваться и в режиме конфигурирования, причем, там он, преимущественно, и используется при составлении запросов.

    Окно конструктора запроса имеет несколько вкладок. Вкладка Таблицы и поля служит для указания таблиц ( реальных и виртуальных ), из которых будут отбираться данные, и конкретных полей этих таблиц, которые и попадут в результаты запроса.

    Вкладка .

    (рис 7.7) Набор таблиц базы данных

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

    Рабочая область Таблицы окна Конструктор запроса содержит список таблиц, из которых система выбирает данные. Этот список формируется переносом нужных таблиц из рабочей области База данных.

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

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

    Если вспомнить устройство справочника .

    (рис 7.8) Выбор таблиц и полей

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

    (рис 7.9) Предварительный просмотр текста запроса

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

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

    Как вы уже могли понять, в поле ТекстЗапроса попадет следующий текст:

    ВЫБРАТЬ
    	Сотрудники.ФизическоеЛицо.Фамилия
    ИЗ
    	Справочник.Сотрудники КАК Сотрудники

    Весь этот текст представляет собой описание запроса. Ключевое слово ВЫБРАТЬ обязательно должно присутствовать в начале описания. Оно показывает, какие именно данные должен получать запрос.

    Ключевое слово ИЗ позволяет задавать источники данных для запроса. В нашем случае мы видим здесь следующий текст:

    Справочник.Сотрудники КАК Сотрудники

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

    Вернемся к пояснениям области ВЫБРАТЬ. Здесь имеется следующая команда:

    Сотрудники.ФизическоеЛицо.Фамилия

    Этой командой мы обращаемся к таблице ФизическоеЛицо, которая хранится в таблице Сотрудники (напомним, что это - псевдоним) и выбираем из нее фамилию сотрудника. Полям, которые попадают в выборку данных, создаваемую запросом, так же можно назначать псевдонимы с помощью ключевого слова КАК.

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

    Теперь нажмем на кнопку .

    (рис 7.10) Результат выполнения запроса

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

    Получим из справочника ЕдиницыИзмерения коды и наименования единиц измерения. В результатах запроса поле Код должно иметь наименование " Код ", поле " Наименование " - " Название ". Справочник ЕдиницыИзмерения нужно представить в запросе как ТабЕдИзм.

    Написание запроса удобно начинать с группы ИЗ. Напишем следующий шаблон:

    ВЫБРАТЬ
    ИЗ
        Справочник.ЕдиницыИзмерения как ТабЕдИзм

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

    ВЫБРАТЬ
    	ТабЕдИзм.Код,
    	ТабЕдИзм.Наименование КАК Название
    ИЗ
        Справочник.ЕдиницыИзмерения как ТабЕдИзм

    Исполним запрос, рис 7.11.

    (рис 7.11) Результат выполнения запроса

    Усложним задачу. Результат предыдущего запроса нужно упорядочить по полю Название.

    Для этого в запросе нужно использовать конструкцию УПОРЯДОЧИТЬ ПО. Теперь наш запрос будет выглядеть так:

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

    На рис 7.12 вы можете видеть результат выполнения запроса

    (рис 7.12) Результат выполнения запроса

    При составлении запроса можно задавать выбор не всех результатов, полученных из базы, а лишь тех, которые удовлетворяют какому-либо условию. Наиболее простое проявление этого утверждения - выбор некоторого количества первых элементов результата. Реализуется это с использованием слова ПЕРВЫЕ с указанием количества отбираемых элементов. Обратите внимание на то, что элементы выбираются с учетом их упорядочивания, заданного в запросе.

    Выберем первые 2 элемента из результатов, модифицировав предыдущий запрос:

    ВЫБРАТЬ ПЕРВЫЕ 2
    	ТабЕдИзм.Код,
    	ТабЕдИзм.Наименование КАК Название
    ИЗ
        Справочник.ЕдиницыИзмерения как ТабЕдИзм
    УПОРЯДОЧИТЬ ПО 
        Название

    Выполним запрос (рис 7.13).

    (рис 7.13) Результат выполнения запроса

    Для того чтобы в выборку попали лишь различные элементы, можно воспользоваться ключевым словом РАЗЛИЧНЫЕ после слова ВЫБРАТЬ.

    Выше мы делали выборки из неиерархического справочника .

    ВЫБРАТЬ
    	*
    ИЗ
        Справочник.Номенклатура
    (рис 7.14) Результат выполнения запроса

    Как видите, в результат запроса попали не только элементы справочника ( . Это поле у обычных элементов справочника принимает значение ложь, у групп - истина.

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

    ВЫБРАТЬ
    	ТабНоменклатура.Наименование
    ИЗ
    	Справочник.Номенклатура КАК ТабНоменклатура
    ГДЕ
    	НЕ ТабНоменклатура.ЭтоГруппа
    (рис 7.15) Результат выполнения запроса

    Рассмотрим еще один вариант отбора результатов запроса, а заодно еще немного продвинемся в изучении Конструктора запроса.

    Нам нужно отобрать среди документов поступления материалов лишь те, сумма которых превышает 2000 рублей, и вывести в результаты запроса даты, номера документов, ФИО материально-ответственного лица, принявшего материалы, а так же сумму документа, упорядочив выводимые строки по сумме документа.

    Откроем :

  • ПоступлениеМатериалов.Дата
  • ПоступлениеМатериалов.Номер
  • ПоступлениеМатериалов.ОтветственныйСотрудник
  • ПоступлениеМатериалов.СтоимостьМатериалов
  • (рис 7.16) Конструктор запроса, вкладка Таблицы и поля

    Теперь нам нужно задать условие отбора. Для этого перейдем на вкладку ) нужно выбрать условие выбором их списка (мы выбрали условие "больше") и заменить выражение СтоимостьМатериалов на число 2000.

    (рис 7.17) Конструктор запроса, вкладка Таблицы и поля

    Здесь нас подстерегает одна особенность конструктора запросов. Дело в том, что и выражение СтоимостьМатериалов, и число 2000 он будет воспринимать как имя переменной, которая должна быть передана в запрос до его исполнения. Нам же нужно, чтобы 2000 было воспринято именно как число, а не как имя переменной. Для того, чтобы это сделать, установим галочку в поле Произвольное. Это приведет к тому, что поле Условие превратится в одну строку, в которой будет написано следующее:

    ПоступлениеМатериалов.СтоимостьМатериалов > 2000

    Символ .

    (рис 7.18) Конструктор запроса, вкладка Условия

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

    (рис 7.19) Конструктор запроса, вкладка Порядок

    Работа с .

    (рис 7.20) Текст запроса и результат выполнения запроса

    Вот, какой текст сгенерировал Конструктор запроса:

    ВЫБРАТЬ
    	ПоступлениеМатериалов.Дата,
    	ПоступлениеМатериалов.Номер,
    	ПоступлениеМатериалов.ОтветственныйСотрудник,
    	ПоступлениеМатериалов.СтоимостьМатериалов КАК СтоимостьМатериалов
    ИЗ
    	Документ.ПоступлениеМатериалов КАК ПоступлениеМатериалов
    ГДЕ
    	ПоступлениеМатериалов.СтоимостьМатериалов > 2000
    
    УПОРЯДОЧИТЬ ПО
    	СтоимостьМатериалов

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

    Существуют следующие виды соединения таблиц:

  • Левое внешнее соединение;
  • Правое внешнее соединение;
  • Полное внешнее соединение;
  • Внутреннее соединение;
  • Рассмотрим эти виды соединения таблиц на примере.

    В нашей конфигурации есть два взаимосвязанных справочника. А именно, речь идет о справочниках Номенклатура и ЕдиницыИзмерения. Элементам справочника Номенклатура могут быть назначены единицы измерения, взятые из справочника ЕдиницыИзмерения. Причем, в справочнике Номенклатура могут существовать элементы, которым не назначена ни одна единица измерения, а в справочнике ЕдиницыИзмерения могут присутствовать элементы, которые не назначены элементам справочника Номенклатура. В таблице 7.1 представлена таблица справочника Номенклатура - наименования номенклатурных позиций и соответствующие им единицы измерения.

    Таблица справочника Номенклатура
    Номенклатура Единица измерения Группа
    Бальзам для волос ложь
    Духи Штука ложь
    Завивка Час ложь
    Лак для волос Упаковка ложь
    Одеколон Упаковка ложь
    Парикмахерские услуги истина
    Парфюмерия истина
    Стрижка Час ложь
    Уход за волосами истина

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

    В таблице 7.2 вы можете видеть состав справочника ЕдиницыИзмерения.

    Таблица справочника ЕдиницыИзмерения
    Единица измерения
    Килограмм
    Метр
    Упаковка
    Час
    Штука

    Левое внешнее соединение

    При левом соединении таблиц Номенклатура и ЕдиницыИзмерения в выборку попадут все записи из справочника Номенклатура и только те записи из справочника ЕдиницыИзмерения, которые соответствуют условиям соединения. Если записи из справочника Номенклатура не соответствует ни одна запись из справочника ЕдиницыИзмерения, поле окажется пустым - в него будет записано значение Null.

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

    (рис 7.21) Конструктор запроса, вкладка Таблицы и поля

    В область Таблицы добавлены таблицы справочников Номенклатура и ЕдиницыИзмерения, в область Поля добавлены поля Номенклатура.Наименование и ЕдиницыИзмерения.Наименование.

    Если на вкладке .

    (рис 7.22) Конструктор запроса, вкладка Связи

    По умолчанию здесь установлен выбор всех элементов справочника Номенклатура и подбор соответствующих им полей из справочника ЕдиницыИзмерения по следующему условию:

    Номенклатура.ЕдиницаИзмерения = ЕдиницыИзмерения.Ссылка

    То есть - условие предполагает выполнение равенства реквизита ЕдиницаИзмерения справочника Номенклатура с элементом справочника ЕдиницыИзмерения.

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

    Сделаем еще некоторые настройки в .

    (рис 7.23) Конструктор запроса, вкладка Объединения/Псевдонимы

    Здесь, в поле .

    (рис 7.24) Конструктор запроса, вкладка Объединения/Псевдонимы

    Теперь настройки .

    (рис 7.25) Результат выполнения запроса

    Мы получили следующий текст запроса:

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

    Команда ЛЕВОЕ СОЕДИНЕНИЕ задает способ соединения таблиц.

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

    Правое внешнее соединение

    Правое соединение в точности противоположно левому. Из первой таблицы выбираются только те строки, которым находятся соответствия во второй таблице. А из второй выбираются все строки. Вместо "недостающих" строк первой таблицы подставляется значение Null.

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

    (рис 7.26) Результат выполнения запроса

    Вот какой текст запроса у нас получился:

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

    Как видите, таблица ЕдиницыИзмерения представлена здесь в полном объеме, а вот из таблицы Номенклатура выбраны лишь те позиции, которым назначена единица измерения.

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

    На рис 7.27 вы можете видеть вкладку Связи Конструктора запросов. Здесь мы сняли галочку из поля Все таблицы Номенклатура и установили ее в поле Все для таблицы ЕдиницыИзмерения.

    (рис 7.27) Конструктор запроса, вкладка Связи

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

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

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

    (рис 7.28) Результат выполнения запроса

    Полное внешнее соединение

    При полном внешнем соединении в результат запроса попадают все поля из таблиц, участвующих в запросе. В .

    (рис 7.29) Конструктор запроса, вкладка Связи

    Текст запроса выглядит следующим образом:

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

    На рис 7.30 представлен результат выполнения запроса:

    (рис 7.30) Результат выполнения запроса

    После того, как мы связывали таблицы правым соединением, наш запрос немного изменился. Сейчас мы, фактически, выбираем поля из таблицы ЕдиницыИзмерения и связываем с ними поля таблицы Номенклатура, однако такое изменение на правильность выполнения запроса не влияет.

    Внутреннее соединение

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

    (рис 7.31) Конструктор запроса, вкладка Связи

    Вот какой запрос сгенерировал Конструктор при таких настройках:

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

    А вот - результаты запроса, рис 7.32.

    (рис 7.32) Результат выполнения запроса

    7.4. Выводы

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

    Вернуться к учебному плану