Порядок работы с объектом встроенного языка запрос. Для чего предназначен объект конфигурации "Язык"

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

Встроенный язык системы «1С: Предприятие» имеет много общих черт с другими языками программирования, но не является прямым аналогом какого-либо из них. Наиболее значимые его особенности:

· мягкая типизация (тип переменной определяется типом значения, которое она содержит, и может изменяться в процессе работы);

· отсутствие программного описания прикладных типов (они создаются при добавлении объектов конфигурации);

· событийная ориентированность встроенного языка;

· все операторы имеют как русское, так и английское написание, которое можно использовать одновременно.

Модули конфигурации

Для размещения текста программы на встроенном языке предназначены модули прикладного решения. Эти модули располагаются в различных местах конфигурации и имеют различное назначение. Большинство модулей «привязано» к определенным объектам конфигурации или к самому прикладному решению.

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

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

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

· Модуль внешнего соединения . В конфигурации всегда существует единственный модуль внешнего соединения. Он выполняется при обращении к приложению как к COM-серверу (в режиме внешнего соединения). В режиме внешнего соединения запускается не полноценное приложение «1С: Предприятия», а «облегченный вариант», в котором недоступны все функции, так или иначе связанные с организацией пользовательского интерфейса.

· Модули прикладных объектов . Каждый прикладной объект конфигурации (например, документ ПКО или справочник), данные которого могут быть модифицированы в режиме «1С: Предприятие», имеет свой модуль. Помимо описания переменных и основной программы, модуль объекта может содержать описание процедур – обработчиков событий, связанных с данным объектом конфигурации. Есть два события, которые вызываются для всех объектов - ПередЗаписью и ПриЗаписи .

· Модули форм . Каждая форма имеет свой модуль, в котором определяется поведение формы и действия, выполняемые из нее, например, открытие других форм. Для всех форм вызываются события ПередОткрытием, ПриОткрытии, ПередЗакрытием и ПриЗакрытии .

Контекст

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

· Глобальный контекст , доступный во всех остальных контекстах, состоит из следующих частей:

§ свойства, методы и события глобального контекста (например, свойство РабочаяДата );

§ системные перечисления и системные наборы значений (например, КодВозвратаДиалога и Символы ).

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

· В контексте модуля приложения или модуля внешнего соединения доступны экспортируемые процедуры и функции общих модулей.

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

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

Схематично взаимосвязь контекстов изображена на рис. 2. Нарис. 3 изображено возможное взаимодействие модуля формы журнала и модуля документа.


Процедуры и функции

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

Процедуры и функции могут иметь параметры, которые определяют, какие действия и с какими объектами она должна сделать. Параметры процедуры или функции по умолчанию передаются по ссылке. Это означает, что изменение формального параметра внутри процедуры или функции приведет к изменению фактического параметра в том месте, где она вызывается. Чтобы гарантированно передать параметр по значению, нужно перед именем параметра вставить ключевое слово Знач .

Пример 1:

Процедура Расчет()

Сумма=Цена*Количество;

КонецПроцедуры

Расчет(); // Вызов процедуры

Пример 2:

Перем Глоб;

// Описание процедуры

Процедура Расчет(Пар1, Пар2, ПарЗ) Экспорт

Глоб = Глоб + Пар1 + Пар2 + ПарЗ;

КонецПроцедуры

Расчет(5, 6, 7); // Вызов процедуры

Пример 3:

Перем Глоб;

// Описание функции

Функция Расчет(Пар1, Пар2, ПарЗ) Экспорт

Лок = Глоб + Пар1 + Пар2 + ПарЗ;

Возврат Лок;

КонецФункции

Рез = Расчет(5, 6, 7); // Вызов функции

Типы данных

Число, Строка, Дата, Булево, значение Неопределено, значение Null (для неуказанных значений в таблицах базы данных)

Тип. Значения специального типа «Тип» нужны для представления и сравнения типов данных, например:

Объявление переменных

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

· после их объявления при помощи оператора Перем.

Перем <Имя_переменной> [Экспорт];

Перем А,В;

· после первого размещения имени переменной в левой части оператора присваивания.

Пример:

· при определении имен идентификаторов редактируемых элементов диалога;

· при задании формальных параметров процедур.

Приведение типов

Приведение типов может быть явное и неявное.

Для явного приведения существуют следующие функции: Число, Строка, Дата, Булево. Неявное приведение типов производится системой автоматически при вычислении выражений.

Пример: значение числовой переменной НомерМесяца неявно преобразуется в строку и присоединяется к другой строке:

А= «Месяц»+НомерМесяца;

Справочники

Работа со справочниками производится с помощью следующих объектов:

· СправочникиМенеджер. Обеспечивает доступ ко всем справочникам конфигурации. Свойства этого объекта совпадают с именами справочников и содержат объекты типа СправочникМенеджер.

· СправочникМенеджер. Обеспечивает доступ к операциям над справочником как множеством элементов. Через методы этого объекта можно осуществлять поиск, получать выборку, создавать новые элементы, обращаться к формам и макетам справочника.

· СправочникСсылка. Однозначно идентифицирует элемент (группу) справочника и позволяет обращаться к нему в режиме «только чтение». Через свойства и методы этого объекта можно прочитать реквизиты элемента (группы), обратиться к его табличным частям. Значение этого типа хранится в реквизитах, ссылающихся на элементы данного справочника, например, в реквизите Сотрудник документа ПриемНаРаботу хранится ссылка на конкретный элемент справочника Сотрудники.

· СправочникОбъект. Предоставляет доступ к элементу с возможностью записи. Данный объект содержит методы, влияющие на элемент в базе данных, например, методы Записать и Удалить .

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

· СправочникСписок. Объект для управления списком элементов в табличном поле. Позволяет управлять колонками, отбором и сортировкой в списке.

В системе 1С:Предприятие?

1. Тексты конфигурации и базы данных хранятся в формате UNICODE

3. Нет правильного ответа

