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

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

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

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

Рис. 97. Таблицы запроса

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

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

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

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

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

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

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

· описание запроса;

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

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

· АВТОУПОРЯДОЧИВАНИЕ;

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

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

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

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

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

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

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

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

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

Исходные данные для компоновки отчета содержит в себе схема компоновки данных – это наборы данных и методы работы с ними (рис. 98).

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

Например, схема компоновки может содержать следующий набор данных (рис. 99).

Рис. 98. Общая схема работы с системой компоновки данных

Рис. 99. Пример схемы компоновки (набор данных и запрос, его использующий)

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

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

Например, может быть задана такая структура отчета (рис. 100):

Рис. 100. Структура возможного отчета

Сформированный отчет может иметь следующий вид (рис. 101).

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

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

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

Рис. 101. Пример отчета

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

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

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

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

Рис. 102. Схема работы системы компоновки

3.12.1. Создание отчета "Реестр документов Оказание услуги"

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

Отчет . Присвойте ему имя РеестрДокументовОказаниеУслуги . На закладке Основные нажмите кнопку "Готово ". В конструкторе схемы компоновки данных добавьте Набор данных – запрос Конструктор запроса ".

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

Дата; Номер; Склад; Мастер; Клиент.

Рис. 103. Выбранные поля

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

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

Нажмите кнопку "ОK " и посмотрите, какой запрос сформировал конструктор запроса.

Перейдите на закладку Настройки и добавьте новую группировку в структуру отчета (рис. 105).

Рис. 105. Командная панель закладки Настройки

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

Дата; Номер; Склад; Мастер; Клиент (рис. 106).

Рис. 106. Настройка структуры отчета

Реестр документов оказание услуги . Нажмите кнопку "Сформировать " и посмотрите на результат работы отчета (рис. 107).

Рис. 107. Отчет Реестр документов оказание услуги

Отчет . Назовите его РейтингУслуг . На закладке Основные нажмите кнопку "Открыть схему компоновки данных ". В открывшемся диалоговом окне конструктора макета нажмите кнопку "Готово ".

В конструкторе схемы компоновки данных создайте Набор данных – запрос (НаборДанных1) и нажмите кнопку "Конструктор запроса ".

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

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

Рис. 108. Выбранные поля

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

Единственное, что необходимо сделать, это сбросить флаг Все у таблицы регистра и установить его у таблицы справочника СпрНоменклатура (рис. 109).

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

Рис. 109. Установка связей таблиц

Перейдите на закладку Условия и задайте условия выбора элементов из справочника Номенклатура (рис. 110). При задании условий выбора необходимо будет использовать параметры запроса. Первым условием должно быть то, что выбранный элемент не является группой (для этого следует переключиться в режим Произвольное условие – установить флаг Произвольное ). Затем в поле условие введите следующий текст:

СпрНоменклатура.ЭтоГруппа = ЛОЖЬ

Вторым условием должно быть то, что выбранный элемент является услугой (это – Простое условие ) (рис. 110).

Рис. 110. Условия выбора элементов

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

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

Рис. 111. Объединения/Псевдонимы

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

Перейдите на закладку Ресурсы и нажмите кнопку ">> ", чтобы конструктор выбрал все доступные ресурсы, по которым можно вычислять итоги. В вашем случае – это единственный ресурс Выручка (рис. 112).

Рис. 112. Ресурсы схемы компоновки данных

Перейдите на закладку Параметры (рис. 113).

Рис. 113. Параметры компоновки данных

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

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

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

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

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

Нажмите кнопку "ОK ".

Вторая особенность заключается в том, что по умолчанию время в дате установлено 00:00:00. Поэтому, если пользователь задаст период отчета с 01.10.2009 по 31.10.2009, итоги регистра будут рассчитаны с начала дня 01.10.2009 00:00:00 по начало дня 31.10.2009 00:00:00. Таким образом, данные за 31 число, отличные от начала дня, в расчет не войдут, что сильно удивит пользователя. Для того чтобы исключить эту ситуацию, добавьте еще один параметр, в который пользователь будет вводить дату окончания. Значение параметра КонецПериода будет рассчитываться автоматически таким образом, чтобы оно указывало на конец дня даты, введенной пользователем. Поэтому для параметра КонецПериода установите флаг Ограничение доступности .

Рис. 114. Редактирование состава даты

С помощью кнопки командной панели добавьте новый параметр с именем ДатаОкончания (рис. 115).

Рис. 115. Добавление параметра ДатаОкончания

Для этого параметра платформа автоматически сформирует заголовок – Дата окончания . Оставьте его без изменений. Задайте тип значения параметра – Дата . При этом, как и для параметра НачалоПериода , укажите состав даты – Дата .

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

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

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

В ячейке Выражение задайте для параметра КонецПериода следующее выражение:

В результате перечисленных действий параметры компоновки будут иметь следующий вид (рис. 116):

Рис. 116. Параметры системы компоновки

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

Рис. 117. Установка значения параметра ВидНоменклатуры

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

Затем перейдите на закладку Другие настройки и задайте заголовок отчета – РейтингУслуг (рис. 119).

Рис. 119. Установка заголовка отчета

Запустите 1С:Предприятие в режиме отладки.

Выберите отчет Рейтинг услуг , но перед тем, как нажать кнопку "Сформировать ", откройте Настройки и на закладке Параметры данных задайте период отчета с 01.03.2004 по 30.04.2004 (рис. 120). Если даты создания ваших документов отличаются от приведенных в примере, то период отчета следует задавать другим.

Рис. 120. Настройки отчета

Нажмите кнопку "OK " и сформируйте отчет. Результат будет выглядеть следующим образом (рис. 121):

Рис. 121. Результат выполнения отчета

