Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 1С_Предприятие8_1(5-8).docx
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
6 Мб
Скачать
☆

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

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

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

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

ВЫБРАТЬ

Номенклатура.Наименование КАК Номенклатура,

ЕдиницыИзмерения.Наименование КАК ЕдиницаИзмерения

ИЗ

Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

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

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

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

7.4. Выводы

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

Лабораторная работа № 8 Отчеты

Цель: освоить технологию разработки отчетов.

8.1. Создание отчета

Для создания отчетов в системе 1С:Предприятие используется прикладной объект Отчет. В рамках использования этого объекта существует несколько способов построения отчета. В частности, это способ, предусматривающий использование Конструктора выходной формы. Именно с ним мы познакомимся на данном занятии, рассмотрев простейший вариант построения отчета.

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

Создадим новый объект Отчет, назовем его ОстаткиМатериалов, рис. 8.1.

Рис. 8.1.  Начало создания отчета

Нажмем на кнопку Действия в форме настройки параметров объекта и выберем пункт меню Конструкторы > Конструктор выходной формы. В появившемся окне оставим все по умолчанию и нажмем на кнопку ОК. Появится окно (рис. 8.2), внешне напоминающее окно Конструктора запросов, но с дополнительными вкладками. Основная задача, которая сейчас стоит перед нами - создать с помощью Конструктора запрос, который будет получать нужные нам данные.

Рис. 8.2.  Создание запроса

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

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

  • ЦентрОтветственности;

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

  • КоличествоОстаток.

Напомним, нам нужны условия, которые позволят отобрать остатки:

  1. На определенную дату;

  2. По заданному материально ответственному лицу.

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

Рис. 8.3.  Окно настройки параметров виртуальной таблицы

В поле Период введем следующий текст: &Дата. Дата - это имя параметра, который будет устанавливать пользователь перед выполнением запроса.

В поле Условие нажмем кнопку с тремя точками и в появившееся окно ввода условия (рис. 8.4) введем следующий текст:

ЦентрОтветственности = &Ответственный

Рис. 8.4.  Ввод произвольного выражения для поля Условие

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

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

Рис. 8.5.  Окно настройки параметров виртуальной таблицы

Нажмем кнопку ОК, если все введено верно - система не выдаст никаких предупреждающих сообщений и можно будет переходить к дальнейшей работе над запросом.

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

Перейдем на вкладку Итоги, рис. 8.6.

Рис. 8.6.  Конструктор выходной формы, вкладка Итоги

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

Перейдем на вкладку Отчет. Здесь нужно настроить параметры вывода отчета. Мы, для того, чтобы сделать процесс конструирования отчета максимально наглядным, снимем галочку в поле Использовать построитель отчета, рис. 8.7. Построитель отчета расширяет возможности пользователя по работе с запросом, однако, для того, чтобы не перегружать наш пример, мы в данный момент не будем им пользоваться.

Рис. 8.7.  Конструктор выходной формы, вкладка Отчет

Переместимся на вкладку Выходная форма. Здесь нужно задать типы параметров, которые мы собираемся передавать в отчет, рис. 8.8. Параметру Дата установим тип Дата, параметру Ответственный -СправочникСсылка.Сотрудники. Это позволит нам выбирать дату из календаря, а сотрудника, по которому строится отчет, из справочника.

Рис. 8.8.  Конструктор выходной формы, вкладка Выходная форма

Работа с Конструктором завершена, нажмем на кнопку ОК. Посмотрим, что создал конструктор, рис. 8.9.

Рис. 8.9.  Результаты работы Конструктора выходной формы

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

Запрос формируется по нажатию на кнопку Сформировать.

Конструктор, помимо визуальных элементов, генерирует программный код. Его можно найти в модуле выходной формы, рис. 8.10.

Рис. 8.10.  Процедуры, сгенерированные Конструктором выходной формы

А именно, здесь мы видим две процедуры. Одна из них - ДействияФормыОстаткиМатериаловСформировать() - это обработчик события нажатия на кнопку. Вторая - ОстаткиМатериалов() отвечает за формирование отчета. Рассмотрим эти процедуры подробнее. Для начала - обработчик события.

Процедура ДействияФормыОстаткиМатериаловСформировать(Кнопка)

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

ОстаткиМатериалов(ТабДок, Дата, Ответственный);

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

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

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

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

Приведение даты к концу дня можно выполнить с помощью функции КонецДня(). Эта функция возвращает дату и время конца дня для переданной даты.

Найдите такую строку в процедуре ОстаткиМатериалов():

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

Отредактируйте ее, чтобы она стала выглядеть так:

Запрос.УстановитьПараметр("Дата", КонецДня(Дата));

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

Рис. 8.11.  Отчет Остатки материалов

Здесь видно, что отчет, с точки зрения поставленных перед его созданием целей, выводит данные верно. Однако внешний вид отчета можно улучшить. В частности, можно поменять наименования столбцов ЦентрОтветственности и КоличествоОстаток на что-нибудь более благозвучное, уменьшить ширину столбцов и добавить границы ячеек. Все эти действия можно выполнить в редакторе макета, вводя текст в нужные ячейки и настраивая их размер и форматирование. Вот как выглядит отчет после исправления "косметических" недочетов, рис. 8.12.

Рис. 8.12.  Отчет Остатки материалов

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

Процедура ОстаткиМатериалов(ТабДок, Дата, Ответственный) Экспорт

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

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

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

"ВЫБРАТЬ

| ОстаткиМатериаловОстатки.ЦентрОтветственности КАК ЦентрОтветственности,

| ПРЕДСТАВЛЕНИЕ(ОстаткиМатериаловОстатки.ЦентрОтветственности),

| ОстаткиМатериаловОстатки.Номенклатура,

| ПРЕДСТАВЛЕНИЕ(ОстаткиМатериаловОстатки.Номенклатура),

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

|ИЗ

| РегистрНакопления.ОстаткиМатериалов.Остатки(&Дата, ЦентрОтветственности = &Ответственный)

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

|ИТОГИ ПО

| ЦентрОтветственности";

Запрос.УстановитьПараметр("Дата", КонецДня(Дата));

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

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

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

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

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

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

ОбластьЦентрОтветственности = Макет.ПолучитьОбласть("ЦентрОтветственности");

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

ТабДок.Очистить();

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

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

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

ВыборкаЦентрОтветственности = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

Пока ВыборкаЦентрОтветственности.Следующий() Цикл

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

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

ВыборкаДетали = ВыборкаЦентрОтветственности.Выбрать();

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

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

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

КонецЦикла;

КонецЦикла;

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

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

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

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

Листинг . (html, txt)

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

Обратите внимание на блок ИЗ в теле текста запроса:

|ИЗ

| РегистрНакопления.ОстаткиМатериалов.Остатки(&Дата, ЦентрОтветственности = &Ответственный) КАК ОстаткиМатериаловОстатки

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

Запрос.УстановитьПараметр("Дата", КонецДня(Дата));

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

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

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

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

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

//Команды вывода данных в табличный документ

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

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

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

ВыборкаЦентрОтветственности = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

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

Пока ВыборкаЦентрОтветственности.Следующий() Цикл

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

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

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

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

ВыборкаДетали = ВыборкаЦентрОтветственности.Выбрать();

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

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

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

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

КонецЦикла;

Этим внутренним циклом, который действует аналогично внешнему, мы заполняем те части отчета, которые имеют отношение к детальной выборке. Метод Уровень() в данном случае возвращает 1.