6.75 С какой целью тексты конфигурации и базы данных хранятся в формате UNICODE ?

1. Формат UNICODE обеспечивает неизменность (независимость от программной платформы операционной системы) представления информации

2. Формате UNICODE позволяет поддерживать различные языки в системе 1С:Предприятие

3. Нет правильного ответа

6.76 Механизмы интернационализации, заложены . ..

1. технологическую платформу 1С:Предприятия

2. прикладные решения

3. верны ответы 1 и 2

4. нет правильного ответа

6.77 Что такое код локализации?

1. Строка, состоящая из кода языка и кода страны и идентифицирующая некоторый регион мира

2. Код программного продукта (указывается на регистрационной анкете, документации из комплекта поставки)

3. Параметр форматирования строки для преобразования

4. Her правильного ответа

6.78 Верно ли что в 1С:Предприятие 8 любая текстовая информация может включать одновременно символы различных языков?

1. Да, так как все тексты конфигурации и базы данных хранятся в формате UNICODE

2. В зависимости от настроек, заданных при создании информационной базы

3. Только если это предусмотрено конфигурацией

6.79 Для чего предназначен объект конфигурации "Язык"?

1. Для создания интерфейса программы на разных языках

2. Для создания текстовых документов на разных языках

3. Такого объекта в 1С: Пред приятие 8 не существует

6.80 Каким образом можно сменить язык просмотра (редактирования) конфигурации?

1. С помощью кнопки выбора языка, расположенной в строке состояния справа от кнопки "NUM"

2. Через пункт меню "Конфигурация - Язык редактирования конфигурации"

3. В 1 С:Предприятие такой возможности не существует

4. Верпы ответы 1 и 2

6.81 Какое написание имеют операторы встроенного языка?

1. Только русское написание

3.

6.82 Возможно ли использование в одном исходном тексте операторов встроенного языка в русском и английском написании?

1. Только при специальных настройках конфигуратора

2. Да, для этого не требуется изменения каких-либо настроек конфигуратора

3. Нет, так как вариант встроенного языка задается в свойствах конфигурации

6.83 С какой целью используется встроенный язык?

1. Для определения интерфейса программы по умолчанию

2. Для описания (на стадии разработки конфигурации) алгоритмов функционирования прикладной задачи

3. Нет правильного ответа

6.84 Какое написание имеют функции встроенного языка?

1. Только русское написание

2. Только английское написание

3. Русское и английское написание

4. В зависимости от настроек конфигуратора

6.85 Что обозначает параметр Л (L ) в форматной строке функции форматирования ЧислоПрописью()?

1. Признак "дробную часть выводить числом/прописью"

2. Количество знаков после запятой

3. Код локализации

7. Табличная модель прикладного решения

7.1 При настройке ограничения доступа к данным допускается установка нескольких (по числу полей) ограничений:

1. Для права "Чтение"

2. Для права "Изменение"

3. Для права "Добавление"

4. Для права "Удаление"

5. Для всех вышеперечисленных прав

6. Для всех возможных прав

7.2 При настройке ограничения доступа к данным в качестве значений, по которым производится ограничения доступа к данным, могут использоваться:

1. Только значения параметров сеанса

2. Только данные из таблиц (запросов)

3. Значения параметров сеанса и данные из таблиц (запросов)

4. Только значения имеющие типы: Число, Строка, Булево, Дата

7.3 Каким из вышеперечисленных способов можно воспользоваться, чтобы в разделе "Поля" конструктора запросов появились код и наименование справочника?

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

2. Не заполняя раздел "Таблицы", сразу выбирать нужные объекты из таблиц - источников данных раздела "База данных", перенося их в раздел "Поля", используя технологию Drag & Drop. Раздел "Таблицы" заполняется автоматически

3. Сначала заполнить раздел "Таблицы", а потом, выбирая нужные объекты из этого раздела, перенести их в раздел "Поля", используя кнопки па форме ">" "»"

4. Верны ответы I и 3

5. Верны ответы I, 2 и 3

7.4 Для повышения скорости выполнения запроса необходимо:

1. Задавать параметры большинства реальных таблиц

2. Задавать параметры большинства виртуальных таблиц

3. Вместо задания параметров у реальной или виртуальной таблицы использовать отбор, заданный конструкцией языка запросов "ГДЕ"

4. Верны ответы I и 2

7.5 Можно ли при выборе таблицы-источника в раздел "Таблицы" конструктора запросов задавать для нее новое имя (псевдоним)?

1. Да, можно

2. Да, можно, но только если в качестве источника данных выступает вложенный запрос

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

4. Верны ответы 1 и 2

5. Верны ответы 1 и 3

7.6 Вложенный запрос может использоваться:

1. В качестве таблицы-источника данных

2. В качестве операнда операций сравнения "В" или "НЕ В" при задании параметров виртуальной таблицы

3. В качестве операнда операций сравнения "В" или "НЕ В" при задании конструкции языка запросов "ГДЕ"

4. Верпы ответы 1, 2 и 3

7.7 Можно ли, используя конструктор запроса, получить итоги по иерархии?

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

2. Можно, если для группировочного поля указать тип итогов "Только иерархия"

3. Верпы ответы 1 и 2

7.8 На закладке "Условия" конструктора запросов отдельная строка списка условий может быть сформирована:

1. С помощью двойного клика левой клавишей мыши на нужном поле в списке доступных полей

2. Путем переноса нужного поля в список, используя технологию Drag & Drop

3. Нажать кнопку "Добавить". Если условие произвольное, то текст условия можно ввести "вручную"

4. Вызвав контекстное меню, выбрать в нем пункт "Добавить". Возможно использование произвольного выражения

5. Верны все вышеперечисленные ответы

7.9 На закладке "Связи" конструктора запросов можно определить:

1. Соединение таблиц-источников данных и связи между ними

2. Объединение таблиц-источников данных и связи между ними

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

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

7.10 При соединении таблиц-источников данных в конструкторе запросов можно:

1. Назначить соединение без указания условия связи

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

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

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

7.11 Создание соединения таблиц-источников данных в конструкторе запросов допускает:

1. Соединение только двух таблиц-источников данных

2. Соединение необходимого количества таблиц-источников данных

3. Соединение только двух таблиц-источников данных, причем флажок "Все" обязательно должен быть проставлен хотя бы у одной из таблиц

Basic , что облегчает его освоение начинающими разработчиками. Однако он не является прямым аналогом какого-либо из перечисленных языков.

Вот лишь некоторые, наиболее значимые особенности встроенного языка:

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

Событийная ориентированность встроенного языка. Назначение встроенного языка в системе 1С:Предприятие определяется идеологией создания прикладных решений. Прикладные решения в 1С:Предприятии 8.0 не кодируются целиком. Большая часть прикладного решения создается разработчиком путем визуального конструирования - создания новых объектов конфигурации, задания их свойств, форм представления, взаимосвязей и пр. Встроенный язык используется лишь для того, чтобы определить поведение объектов прикладного решения, отличное от типового, и создать собственные алгоритмы обработки данных.

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

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

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

Предопределенные типы данных

Платформа 1С:Предприятия 8.0 позволяет разработчику использовать различные типы данных.

Существует большое количество типов данных, которые определены на уровне самой платформы. Например, это примитивные типы данных , такие как строка, число, дата и пр.


Описание примитивных типов данных :

  • NULL - отсутствующее значение. Используется, например, в запросах.
  • Неопределено - пустое, неопределенное значение. Используется, например, при оценке передачи параметров, в том случае, если при вызове процедуры или функции данный параметр опущен. Реквизиты, имеющие составной тип данных, по умолчанию имеют тип "Неопределено".
  • Булево - содержит два значения: Истина или Ложь. Используется, например, в логических выражениях - логическое выражение имеет тип "Булево".
  • Дата - содержит дату и время. По умолчанию имеет значение - 01.01.01 00:00:00 дата начала нашей эры. Время измеряется от начала дня. Запись выражения, имеющего литерал типа "дата", осуществляется следующим образом - "00010101000000". Сначала записывается год, потом месяц, потом число и потом время. Возможна следующая запись: "20041031". Время по умолчанию - начало дня.
  • Строка - бывает переменной, фиксированной и неограниченной длины. В общем случае рекомендуется использовать строки переменной длины.
  • Число - увеличена разрядность числа до 38 разрядов.
  • Тип - служит для определения типов значений. Используется, например, для сравнения типов данных. Не имеет литералов и возвращается функциями Тип(<Имя типа>) или ТипЗнч(<Значение>).

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


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

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

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

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

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

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

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

COMSafeArray . Представляет собой объектную оболочку над многомерным массивом SAFEARRAY из

Процедура ВыбратьИзФайлаНажатие(Элемент) // Выбор файла с просмотром ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогВыбораФайла.Каталог = ""; ДиалогВыбораФайла.ПредварительныйПросмотр = Истина; ДиалогВыбораФайла.ИндексФильтра = 0; Если ДиалогВыбораФайла.Выбрать() Тогда Файл = Новый Файл(ДиалогВыбораФайла.ПолноеИмяФайла); Картинка = Новый ХранилищеЗначения(Новый Картинка(ДиалогВыбораФайла.ПолноеИмяФайла)); ОтобразитьКартинку(); КонецЕсли; КонецПроцедуры

ЭТО_КЛЮЧЕВОЕ_СЛОВО
<Это конструкция языка>,
<Это конструкция языка>
ЭТО_ФУНКЦИЯ(<Это конструкция языка>)

В правилах, описывающих язык запросов, конструкции языка указываются в угловых скобках. Ключевые слова и названия функций описываются заглавными буквами.

Конструкции языка могут содержать необязательные элементы - ключевые слова и прочее. В правилах, описывающих язык запросов, необязательные элементы заключены в квадратные скобки «[» и «]»:

[ЭТО_НЕОБЯЗАТЕЛЬНОЕ_СЛОВО] [<Это необязательная конструкция>]

В некоторых случаях в конструкции языка может использоваться одна из нескольких альтернативных элементов. Такие элементы в правилах перечисляются через вертикальную черту «|»:

ЛИБО_ЭТО_СЛОВО | ЛИБО_ЭТО_СЛОВО
<Либо эта конструкция> | <Либо эта конструкция>

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

Комментарии в языке запросов

Текст запроса может включать комментарии. Комментарием счи­тается часть строки, начинающаяся с последовательности симво­лов // и продолжающаяся до конца строки:

// Это комментарий.

При выполнении запроса комментарии игнорируются.

Двуязычное представление ключевых слов

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

Основные секции текста запроса

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

<Описание запроса>
[<Объединение запросов>]
[<Упорядочивание результатов>]
[АВТОУПОРЯДОЧИВАНИЕ]
[<Описание итогов>]

Как видно из этого правила, текст запроса состоит из нескольких частей, или секций:

В секции <Упорядочивание результатов> можно опреде­лить условия упорядочивания строк в результате запроса. Упоря­дочивание результата запроса рассматривается на стр. 324 .

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

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

Описание запроса

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

Поля, которые будут содержаться в результате запроса;

Источники данных запроса - исходные таблицы;

Условия, влияющие на выборку данных в запросе;

Порядок группировки результатов запроса.

Секция описания запроса состоит из нескольких взаимосвязан­ных предложений:

ВЫБРАТЬ [РАЗЛИЧНЫЕ] [ПЕРВЫЕ <Количество>]
<Список полей выборки>
[ИЗ <Список источников>]
[ГДЕ <Условие отбора>]
[СГРУППИРОВАТЬ ПО <Поля группировки>]
[ИМЕЮЩИЕ <Условие отбора>]
[ДЛЯ ИЗМЕНЕНИЯ [ <Список таблиц верхнего уровня>]]