Теперь измените дату окончания на 31.03.2004. Данные за 31 марта попадают в отчет (рис. 122).

Рис. 122. Результат выполнения отчета

3.12.3. Создание отчета "Выручка мастеров"

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

Создайте новый объект конфигурации Отчет . Назовите его ВыручкаМастеров и запустите конструктор основной схемы компоновки данных.

Добавьте Набор данных – запрос (НаборДанных1) и нажмите кнопку "Конструктор запроса ". Выберите виртуальную таблицу регистра накопления Продажи.Обороты .

Задайте один из параметров этой виртуальной таблицы – Периодичность . Для этого перейдите в поле Таблицы и нажмите кнопку "" (рис. 123).

Рис. 123. Изменение параметров виртуальной таблицы

В открывшемся окне параметров задайте значение параметра Периодичность – День (рис. 124). Нажмем кнопку "OK ".

Рис. 124. Параметры виртуальной таблицы

После этого выберите из таблицы следующие поля:

· ПродажиОбороты.Мастер;

· ПродажиОбороты.Период;

· ПродажиОбороты.Клиент;

· ПродажиОбороты.ВыручкаОборот (рис. 125).

Рис. 125. Выбранные поля

Теперь перейдите на закладку Объединения/Псевдонимы и задайте псевдоним Выручка для поля ПродажиОбороты.ВыручкаОборот (рис. 126).

Рис. 126. Объединения/Псевдонимы

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

Рис. 127. Поля группировок

На закладке Порядок укажите, что результат запроса будет отсортирован по возрастанию значения поля Период . Нажмите кнопку "ОK ". Рассмотрите текст запроса, сформированный конструктором.

Теперь перейдите к редактированию схемы компоновки данных. На закладке Ресурсы нажмите кнопку ">> " и убедитесь, что конструктор выбрал единственный имеющийся ресурс – Выручка .

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

Для параметра НачалоПериода задайте заголовок Дата начала . В поле Доступные типы задайте состав даты – Дата .

Для параметра КонецПериода задайте выражение:

КонецПериода(&ДатаОкончания, "День")

В поле Ограничение доступности установите флаг ограничения доступности.

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

В результате перечисленных действий параметры компоновки данных будут иметь следующий вид (рис. 128):

Рис. 128. Параметры компоновки данных

Теперь необходимо создать структуру отчета. На закладке Настройки последовательно создайте две вложенные группировки: верхнего уровня – по полю Мастер , вложенная в нее – по полю Период . Затем добавьте еще одну группировку, вложенную в группировку по полю Период , – Детальные записи (без указания группировочного поля) (рис. 129).

Рис. 129. Структура отчета

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

В заключение, с уровня глобального отчета перейдите на закладку Другие настройки и измените следующие параметры. Для параметра установите значение Отдельно и только в итогах ; для параметра задайте значение Начало и для параметра Заголовок задайте значение Выручка мастеров (рис. 130).

Рис. 130. Установка вывода общих итогов в начало

Запустите 1С:Предприятие в режиме отладки и посмотрите на результат работы отчета Выручка мастеров за период с 01.03.2004 по 30.04.2004 (рис. 131).

Рис. 131. Результат выполнения отчета

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

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

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

Рис. 132. Настройки группировки Период

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

Перейдите на закладку Поля группировки . Для поля Период установите Тип дополнения – День (рис. 133).

Рис. 133. Установка типа дополнения периода

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

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

Для того чтобы обеспечить именно такую работу отчета, войдите в режим редактирования первого поля (например, дважды кликнув на нем) и нажмите на кнопку очистки "Х ". После этого, нажав на кнопку "Т ", вы сможете выбрать тип данных, отображаемых в этом поле. Выберите Поле компоновки данных (рис. 134).

Рис. 134. Выбор типа данных

Нажмите кнопку "OK ". Теперь нажмите в поле ввода кнопку выбора "" и в открывшемся окне выбора поля отметьте параметр НачалоПериода (рис. 135). Нажмите кнопку "OK ".

Рис. 135. Выбор поля

Для второго поля ввода аналогичным образом укажите, что дата окончания периода будет получена из параметра ДатаОкончания (рис. 136).

Рис. 136. Настройки группировки Период

Запустите 1С:Предприятие в режиме отладки и выполните отчет Выручка мастеров за период с 20.03.2004 по 20.04.2004 (рис. 137).

Рис. 137. Результат выполнения отчета

3.12.4. Создание отчета "Перечень услуг"

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

Создайте новый объект конфигурации Отчет . Назовите его ПереченьУслуг и запустите конструктор схемы компоновки данных. Создайте новый Набор данных – запрос (НаборДанных1) и вызовите конструктор запроса.

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

Вызовите диалог ввода параметров виртуальной таблицы ЦеныСрезПоследних и укажите, что период будет передан в параметре ДатаОтчета (рис. 138).

Рис. 138. Параметры виртуальной таблицы

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

· СпрНоменклатура.Родитель;

· ЦеныСрезПоследних.Цена (рис. 139).

Рис. 139. Выбранные поля

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

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

Рис. 140. Условия выбора элементов

На закладке Объединения/Псевдонимы укажите, что поле Родитель будет иметь псевдоним ГруппаУслуг , а поле Ссылка – Услуга (рис. 141).

Рис. 141. Объединения/Псевдонимы

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

Рис.142. Поля группировки

Нажмите кнопку "OK ". Посмотрите текст запроса.

Перейдите к редактированию схемы компоновки данных. На закладке Ресурсы нажатием кнопки ">> " выберите единственный доступный ресурс Цена .