Описание запроса начинается с обязательного ключевого слова ВЫБРАТЬ .

Предложение ГДЕ <Условие отбора> позволяет отфильтро­вать результат запроса. В результат попадают только те записи, для которых указанное условие оказывается истинным. Правила описания условий отбора рассматриваются на стр. 315 .

Предложение ДЛЯ ИЗМЕНЕНИЯ предназначено для указания необходимости блокировки считываемых в транзакции данных.

Предложение СГРУППИРОВАТЬ позволяет описать порядок группировки результатов запроса. Подробно группировка рас­сматривается на стр. 316 .

Предложение ИМЕЮЩИЕ позволяет накладывать условия на ре­зультаты группировки. Описано на стр. 318 .

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

Приведем пример достаточно простого запроса, состоящего из одного оператора ВЫБРАТЬ и списка полей выборки.

//В отчет необходимо вывести список товарных накладных.

Результат запроса:

Использование слова РАЗЛИЧНЫЕ

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

// Необходимо узнать, каким вообще контрагентам
// отгружался товар за период.
Выбрать Документ.РасходнаяНакладная.Контрагент

Результат запроса:

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

Выбрать Различные Документ.РасходнаяНакладная.Контрагент

Результат запроса:

Использование слова ПЕРВЫЕ

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

// Необходимо отобрать пять самых дорогих товаров.
// Выборка должна осуществляться в порядке убывания цены товара.
Выбрать Первые 5
Справочник.Номенклатура.Наименование,
Справочник.Номенклатура.ЗакупочнаяЦена
Упорядочить По Справочник.Номенклатура.ЗахупочнаяЦена Убыв

Результат запроса:

Описание полей выборки

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

<Описание поля> [ [КАК] <Псевдоним поля>]

<Выражение>[.<Группа полей>]

Список полей выборки состоит из одного или нескольких эле­ментов, разделенных запятыми. Каждое <Поле выборки> со­стоит из описания поля выборки и необязательного псевдонима поля.

Вместо перечисления полей в списке выборки можно указать звездочку «*». Это будет означать, что результат запроса должен содержать все поля, которые есть в исходных таблицах - источ­никах данных запроса, описанных в списке источников.

Замечание! При указании звездочки «*» в списке полей вы­борки в результат не включаются виртуальные поля исходных таблиц.

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

В общем случае поле выборки может представлять собой не толь­ко ссылку на поле исходной таблицы, а некоторое <Выражение>. Подробно выражения рассмотрены на стр. 344 .

Результаты запроса могут быть сгруппированы с помощью агре­гатных функций, указанных в качестве выражений в полях вы­борки. Группировка результатов запроса рассматривается на стр. 316 . Агрегатные функции описаны на стр. 345 .

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

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

Псевдонимы полей в списке выборки

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

Ключевое слово КАК может предшествовать псевдониму поля. Это слово можно не указывать вообще, но если оно указано, по­вышается наглядность и удобочитаемость текста запроса.

Псевдонимы полей задаются в соответствии с правилами назна­чения идентификаторов переменных. Псевдонимы в запросе не могут совпадать.

Назначение псевдонимов полям само по себе никак не влияет на выборку данных в запросе.

// Необходимо выбрать из справочника товаров
// наименования товаров и наименования групп.
Выбрать
Справочник. Номенклатура.Наименование Как Товар,
Справочник. Номенклатура.Родитель.Наименование Как Группа
из
Справочник.Номенклатура

Результат запроса:

Обратите внимание, что поля в результате запроса поля называ­ются «Товар» и «Группа». Если бы псевдонимы полей не были указаны, поля в результате запроса назывались бы «Наименова­ние» и «Наименование1» (названия полей в результате запроса не могут совпадать, поэтому к названию второго поля автоматически добавлено «1»), что гораздо менее наглядно.

Вложенные таблицы в списке полей выборки

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

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

(<Список вложенных полей>) | *

<Вложенное поле [, <Вложенное поле>[, ...] ]

<Список вложенных полей> состоит из одного или не­скольких элементов, разделенных запятыми. Если список состоит из одного элемента, его не обязательно заключать в скобки.

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

<Выражение> [[КАК] <Псевдоним поля>]

<Вложенное поле> может представлять некоторое выражение. В простейшем случае <Выражение> - это ссылка на поле вло­женной таблицы. Подробно выражения рассмотрены на стр. 344 .

Каждому вложенному полю может быть назначен псевдоним. В дальнейшем <Псевдоним поля> может использоваться для более удобного обращения к данному полю, аналогично псевдо­нимам полей списка выборки - см. раздел «Псевдонимы полей в списке выборки» на

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

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

Документ.РасходнаяНакладная.Состав.(Номенклатура Как Товар, Количество)

Результат запроса:

Ссылка Состав
Товар Количество
Джинсы женские 4
Джинсы женские 5
Рубашка «Ковбойка» 5
Расходная накладная 00005 от 24.02.2002 0:00:00 Джинсы женские 1
Джинсы женские 1
Мойдодыр «Аквариум» 5
Раковина «Лилия» 8
Смеситель «Ультра» 10

Обратите внимание, что поле «Состав» результата запроса пред­ставляет собой вложенную таблицу, имеющую поля «Номенкла­тура» и «Количество».

//В отчет вывести все поля табличной части накладной.
Выбрать
Документ.РасходнаяНакладная.Ссылка,
Документ.РасходнаяНакладная.Состав.*

Задача предложения ИЗ состоит в том, чтобы обозначить список исходных таблиц - источников данных, используемых в данном операторе ВЫБРАТЬ.

Следует, отметить, что предложение ИЗ в языке запросов являет­ся опциональным. Оно может быть опущено в том случае, если источники данных полностью квалифицированы в описании спи­ска полей выборки, содержащегося в предложении ВЫБРАТЬ. Обратите внимание, что ряд примеров в предыдущих разделах не содержал предложения ИЗ.

После ключевого слова ИЗ указывается список источников. В об­щем случае список источников описывается следующим набором правил:

<Источник>[, <Источник>[, ...]]

Источники данных запроса перечисляются в списке источников через запятую. Каждый <Источник> в списке источников обя­зательно включает в себя описание источника; кроме того, может быть указан <Перечень соединений> - правила соединений источника с другими источниками. Спецификации соединений описываются .

<Описание источника> [ <Перечень соединений> ]

Если в качестве источника данных выступает таблица информа­ционной базы, <Описание источника> содержит <Имя таблицы>.

<Таблица> [ [КАК] <Псевдоним источника>]

Если исходная таблица виртуальная, могут быть указаны <Параметры> ее формирования. Подробно параметры виртуальных таблиц описаны в разделе «Источники данных запросов».

<Имя таблицы> [(<Параметры>)] | <Описание запроса>

В качестве источника данных запроса может выступать также вложенный запрос; в этом случае описание источника содержит <Описание запроса>. Использование вложенных запросов описано на.

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

Спецификации соединений

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

Результат запроса:

Контрагент Банк
Поставщики АКБ ИвестБанк
Поставщики АКБ ПромСтройБанк
Трикотажная фабрика «Заря» АКБ ИвестБанк
Трикотажная фабрика «Заря» АКБ ПромСтройБанк
Фабрика джинсовой одежды АКБ ИвестБанк
Фабрика джинсовой одежды АКБ ПромСтройБанк
Покупатели АКБ ИвестБанк
Покупатели АКБ ПромСтройБанк
Ярмарка одежды АКБ ИвестБанк
Ярмарка одежды АКБ ПромСтройБанк
Торговый дом «Буденовский» АКБ ИвестБанк
Торговый дом «Буденовский» АКБ ПромСтройБанк
Павильон 45 на оптовом рынке АКБ ИвестБанк
Павильон 45 на оптовом рынке АКБ ПромСтройБанк
Бавария - фарфор АКБ ИвестБанк
Бавария - фарфор АКБ ПромСтройБанк
Фабрика джинсовой одежды АКБ ИвестБанк
Фабрика джинсовой одежды АКБ ПромСтройБанк
АКБ ПромСтройБанк АКБ ИвестБанк
АКБ ПромСтройБанк АКБ ПромСтройБанк

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

Соединения бывают нескольких видов, они описываются сле­дующими правилами:

<Соединение> [<Перечень соединений>]

В общем случае <Перечень соединений> может содержать и описывать не только одно соединение (двух источников), но и несколько соединений нескольких источников сразу.

[ВНУТРЕННЕЕ] СОЕДИНЕНИЕ <Описание источника> ПО <Условие отбора> |

ЛЕВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ <Описание источника> ПО <Условие отбора> |

ПРАВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ <Описание источника> ПО <Условие отбора> |

ПОЛНОЕ (ВНЕШНЕЕ] СОЕДИНЕНИЕ <Описание источника> ПО <Условие отбора>

<Условие отбора> содержит условия, в соответствии с кото­рыми в выборке необходимо соединить данные из исходных таб­лиц - источников запроса. Правила описания условий в языке запросов рассматриваются на стр. 357 .

Ключевые слова ЛЕВОЕ, ПРАВОЕ и ПОЛНОЕ уточняют характер соединения. Слова ВНУТРЕННЕЕ или ВНЕШНЕЕ можно не указывать вообще, они повышают наглядность и удобочитаемость тек­ста запроса.

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

[ВНУТРЕННЕЕ] СОЕДИНЕНИЕ означает, что из обеих исходных таблиц - источников данных в результат запроса необходимо включить только те комбинации записей, которые соответствуют указанному условию. Остальные записи в результат не попадают.

// Необходимо выяснить, какие банки является одновременно
// контрагентами (одинаковые наименования присутствует
//и в справочнике Контрагенты, и в справочнике Банки).
Выбрать

Банки.Ссылка Как Банк
Из

Внутреннее Соединение
Справочник.Банки Как Банки
По

Результат запроса:

Контрагент Банк
АКБ ПромСтройБанк АКБ ПромСтройБанк

ЛЕВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Но, в отли­чие от внутреннего соединения, в результат запроса надо вклю­чить также еще и записи из первого (указанного слева от слова СОЕДИНЕНИЕ) источника, для которых не найдено соответст­вующих условию записей из второго источника.

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

//В отчет необходимо вывести всех контрагентов, а для тех,
// кто является также банком - указать ссылку на банк.
Выбрать
Контрагенты.Ссылка Как Контрагент,
Банки.Ссылка Как Банк
Из
Справочник.Контрагенты Как Контрагенты
Левое Внешнее Соединение
Справочник.Банки Как Банки
По
Контрагенты.Наименование = Банки.Наименование

Результат запроса:

ПРАВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить также еще и записи из второго (указанного справа от слова СОЕДИНЕНИЕ) источника, для кото­рых не найдено соответствующих условию записей из первого ис­точника.

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

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

Результат запроса:

Контрагент Банк
NULL АКБ ИвестБанк
АКБ ПромСтройБанк АКБ ПромСтройБанк

ПОЛНОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить также еще и те записи из обо­их источников, для которых не найдено соответствий.

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

// В отчет необходимо вывести всех контрагентов и все банки,
// а.тех, кто является и тем, и другим - вывести в одной строке.
Выбрать
Контрагенты.Ссылка Как Контрагент,
Банки.Ссылка Как Банк
Из
Справочник.Контрагенты Как Контрагенты
Полное Внешнее Соединение
Справочник.Банки Как Банки
По
Контрагенты.Наименование = Банки.Наименование

Результат запроса:

Псевдонимы источников данных

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

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

Ключевое слово КАК может предшествовать псевдониму источ­ника. Это слово можно не указывать вообще, но если оно указано, повышается наглядность и удобочитаемость текста запроса.

Назначение псевдонимов источникам само по себе никак не влия­ет на выборку данных в запросе.