На закладке Параметры задайте значение параметра ВидНоменклатуры как Перечисление.ВидыНоменклатуры.Услуга . Кроме этого снимите ограничение доступности для параметра ДатаОтчета и задайте ему заголовок – Дата отчета . В поле Доступные типы задайте состав даты – Дата . Для параметра Период , наоборот, установите ограничение доступности (рис. 143).

Рис. 143. Параметры схемы компоновки

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

Рис. 144. Структура и выделенные поля отчета

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

Рис. 145. Структура отчета

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

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

Затем перейдите к настройкам конкретной группировки – ГруппаУслуг . Для параметра Расположение итогов этой группировки укажите значение Нет . Вернитесь к настройкам всего отчета в целом.

Для параметра Расположение полей группировок укажите значение Отдельно и только в итогах (так отчет будет лучше "читаться"). Напоследок задайте заголовок отчета – Перечень услуг .

Запустите 1С:Предприятие в режиме отладки и прежде всего откройте периодический регистр Цены .

Добавьте в него еще одно значение для услуги Диагностика : новая цена услуги на 01.04.2004 – 350 (рис. 146). Это позволит протестировать отчет.

Рис. 146. Записи регистра "Цены"

Теперь выполните отчет Перечень услуг по состоянию на 31.03.2004 (рис. 147).

Рис. 147. Результат выполнения отчета

Ваш отчет правильно отражает цену услуги Диагностика на 31.03.2004 – 200 руб.

Еще раз выполните отчет, но теперь уже на другую дату - 01.04.2004 (рис. 148).

Рис. 148. Результат выполнения отчета

Как видите, показана новая цена услуги Диагностика - 350 руб.

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

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

Логически диаграмма является совокупностью точек, серий и значений серий в точке (рис. 149).

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

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

Диаграмма как объект встроенного языка имеет три области, которые позволяют управлять оформлением диаграммы: область построения, область заголовка и область легенды (рис. 150).

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

Рис. 149. Пример диаграммы

Рис. 150. Области диаграммы

Создайте в конфигураторе новый объект конфигурации Отчет . Назовите его РейтингКлиентов , откройте его основную схему компоновки данных.

Создайте набор данных – запрос (НаборДанных1) и вызовите конструктор запроса. Выберите виртуальную таблицу регистра накопления Продажи.Обороты и из нее одно поле – ПродажиОбороты.Клиент .

Затем добавьте новое поле (значок Добавить в командной панели над списком полей) и при помощи построителя выражений определите его как разность между выручкой и стоимостью (рис. 151).

Рис. 151. Редактор произвольного выражения поля

В результате список выбранных полей будет иметь следующий вид (рис. 152):

Рис. 152. Выбранные поля

На закладке Объединения/Псевдонимы укажите, что вычисляемое поле будет иметь псевдоним Доход (рис. 153).

Рис. 153. Объединения/Псевдонимы

На закладке Порядок укажите, что строки результата нужно упорядочивать по убыванию значения поля Доход . Нажмите кнопку "OK " и посмотрите, какой текст сформировал конструктор запроса.

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

В отличие от всех предыдущих отчетов, структура которых содержала группировки, в этот раз добавьте в структуру отчета диаграмму (рис. 154).

Рис. 154. Структура отчета

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

Теперь перейдите на закладку Выбранные поля и выберите поле Доход для вывода в отчет. Структура отчета должна принять следующий вид (рис. 155):

Рис. 155. Структура отчета и настройки диаграммы

На закладке Другие настройки задайте заголовок отчета – Рейтинг клиентов , а также выберите тип диаграммы – Круговая объемная .

Запустите 1С:Предприятие в режиме отладки и откройте отчет Рейтинг клиентов (рис. 156).

Рис. 156. Круговая объемная диаграмма в отчете

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

Откройте настройки отчета и измените тип диаграммы на Измерительная . Заново сформируйте отчет (рис. 157).

Рис. 157. Измерительная диаграмма в отчете

3.12.6. Создание отчета "Универсальный"

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

Создайте в конфигураторе новый объект конфигурации Отчет . Присвойте ему имя Универсальный . Откройте его основную схему компоновки данных и создайте новый набор данных – запрос (НаборДанных1).

Вызовите конструктор запроса и выберите виртуальную таблицу регистра накопления Продажи.Обороты . Из этой таблицы выберите все поля (рис. 158).

Рис. 158. Выбранные поля

На закладке Группировка с помощью кнопок ">> " выберите все поля, доступные для группировки, а все ресурсы добавьте в Суммируемые поля (рис. 159).

Рис. 159. Поля группировки и ресурсы

Нажмите кнопку "OK " и посмотрите на текст, сформированный конструктором запроса.

Закончите создание схемы компоновки данных тем, что на закладке конструктора схемы компоновки Ресурсы выберите все доступные ресурсы (нажмите ">> "). На этом работа со схемой компоновки данных завершена, закройте ее и вернитесь к окну редактирования объекта конфигурации Отчет Универсальный .

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

На экране откроется основная форма отчета. Как видите, система уже вставила за вас поле табличного документа и присвоила ему имя Результат (рис. 160).

Рис. 160. Редактирование формы отчета

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

Установите курсор в верхнюю левую ячейку поля табличного документа и выполните Таблица –> Встроенные таблицы –> Вставить сводную таблицу . Система добавит в табличное поле сводную таблицу и откроет окно полей сводной таблицы (рис. 161).

Рис. 161. Сводная таблица

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

Перем ИсточникСводнойТаблицы;

После этого создайте обработчик события формы отчета При открытии (В окне свойства формы Отчет Универсальный) и добавьте в него следующий текст:

Процедура ПриОткрытии()

ИсточникСводнойТаблицы = Новый ИсточникДанныхСводнойТаблицыКомпоновкиДанных;

ИсточникСводнойТаблицы.УстановитьСхему(СхемаКомпоновкиДанных);

ЭлементыФормы.Результат.ВстроенныеТаблицы.СводнаяТаблица1.ИсточникДанных =

ИсточникСводнойТаблицы;

ИсточникСводнойТаблицы.УстановитьНастройки(КомпоновщикНастроек.Настройки);

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

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

Запустите 1С:Предприятие в режиме отладки и откройте отчет Универсальный . На экране появится форма отчета и окно выбора полей сводной таблицы (рис. 162).

Рис. 162. Отчет Универсальный

Поместите значение ресурса ВыручкаОборот в Область данных, измерение Номенклатура – в Область строк, а измерение Мастер – в Область колонок. Отчет примет следующий вид (рис. 163):

Рис. 163. Результат выполнения отчета

Теперь в окне выбора полей сводной таблицы раскройте группу Номенклатура и добавьте значение (Без иерархии) в строки (в выпадающем списке окна "Поля сводной таблицы" выбрать Поместить в строки ), а измерение Клиент добавьте в колонки (в выпадающем списке окна "Поля сводной таблицы" выбрать Поместить в колонки ). Отчет изменит свой вид (рис. 164).

Рис. 164. Результат выполнения отчета

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

3.12.7. Создание отчета "Универсальный 2"

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

Создайте новый объект конфигурации Отчет с именем Универсальный2 . Откройте его основную схему компоновки данных, создайте новый набор данных – запрос (НаборДанных1) и запустите конструктор запроса. Выберите все поля из виртуальной таблицы регистра накопления Продажи.Обороты и нажмите кнопку "OK ". На закладке Ресурсы конструктора схемы компоновки данных нажмите кнопку ">> " и убедитесь, что система подобрала три ресурса: ВыручкаОборот, КоличествоОборот и СтоимостьОборот .

На закладке Настройки создайте новую группировку Детальные записи (не выбирая поле группировки).

Теперь на закладке Формы окна редактирования отчета Универсальный2 с помощью конструктора создайте основную форму отчета и отредактируйте ее.

Растяните форму и расположите в ней две надписи с именами Поля и Порядок и с заголовками Поля: и Порядок: соответственно (рис. 165).

Под надписью Поля КоманднаяПанельПоля . Под надписью Порядок расположите командную панель с именем КоманднаяПанельПорядок . Под командными панелями расположите соответственно табличные поля с именами ТабличноеПолеПоля и ТабличноеПолеПорядок. (рис. 166). В окне свойств командной панели КоманднаяПанельПоля установите флаг АвтоЗаполнение и ИсточникДействий – ТабличноеПолеПоля . В окне свойств командной панели КоманднаяПанельПорядок установите флаг АвтоЗаполнение и ИсточникДействий – ТабличноеПолеПорядок .

Рис. 165. Редактирование формы отчета

Рис. 166. Форма отчета Универсальный2

Теперь для табличного поля ТабличноеПолеПоля задайте источник данных как ОтчетОбъект.КомпоновщикНастроек.Настройки.Выбор (рис. 167).

Рис. 167. Задайте источник данных для табличного поля

Аналогично табличному полю ТабличноеПолеПорядок укажите источник данных ОтчетОбъект.КомпоновщикНастроек.Настройки.Порядок .

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

В системе 1С:Предприятие 8 имеется небольшой набор уже готовых макетов оформления для использования системой компоновки данных. Они содержатся в объекте БиблиотекаМакетовОформленияКомпоновкиДанных .

Поместите еще одну надпись с именем Оформление и заголовком Оформление: , а правее ее расположите поле выбора с именем ПолеВыбораОформление (рис. 168) без подписи.

Рис. 168. Редактирование формы отчета

В свойствах поля выбора откройте окно Строки списка выбора и заполните его именами макетов из библиотеки макетов оформления компоновки данных (см. рис. 169).

Рис. 169. Заполнение списка значений поля выбора

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

Процедура ПолеВыбораОформлениеПриИзменении(Элемент)

ПараметрыВывода = КомпоновщикНастроек.Настройки.ПараметрыВывода;

ПараметрМакетОформления = ПараметрыВывода.НайтиЗначениеПараметра(Новый

ПараметрКомпоновкиДанных("МакетОформления"));

ПараметрМакетОформления.Использование = Истина;

ПараметрМакетОформления.Значение = ПолеВыбораОформление;

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

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

Запустите 1С:Предприятие в режиме отладки и откройте отчет Универсальный2 .

В выбранные поля добавьте следующие поля:

· Мастер;

· Номенклатура;

· ВыручкаОборот.

Задайте порядок сортировки:

· Мастер по возрастанию;

· Номенклатура.ВидНоменклатуры по убыванию;

· Номенклатура по возрастанию.

Выберите оформление, например Зеленый , и нажмите кнопку "Сформировать ". Результат будет выглядеть следующим образом (рис. 170):

Рис. 170. Результат выполнения отчета

Теперь измените условия формирования отчета. Выберите поля Клиент, Номенклатура и ВыручкаОборот . Порядок сортировки будет по возрастанию значения поля Клиент , а вариант оформления – Море . Выполните отчет (рис. 171).

Рис. 171. Результат выполнения отчета


3.13. Оптимизация документа "ОказаниеУслуги"

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

Кроме того, средства 1С:Предприятие 8.1 позволяют вам управлять скоростью выполнения процедуры проведения документа, за счет использования механизма запросов.

Таким образом, оптимизация документа ОказаниеУслуги , преследует две цели:

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

· повышение скорости выполнения процедуры проведения документа.

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

После этого полностью удалите содержимое обработчика события ОбработкаПроведения в модуле документа ОказаниеУслуги и создайте в нем заготовку процедуры проведения. Текст запроса, выполняемого в режиме оперативного проведения (т.е. на текущую дату и время), будет отличаться от запроса, выполняемого при неоперативном проведении (т.е. "задним" числом). Поэтому формирование текста запроса необходимо включить в условие Если … Иначе … КонецЕсли:

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