// Данный пример демонстрирует использование
// в списке полей выборки псевдонима Товар,
// назначенного исходной таблице Справочник.Номенклатура
Выбрать
Товар.Наименование,
Товар.Родитель
Из
Справочник.Номенклатура.Товар

Вложенные таблицы в списке источников

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

//В отчет необходимо вывести спецификацию товарных накладных -
// показать сам документ, номенклатуру и количество.
//В списке источников указана вложенная таблица «Состав» -
// табличная часть накладной.
// Выборка ограничена восемью записями, чтобы не перегружать пример.
Выбрать Первые 8
Ссылка, Номенклатура, Количество
Из
Документ.РасходнаяНакладная.Состав

Результат запроса:

Ссылка Номенклатура Количество
Расходная накладная 00007 от 25.02.2002 21:03:21 Джинсы женские 4
Расходная накладная 00006 от 25.02.2002 0:00:00 Джинсы женские 5
Расходная накладная 00006 от 25.02.2002 0:00:00 Рубашка «Ковбойка» 5
Расходная накладная 00005 от 01.03.2002 20:58:28 Джинсы женские 1
Расходная накладная 00004 от 01.03.2002 20:50:40 Джинсы женские 1
Расходная накладная 00003 от 23.02.2002 0:00:00 Мойдодыр «Аквариум» 5
Расходная накладная 00003 от 23.02.2002 0:00:00 Раковина «Лилия» 8
Расходная накладная 00003 от 23.02.2002 0:00:00 Смеситель «Ультра» 10

Обратите внимание, что при указании вложенной таблицы в спи­ске источников допускается обращение, как к полям самой вло­женной таблицы, так и к полям таблицы верхнего уровня (той, которая содержит вложенную таблицу). В данном случае проис­ходит обращение к полю «Ссылка» самого документа.

Вложенные запросы в списке источников

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

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

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

Создание отчетов

Работа с запросами

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

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

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

Реальные таблицы, в свою очередь, могут быть объектными (ссылочными) или не объектными (не ссылочными):

Отличительной особенностью реальных таблиц является то, что они содержат данные какой-либо одной реальной таблицы, хранящейся в базе данных. Например, реальными таблицами являются таблица «Справочник.Клиенты», соответствующая справочнику «Клиенты» или таблица «РегистрНакопления.ОстаткиМатериалов», соответствующая регистру накопления «ОстаткиМатериалов».

Виртуальные таблицы формируются, в основном, из данных нескольких таблиц базы данных. Например, виртуальной таблицей является таблица «РегистрНакопления.ОстаткиМатериалов.ОстаткиИОбороты», формируемая из нескольких таблиц регистра накопления «ОстаткиМатериалов». Иногда виртуальные таблицы могут формироваться и из одной реальной таблицы (например, виртуальная таблица «Цены.СрезПоследних» формируется на основе таблицы регистра сведений «Цены»). Однако общим для всех виртуальных таблиц является то, что им можно задать ряд параметров, которые будут определять, какие данные будут включены в эти виртуальные таблицы. Набор таких параметров может быть различным для разных виртуальных таблиц, и определяется данными, хранящимися в исходных таблицах базы данных.

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

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

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

Язык запросов

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

    описание запроса,

    объединение запросов,

    упорядочивание результатов,

    автоупорядочивание,

    описание итогов.

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

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

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

Упорядочивание результатов определяет условия упорядочивания строк результата запроса.

Автоупорядочивание позволяет включить режим автоматического упорядочивания строк результата запроса.

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

Отчет РеестрДокументовОказаниеУслуги

Первым отчетом, на основе которого мы начнем знакомиться с языком запросов, будет отчет «РеестрДокументовОказаниеУслуги». Этот отчет просто будет выводить список существующих в базе данных документов «ОказаниеУслуги» в порядке их дат и номеров.

Создадим в конфигураторе новый объект конфигурации Отчет «РеестрДокументовОказаниеУслуги». Перейдем на закладку «Макет» и запустим конструктор выходной формы.

В качестве источника данных для запроса выберем объектную (ссылочную) таблицу документов «ОказаниеУслуги». Из этой таблицы выберем следующие поля:

  • «Мастер»,

    «Клиент»:

Обратите внимание, что при выборе полей «Склад», «Мастер» и «Клиент» в список выбранных полей подбираются также поля «Склад.Представление», «Мастер.Представление» и «Клиент.Представление». Дело в том, что в общем случае подразумевается, что эти поля будут выводиться в ячейки табличного документа. Поскольку соответствующие поля «Склад», «Мастер» и «Клиент» являются ссылочными, то в случае, если в качестве значения параметра для вывода будет передано значение-ссылка, система будет выполнять дополнительный запрос для получения представления этого поля (которое и будет выведено в документ), в результате чего вывод отчета замедлится. Поэтому система, при выборе ссылочных полей, предлагает сразу же включить в список выбранных полей и представления ссылочных полей, в расчете на то, что именно они и будут использованы для вывода в документ.

После этого перейдем на закладку «Порядок» и укажем, что результат запроса должен быть сначала упорядочен по значению поля «Дата», а затем - по значению поля «ОказаниеУслуги.Ссылка»:

Перейдем на закладку «Отчет» и сбросим флаг «Использовать построитель отчета»:

Сбросим флаг «Использовать построитель отчета»...

Нажмем «ОК». Конструктор сформирует форму отчета и макет. Откроем модуль формы и найдем в нем процедуру «РеестрДокументовОказаниеУслуги». В этой процедуре как разформируется текст запроса, который будет использован для получения интересующих нас данных:

Запрос.Текст = “ВЫБРАТЬ

ОказаниеУслуги.Дата КАК Дата,

ОказаниеУслуги.Номер КАК Номер,

ОказаниеУслуги.Склад,

ОказаниеУслуги.Склад.Представление,

ОказаниеУслуги.Мастер,

ОказаниеУслуги.Мастер.Представление,

ОказаниеУслуги.Клиент,