Если Режим = РежимПроведенияДокумента.Оперативный Тогда

Запрос.Текст =

Иначе

Запрос.Текст =

КонецЕсли;

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

· Номенклатура;

· Количество;

· Номенклатура.ВидНоменклатуры;

Эти поля будут нужны для задания значений измерений регистров и их ресурсов. Кроме того, поле ВидНоменклатуры понадобится вам для анализа того, чем является номенклатура, указанная в документе: материалом или услугой (рис. 172).

Рис. 172. Выбранные поля

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

Поэтому добавьте к списку выбранных таблиц еще две (рис. 173).

РегистрНакопления.ОстаткиМатериалов.Остатки.

Рис. 173. Выбранные таблицы

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

Условие получения данных указывает, что остатки должны быть получены только по тем позициям номенклатуры, которые содержатся в проводимом документе (перед выполнением запроса в параметр СписокНоменклатурыДокумента необходимо передать список всех позиций номенклатуры, содержащихся в проводимом документе) – рис. 174.

Рис. 174. Параметры виртуальных таблиц

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

Рис. 175. Выбранные поля

Выберите еще раз виртуальную таблицу регистра накопления ОстаткиМатериаловОстатки и переименуйте ее в ОстаткиМатериаловОстаткиНаСкладе (рис. 176).

Рис. 176. Выбранные таблицы

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

Рис. 177. Параметры таблицы ОстаткиМатериаловОстаткиНаСкладе

Теперь из этой виртуальной таблицы выберите поле КоличествоОстаток (рис. 178).

Рис. 178. Выбранные поля

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

Рис. 179а. Выбранные таблицы

Рис. 179б. Условия связи между таблицами

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

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

Рис. 180. Укажите таблицы для изменения

Перейдите на закладку Условия и задайте условие отбора из таблицы документа только строк проводимого документа (ссылка на него будет передана в параметр запроса Ссылка) – рис. 181. Для этого дважды щелкните левой кнопкой мыши по полю Ссылка .

Рис. 181. Условие отбора из таблицы документа

Перейдите на закладку Объединения/Псевдонимы и задайте следующие псевдонимы полей: НоменклатураВидНоменклатуры –> ВидНоменклатуры; КоличествоОстаток1 –> КоличествоНаСкладе.

Нажмите кнопку "ОK " и посмотрите, какой текст запроса сформировал конструктор (значение переменной Запрос.Текст):

ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,

СтоимостьМатериаловОстатки.СтоимостьОстаток,

ОстаткиМатериаловОстаткиНаСкладе.КоличествоОстаток КАК КоличествоНаСкладе

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента)) КАК СтоимостьМатериаловОстатки

Материал В (&СписокНоменклатурыДокумента)) КАК ОстаткиМатериаловОстатки

ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура =

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени,

Материал В (&СписокНоменклатурыДокумента) И Склад = &СкладВДокументе)

КАК ОстаткиМатериаловОстаткиНаСкладе

ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура =

ОстаткиМатериаловОстаткиНаСкладе.Материал

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

РегистрНакопления.СтоимостьМатериалов.Остатки,

РегистрНакопления.ОстаткиМатериалов.Остатки

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

ОказаниеУслугиПереченьНоменклатуры.Номенклатура,

ОказаниеУслугиПереченьНоменклатуры.Количество,

ОказаниеУслугиПереченьНоменклатуры.Номенклатура.ВидНоменклатуры КАК

ВидНоменклатуры,

ОказаниеУслугиПереченьНоменклатуры.Сумма,

ОстаткиМатериаловОстатки.КоличествоОстаток,

СтоимостьМатериаловОстатки.СтоимостьОстаток

Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ОказаниеУслугиПереченьНоменклатуры

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(&МоментВремени, Материал В (&СписокНоменклатурыДокумента))

КАК СтоимостьМатериаловОстатки

ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура =

СтоимостьМатериаловОстатки.Материал

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(&МоментВремени,

Материал В (&СписокНоменклатурыДокумента))

КАК ОстаткиМатериаловОстатки

ПО ОказаниеУслугиПереченьНоменклатуры.Номенклатура =

ОстаткиМатериаловОстатки.Материал

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

РегистрНакопления.ОстаткиМатериалов.Остатки,

РегистрНакопления.СтоимостьМатериалов.Остатки;

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

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

Запрос.УстановитьПараметр("СкладВДокументе", Склад);

Если Режим = РежимПроведенияДокумента.Оперативный Тогда

Запрос.Текст =

| РегистрНакопления.СтоимостьМатериалов.Остатки";

КонецЕсли;

Запрос.УстановитьПараметр("МоментВремени", МоментВремени());

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

ПереченьНоменклатуры.ВыгрузитьКолонку("Номенклатура"));

Разработка прикладного решения в системе «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С очень похож на синтаксис других SQL-языков, но имеются отличия. Основными преимуществами встроенного языка запросов являются: разыменование полей, наличие виртуальных таблиц, удобная работа с итогами, нетипизированные поля в запросах.

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

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

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

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

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

В случае, если запрос содержит предложение ИТОГИ, каждый уровень итогов упорядочивается отдельно.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Все виртуальные таблицы параметризованы, т. е. разработчику предоставляется возможность задать некоторые параметры, которые система будет использовать при формировании запроса создания виртуальной таблицы. В зависимости от того, какие параметры виртуальной таблицы указаны разработчиком, система может формировать РАЗЛИЧНЫЕ запросы для получения одной и той же виртуальной таблицы, причем они будут оптимизированы с точки зрения переданных параметров.
  • Не всегда разработчик имеет возможность получить доступ к тем данным, к которым имеет доступ система.
13) В клиент-серверном варианте работы функция ПОДСТРОКА() реализуется при помощи функции SUBSTRING() соответствующего оператора SQL, передаваемого серверу баз данных SQL Server, который вычисляет тип результата функции SUBSTRING() по сложным правилам в зависимости от типа и значений ее параметров, а так же в зависимости от контекста, в котором она используется. В большинстве случаев эти правила не оказывают влияния на выполнение запроса, но бывают случаи, когда для выполнения запроса существенна максимальная длина строки результата, вычисленная SQL Server. Важно иметь в виду, что в некоторых контекстах использования функции ПОДСТРОКА() максимальная длина ее результата может оказаться равной максимальной длине строки ограниченной длины, которая в SQL Server равна 4000 символам. Это может привести к неожиданному аварийному завершению выполнения запроса:
Microsoft OLE DB Provider for SQL Server: Warning: The query processor could not produce a query plan from the optimizer because the total length of all the columns in the GROUP BY or ORDER BY clause exceeds 8000 bytes.
HRESULT=80040E14, SQLSTATE=42000, native=8618
Чтобы избежать такой ошибки, не рекомендуют использовать функцию ПОДСТРОКА() с целью приведения строк неограниченной длины к строкам ограниченной длины. Вместо нее лучше использовать операцию приведения типа ВЫРАЗИТЬ().

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

Пример:
ВЫБРАТЬ

ИЗ

ГДЕ
_ДемоКонтрагенты.Ссылка = &Ссылка1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
_ДемоКонтрагенты.НаименованиеПолное
ИЗ
Справочник._ДемоКонтрагенты КАК _ДемоКонтрагенты
ГДЕ
_ДемоКонтрагенты.Ссылка = &Ссылка2

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

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

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

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

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

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

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

Рис. 97. Таблицы запроса

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

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

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

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

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

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

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

· описание запроса;

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

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

· АВТОУПОРЯДОЧИВАНИЕ;

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

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

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

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

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

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

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

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

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

Исходные данные для компоновки отчета содержит в себе схема компоновки данных – это наборы данных и методы работы с ними (рис. 98).

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

Например, схема компоновки может содержать следующий набор данных (рис. 99).

Рис. 98. Общая схема работы с системой компоновки данных

Рис. 99. Пример схемы компоновки (набор данных и запрос, его использующий)

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

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

Например, может быть задана такая структура отчета (рис. 100):

Рис. 100. Структура возможного отчета

Сформированный отчет может иметь следующий вид (рис. 101).

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

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

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

Рис. 101. Пример отчета

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

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

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

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

Рис. 102. Схема работы системы компоновки

3.12.1. Создание отчета "Реестр документов Оказание услуги"

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

Отчет . Присвойте ему имя РеестрДокументовОказаниеУслуги . На закладке Основные нажмите кнопку "Готово ". В конструкторе схемы компоновки данных добавьте Набор данных – запрос Конструктор запроса ".

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

Дата; Номер; Склад; Мастер; Клиент.

Рис. 103. Выбранные поля

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

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

Нажмите кнопку "ОK " и посмотрите, какой запрос сформировал конструктор запроса.

Перейдите на закладку Настройки и добавьте новую группировку в структуру отчета (рис. 105).

Рис. 105. Командная панель закладки Настройки

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

Дата; Номер; Склад; Мастер; Клиент (рис. 106).

Рис. 106. Настройка структуры отчета

Реестр документов оказание услуги . Нажмите кнопку "Сформировать " и посмотрите на результат работы отчета (рис. 107).

Рис. 107. Отчет Реестр документов оказание услуги

Отчет . Назовите его РейтингУслуг . На закладке Основные нажмите кнопку "Открыть схему компоновки данных ". В открывшемся диалоговом окне конструктора макета нажмите кнопку "Готово ".

В конструкторе схемы компоновки данных создайте Набор данных – запрос (НаборДанных1) и нажмите кнопку "Конструктор запроса ".

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

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

Рис. 108. Выбранные поля

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

Единственное, что необходимо сделать, это сбросить флаг Все у таблицы регистра и установить его у таблицы справочника СпрНоменклатура (рис. 109).

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

Рис. 109. Установка связей таблиц

Перейдите на закладку Условия и задайте условия выбора элементов из справочника Номенклатура (рис. 110). При задании условий выбора необходимо будет использовать параметры запроса. Первым условием должно быть то, что выбранный элемент не является группой (для этого следует переключиться в режим Произвольное условие – установить флаг Произвольное ). Затем в поле условие введите следующий текст:

СпрНоменклатура.ЭтоГруппа = ЛОЖЬ

Вторым условием должно быть то, что выбранный элемент является услугой (это – Простое условие ) (рис. 110).

Рис. 110. Условия выбора элементов

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

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

Рис. 111. Объединения/Псевдонимы

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

Перейдите на закладку Ресурсы и нажмите кнопку ">> ", чтобы конструктор выбрал все доступные ресурсы, по которым можно вычислять итоги. В вашем случае – это единственный ресурс Выручка (рис. 112).

Рис. 112. Ресурсы схемы компоновки данных

Перейдите на закладку Параметры (рис. 113).

Рис. 113. Параметры компоновки данных

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

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

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

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

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

Нажмите кнопку "ОK ".

Вторая особенность заключается в том, что по умолчанию время в дате установлено 00:00:00. Поэтому, если пользователь задаст период отчета с 01.10.2009 по 31.10.2009, итоги регистра будут рассчитаны с начала дня 01.10.2009 00:00:00 по начало дня 31.10.2009 00:00:00. Таким образом, данные за 31 число, отличные от начала дня, в расчет не войдут, что сильно удивит пользователя. Для того чтобы исключить эту ситуацию, добавьте еще один параметр, в который пользователь будет вводить дату окончания. Значение параметра КонецПериода будет рассчитываться автоматически таким образом, чтобы оно указывало на конец дня даты, введенной пользователем. Поэтому для параметра КонецПериода установите флаг Ограничение доступности .

Рис. 114. Редактирование состава даты

С помощью кнопки командной панели добавьте новый параметр с именем ДатаОкончания (рис. 115).

Рис. 115. Добавление параметра ДатаОкончания

Для этого параметра платформа автоматически сформирует заголовок – Дата окончания . Оставьте его без изменений. Задайте тип значения параметра – Дата . При этом, как и для параметра НачалоПериода , укажите состав даты – Дата .

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

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

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

В ячейке Выражение задайте для параметра КонецПериода следующее выражение:

В результате перечисленных действий параметры компоновки будут иметь следующий вид (рис. 116):

Рис. 116. Параметры системы компоновки

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

Рис. 117. Установка значения параметра ВидНоменклатуры

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

Затем перейдите на закладку Другие настройки и задайте заголовок отчета – РейтингУслуг (рис. 119).

Рис. 119. Установка заголовка отчета

Запустите 1С:Предприятие в режиме отладки.

Выберите отчет Рейтинг услуг , но перед тем, как нажать кнопку "Сформировать ", откройте Настройки и на закладке Параметры данных задайте период отчета с 01.03.2004 по 30.04.2004 (рис. 120). Если даты создания ваших документов отличаются от приведенных в примере, то период отчета следует задавать другим.

Рис. 120. Настройки отчета

Нажмите кнопку "OK " и сформируйте отчет. Результат будет выглядеть следующим образом (рис. 121):

Рис. 121. Результат выполнения отчета

Теперь измените дату окончания на 31.03.2004. Данные за 31 марта попадают в отчет (рис. 122).

Рис. 122. Результат выполнения отчета

3.12.3. Создание отчета "Выручка мастеров"

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

Создайте новый объект конфигурации Отчет . Назовите его ВыручкаМастеров и запустите конструктор основной схемы компоновки данных.

Добавьте Набор данных – запрос (НаборДанных1) и нажмите кнопку "Конструктор запроса ". Выберите виртуальную таблицу регистра накопления Продажи.Обороты .

Задайте один из параметров этой виртуальной таблицы – Периодичность . Для этого перейдите в поле Таблицы и нажмите кнопку "Параметры виртуальной таблицы " (рис. 123).

Рис. 123. Изменение параметров виртуальной таблицы

В открывшемся окне параметров задайте значение параметра Периодичность – День (рис. 124). Нажмем кнопку "OK ".

Рис. 124. Параметры виртуальной таблицы

После этого выберите из таблицы следующие поля:

· ПродажиОбороты.Мастер;

· ПродажиОбороты.Период;

· ПродажиОбороты.Клиент;

· ПродажиОбороты.ВыручкаОборот (рис. 125).

Рис. 125. Выбранные поля

Теперь перейдите на закладку Объединения/Псевдонимы и задайте псевдоним Выручка для поля ПродажиОбороты.ВыручкаОборот (рис. 126).

Рис. 126. Объединения/Псевдонимы

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

Рис. 127. Поля группировок

На закладке Порядок укажите, что результат запроса будет отсортирован по возрастанию значения поля Период . Нажмите кнопку "ОK ". Рассмотрите текст запроса, сформированный конструктором.

Теперь перейдите к редактированию схемы компоновки данных. На закладке Ресурсы нажмите кнопку ">> " и убедитесь, что конструктор выбрал единственный имеющийся ресурс – Выручка .

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

Для параметра НачалоПериода задайте заголовок Дата начала . В поле Доступные типы задайте состав даты – Дата .

Для параметра КонецПериода задайте выражение:

КонецПериода(&ДатаОкончания, "День")

В поле Ограничение доступности установите флаг ограничения доступности.

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

В результате перечисленных действий параметры компоновки данных будут иметь следующий вид (рис. 128):

Рис. 128. Параметры компоновки данных

Теперь необходимо создать структуру отчета. На закладке Настройки последовательно создайте две вложенные группировки: верхнего уровня – по полю Мастер , вложенная в нее – по полю Период . Затем добавьте еще одну группировку, вложенную в группировку по полю Период , – Детальные записи (без указания группировочного поля) (рис. 129).

Рис. 129. Структура отчета

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

В заключение, с уровня глобального отчета перейдите на закладку Другие настройки и измените следующие параметры. Для параметра установите значение Отдельно и только в итогах ; для параметра задайте значение Начало и для параметра Заголовок задайте значение Выручка мастеров (рис. 130).

Рис. 130. Установка вывода общих итогов в начало

Запустите 1С:Предприятие в режиме отладки и посмотрите на результат работы отчета Выручка мастеров за период с 01.03.2004 по 30.04.2004 (рис. 131).

Рис. 131. Результат выполнения отчета

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

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

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

Рис. 132. Настройки группировки Период

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

Перейдите на закладку Поля группировки . Для поля Период установите Тип дополнения – День (рис. 133).

Рис. 133. Установка типа дополнения периода

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

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

Для того чтобы обеспечить именно такую работу отчета, войдите в режим редактирования первого поля (например, дважды кликнув на нем) и нажмите на кнопку очистки "Х ". После этого, нажав на кнопку "Т ", вы сможете выбрать тип данных, отображаемых в этом поле. Выберите Поле компоновки данных (рис. 134).

Рис. 134. Выбор типа данных

Нажмите кнопку "OK ". Теперь нажмите в поле ввода кнопку выбора "" и в открывшемся окне выбора поля отметьте параметр НачалоПериода (рис. 135). Нажмите кнопку "OK ".

Рис. 135. Выбор поля

Для второго поля ввода аналогичным образом укажите, что дата окончания периода будет получена из параметра ДатаОкончания (рис. 136).

Рис. 136. Настройки группировки Период

Запустите 1С:Предприятие в режиме отладки и выполните отчет Выручка мастеров за период с 20.03.2004 по 20.04.2004 (рис. 137).

Рис. 137. Результат выполнения отчета

3.12.4. Создание отчета "Перечень услуг"

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

Создайте новый объект конфигурации Отчет . Назовите его ПереченьУслуг и запустите конструктор схемы компоновки данных. Создайте новый Набор данных – запрос (НаборДанных1) и вызовите конструктор запроса.

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

Вызовите диалог ввода параметров виртуальной таблицы ЦеныСрезПоследних и укажите, что период будет передан в параметре ДатаОтчета (рис. 138).

Рис. 138. Параметры виртуальной таблицы

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

· СпрНоменклатура.Родитель;

· ЦеныСрезПоследних.Цена (рис. 139).

Рис. 139. Выбранные поля

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

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

Рис. 140. Условия выбора элементов

На закладке Объединения/Псевдонимы укажите, что поле Родитель будет иметь псевдоним ГруппаУслуг , а поле Ссылка – Услуга (рис. 141).

Рис. 141. Объединения/Псевдонимы

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

Рис.142. Поля группировки

Нажмите кнопку "OK ". Посмотрите текст запроса.

Перейдите к редактированию схемы компоновки данных. На закладке Ресурсы нажатием кнопки ">> " выберите единственный доступный ресурс Цена .

На закладке Параметры задайте значение параметра ВидНоменклатуры как Перечисление.ВидыНоменклатуры.Услуга . Кроме этого снимите ограничение доступности для параметра ДатаОтчета и задайте ему заголовок – Дата отчета . В поле Доступные типы задайте состав даты – Дата . Для параметра Период , наоборот, установите ограничение доступности (рис. 143).

Рис. 143. Параметры схемы компоновки

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

Рис. 144. Структура и выделенные поля отчета

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

Рис. 145. Структура отчета

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

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

Затем перейдите к настройкам конкретной группировки – ГруппаУслуг . Для параметра Расположение итогов этой группировки укажите значение Нет . Вернитесь к настройкам всего отчета в целом.

Для параметра Расположение полей группировок укажите значение Отдельно и только в итогах (так отчет будет лучше "читаться"). Напоследок задайте заголовок отчета – Перечень услуг .

Запустите 1С:Предприятие в режиме отладки и прежде всего откройте периодический регистр Цены .

Добавьте в него еще одно значение для услуги Диагностика : новая цена услуги на 01.04.2004 – 350 (рис. 146). Это позволит протестировать отчет.

Рис. 146. Записи регистра "Цены"

Теперь выполните отчет Перечень услуг по состоянию на 31.03.2004 (рис. 147).

Рис. 147. Результат выполнения отчета

Ваш отчет правильно отражает цену услуги Диагностика на 31.03.2004 – 200 руб.

Еще раз выполните отчет, но теперь уже на другую дату - 01.04.2004 (рис. 148).

Рис. 148. Результат выполнения отчета

Как видите, показана новая цена услуги Диагностика - 350 руб.

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

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

Логически диаграмма является совокупностью точек, серий и значений серий в точке (рис. 149).

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

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

Диаграмма как объект встроенного языка имеет три области, которые позволяют управлять оформлением диаграммы: область построения, область заголовка и область легенды (рис. 150).

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

Рис. 149. Пример диаграммы

Рис. 150. Области диаграммы

Создайте в конфигураторе новый объект конфигурации Отчет . Назовите его РейтингКлиентов , откройте его основную схему компоновки данных.

Создайте набор данных – запрос (НаборДанных1) и вызовите конструктор запроса. Выберите виртуальную таблицу регистра накопления Продажи.Обороты и из нее одно поле – ПродажиОбороты.Клиент .

Затем добавьте новое поле (значок Добавить в командной панели над списком полей) и при помощи построителя выражений определите его как разность между выручкой и стоимостью (рис. 151).

Рис. 151. Редактор произвольного выражения поля

В результате список выбранных полей будет иметь следующий вид (рис. 152):

Рис. 152. Выбранные поля

На закладке Объединения/Псевдонимы укажите, что вычисляемое поле будет иметь псевдоним Доход (рис. 153).

Рис. 153. Объединения/Псевдонимы

На закладке Порядок укажите, что строки результата нужно упорядочивать по убыванию значения поля Доход . Нажмите кнопку "OK " и посмотрите, какой текст сформировал конструктор запроса.

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

В отличие от всех предыдущих отчетов, структура которых содержала группировки, в этот раз добавьте в структуру отчета диаграмму (рис. 154).

Рис. 154. Структура отчета

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

Теперь перейдите на закладку Выбранные поля и выберите поле Доход для вывода в отчет. Структура отчета должна принять следующий вид (рис. 155):

Рис. 155. Структура отчета и настройки диаграммы

На закладке Другие настройки задайте заголовок отчета – Рейтинг клиентов , а также выберите тип диаграммы – Круговая объемная .

Запустите 1С:Предприятие в режиме отладки и откройте отчет Рейтинг клиентов (рис. 156).

Рис. 156. Круговая объемная диаграмма в отчете

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

Откройте настройки отчета и измените тип диаграммы на Измерительная . Заново сформируйте отчет (рис. 157).

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

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

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

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

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

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

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

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

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

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

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

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

Одной из существенных особенностей языка запросов 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

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

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

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

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

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