ОказаниеУслуги.Клиент.Представление

Документ.ОказаниеУслуги КАК ОказаниеУслуги

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

Текст запроса начинается, как мы говорили выше, с части описания запроса:

I ОказаниеУслуги.Дата КАК Дата,

I ОказаниеУслуги.Номер КАК Номер,

I ОказаниеУслуги.Склад,

I ОказаниеУслуги.Склад.Представление,

I ОказаниеУслуги.Мастер,

I ОказаниеУслуги.Мастер.Представление,

I ОказаниеУслуги.Клиент,

1 ОказаниеУслуги.Клиеит.Представление

I Документ.ОказаниеУслуги КАК ОказаниеУслуги

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

После ключевого слова ИЗ указываются источники данных - исходные таблицы запроса, содержимое которых обрабатывается в запросе. В данном случае это объектная (ссылочная) таблица «Документ.ОказаниеУслуги». После ключевого слова КАК указывается псевдоним источника данных. В нашем случае это «ОказаниеУслуги». В дальнейшем к этому источнику данных можно будет обращаться в тексте запроса, используя псевдоним.

Такое обращение мы видим в описании полей выборки:

| ОказаниеУслуги.Дата КАК Дата,

| ОказаниеУслуги.Номер КАК Номер,

| ОказаниеУслуги.Склад,

| ОказаниеУслуги.Склад.Представление,

| ОказаниеУслуги.Мастер,

| ОказаниеУслуги.Мастер.Представление,

| ОказаниеУслуги.Клиент,

| ОказаниеУслуги.Клиент.Представление

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

После части описания запроса в нашем примере следует часть упорядочивания результатов:

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

| Дата, | Номер";

Предложение УПОРЯДОЧИТЬ ПО позволяет сортировать строки в результате запроса. После этого ключевого предложения располагается выражение упорядочивания, которое, в общем случае, представляет собой перечисление полей (выражений) и порядка вывода. В нашем случае упорядочивание будет выполняться сначала По полю выборки, обращение к которому выполняется через псевдоним - «Код», а затем по полю - «Номер». В обоих случаях порядок сортировки будет по возрастанию, который является Порядком сортировки по-умолчанию.

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

Процедура РеестрДокументовОказаниеУслуги(ТабДок) Экспорт

//{{КОНСТРУКТОР_ВЫХОДНЬК_ФОРМ(РеестрДокументовОказаниеУслугн) // Данный фрагмент построен конструктором. // При повторном использовании конструктора, // внесенные вручную изменения будут утеряны!!!

Макет = ПолучитьМакет("РеестрДокументовОказаниеУслуги"); Запрос = Новый Запрос;

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

ОбластъЗаголовок = Макет.ПолучитьОбласть("Заголовок"); ОбластьПодвал =

Макет.ПолучитьОбласть("ПодвалТаблицы"); ОбластьДетальныхЗаписей =

ТабДок.Вывести(ОбластьШапкаТаблицы); ТабДок.НачатьАвтогрутшировкуСтрок();

ВыборкаДетали = Результат.Выбрать();

Пока ВыборкаДетали.Следукнций() Цикл

ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);

ТабДок.Вывести(ОбластьДетальньпсЗаписей, ВыборкаДетали.Уровень()); КонецЦикла;

/Л}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ КонецПроцедуры

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

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

ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок"); ОбластьПодвал =

Макет.ПолучитьОбласть("Подвал"); ОбластьШапкаТаблицы =

Макет.ПолучитьОбласть("ШапкаТаблицы"); ОбластьПодвалТаблицы =

Макет.ПолучитьОбласть("ПодвалТаблицы""); ОбластьДетальныхЗаписей =

Макет.ПолучитьОбласть("Детали");

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

ТабДок.Очистить(); ТабДок.Вывести(ОбластьЗаголовок);

ТабДок.Вывести(ОбластьШапкаТаблицы); ТабДок.НачатьАвтогруппировкуСтрок();

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

После этого мы получаем выборку из результата запроса, которую перебираем в цикле:

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

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

ТабДок.ЗакончитьАвтогруппировкуСтрок();

ТабДок.Вывести(ОбластьПодвалТаблицы);

ТабДок.Вывести(ОбластьПодвал);

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

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

Отчет «Рейтинг услуг» будет содержать информацию о том, выполнение каких услуг принесло OOO «На все руки мастер» наибольшую прибыль в указанном периоде. На примере отчета «Рейтинг услуг» мы проиллюстрируем, как отбирать данные в некотором периоде, как задавать параметры запроса и как использовать в запросе данные из нескольких таблиц и включать в результат запроса все данные одного из источников.

Создадим новый объект конфигурации Отчет «РейтингУслуг». Перейдем на закладку «Макеты» и вызовем конструктор выходной формы.

Выберем объектную (ссылочную) таблицу справочника «Номенклатура» и виртуальную таблицу регистра накопления «Продажи.Обороты». Для того чтобы исключить неоднозначность имен в запросе, переименуем таблицу «Номенклатура» в «СпрНоменклатура» (контекстное меню правой кнопки мыши).

Затем установим курсор на таблицу «ПродажиОбороты» и вызовем диалог ввода параметров виртуальной таблицы:

Откроем диалог ввода параметров виртуальной таблицы

Укажем, что начало и конец периода будут переданы в соответствующих параметрах «ДатаНачала» и «ДатаОкончания» (символ «&» перед именем указывает, что это параметр запроса):

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

СпрНоменклатура.Представление

ПродажиОборотыВыручкаОборот

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

Единственное, что нам останется сделать, это сбросить флаг «Все» у таблицы регистра и установить его у таблицы справочника.

Будем выбирать все элементы из справочника «Номенклатура»

Установка флага «Все» у таблицы справочника будет означать, что из справочника будут выбраны все элементы и этим элементам будет поставлено в соответствие значение оборота выручки из регистра. Таким образом, в результате запроса будут присутствовать все услуги, и для некоторых из них будут указаны обороты выручки. Для тех услуг, которые не оказывались в выбранном периоде, не будет указано ничего.

Перейдем на закладку «Условия» и зададим условия выбора элементов из справочника «Номенклатура». При задании условий выбора мы снова будем использовать параметры запроса. Первым условием должно быть то, что выбранный элемент не является группой (для этого следует переключиться в режим «Произвольное условие»).

Вторым условием должно быть то, что выбранный элемент является услугой (это - «Простое условие»):

В дальнейшем, перед выполнением запроса, мы передадим в параметр «ВидНоменклатуры» - соответствующее значение перечисления.

Перейдем на закладку «Объединения/Псевдонимы» и укажем, что представление элемента справочника будет иметь псевдоним «Услуга», а поле регистра будет иметь псевдоним «Выручка»:

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

На закладке «Итоги» определим, что нужно выводить общие итоги, и они должны представлять собой сумму значений поля «Выручка»:

На закладке «Отчет» сбросим флаг «Использовать построитель отчета».

Теперь перейдем на закладку «Выходная форма». Укажем, что параметры «ДатаОкончания» и «ДатаНачала» будут редактироваться в форме в полях ввода с типом «Дата». Для параметра «ВидНоменклатуры» мы наоборот снимем признак редактирования в форме:

Нажмем «ОК». Платформа сформирует макет и форму отчета Откроем модуль формы и найдем в нем процедуру «РейтингУслуг».

В этой процедуре, в той части, где выполняется установка параметров запроса, определим значение параметра «ВидНоменклатуры» (исправления выделены жирным шрифтом):

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи,Обороты(&ДатаНачала,

| &ДатаОкончания,)

| КАК ПродажиОбороты

|УПОРЯДОЧИТЬ ПО | ВыручкаУБЫВ

|ИТОГИ СУММА(Выручка) ПО | ОБЩИЕ";

ЗапросУстановитьПараметрС"ВидНоменклатуры",

Перечисления.ВидыНоменклатуры.Услуга);

Запрос.УстановитьПараметр("ДатаНачала",ДатаНачала); Запрос.УстановитьПараметрС"ДатаОкончания", ДатаОкончания);

Теперь рассмотрим текст запроса, сформированный конструктором:

| СпрНоменклатура.Представление КАК Представление,

|ПродажиОбороты.ВыручкаОборот КАК Выручка

| Справочник.Номенклатура КАК СпрНоменклатура

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНачала,

| КАК ПродажиОбороты

| ПО ПродажиОбороты.Номенклатура = СпрНоменклатура.Ссылка

| (СпрНоменклатура.ЭтоГруппа = Ложь) И

| СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры

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

| ВыручкаУБЫВ

|ИТОГИ СУММА(Выручка) ПО

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

При описании источников запроса (после ключевого слова ИЗ), использована возможность определения нескольких источников запроса:

| Справочник.Номенклатура КАК СпрНоменклатура

|&ДатаОкончания,)

| КАК ПродажиОбороты

| ПО ПродажиОбороты.Номенклатура = СпрНоменклатура.Ссылка

В данном случае выбираются записи из двух источников: «СпрНоменклатура» и «ПродажиОбороты», причем ключевым предложением ЛЕВОЕ СОЕДИНЕНИЕ ... ПО описан способ, которым будут скомбинированы между собой записи этих двух источников.

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

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

| РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания,)

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

Если заранее известно, что пользователя не будут интересовать результаты работы отчета в периодах, указанных с точностью до секунд, то следует учесть следующую особенность: по умолчанию время в дате установлено в 00:00:00. Поэтому, если не предпринять специальных мер, получится, что когда пользователь задаст период отчета с 01.03.2004 по 31.03.2004, итоги регистра будут рассчитаны с начала дня 01.03.2004 00:00:00 по начало дня 31.03.2004 00:00:00. Таким образом, данные за 31 число, отличные от начала дня, в расчет не войдут, что сильно удивит пользователя.

Для того чтобы исключить эту ситуацию, следует сделать две вещи.

Во-первых, в форме отчета ограничить пользователя в возможностях ввода даты начала и даты окончания, установив для соответствующих полей ввода состав даты как «Дата»:

Определим состав даты...

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

ПроцедураДействияФормыРейтингУслугСформировать(Кнопка) //{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА(РейтингУслуг) //Данный фрагмент построен конструктором. // При повторном использовании конструктора, // внесенные вручную изменения будут утеряны!!!

ТабДок = ЭлементыФормы.ТабличноеПоле;

//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА

КонецПроцедуры

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

| СпрНоменклатура.Представление КАК Представление,

| ПродажиОбороты.ВыручкаОборот КАК Выручка

| Справочник.Номенклатура КАК СпрНоменклатура

| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&ДатаНачала,

| &ДатаОкончания,

| КАК ПродажиОбороты

| ПО ПродажиОбороты.Номенклатура = СпрНоменклатура.Ссьшка

| СпрНоменклатура.ЭтоГруппа = Ложь И

| СпрНоменклатура.ВидНоменклатуры = &ВидНоменклатуры

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

ИТОГИ СУММА(Выручка) ПО

Она всегда начинается с ключевого слова ИТОГИ, за которым следует описание того, какие итоги будут присутствовать в результате запроса. Сразу после слова ИТОГИ описываются агрегатные функции, которые необходимо рассчитывать в итогах. В нашем случае будет рассчитываться сумма по полю «Выручка». Затем следует ключевое слово ПО, после которого описываются группировки, в которых должны быть рассчитаны итоги. В нашем случае они отсутствуют, и используется только ключевое слово ОБЩИЕ, которое указывает на то, что итоги будут рассчитаны по всей таблице в целом.

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

Зададим период отчета с 01.03.2004 по 30.04.2004. Результат будет выглядеть следующим образом:

Теперь изменим дату окончания на 31.03.2004 и убедимся, что данные за 31 марта попадают в отчет: