Создание отчета
Для создания отчетов в системе 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. Отчет Остатки материалов
Теперь переходим к рассмотрению процедуры, ответственной за формирование этого отчета.
Процедура ОстаткиМатериалов(ТабДок, Дата, Ответственный) Экспорт
Макет = ОтчетОбъект.ПолучитьМакет("ОстаткиМатериалов");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОстаткиМатериаловОстатки.ЦентрОтветственности КАК ЦентрОтветственности,
| ПРЕДСТАВЛЕНИЕ(ОстаткиМатериаловОстатки.ЦентрОтветственности),
| ОстаткиМатериаловОстатки.Номенклатура,
| ПРЕДСТАВЛЕНИЕ(ОстаткиМатериаловОстатки.Номенклатура),
| ОстаткиМатериаловОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиМатериалов.Остатки(&Дата, ЦентрОтветственности = &Ответственный)
КАК ОстаткиМатериаловОстатки
|ИТОГИ ПО
| ЦентрОтветственности";
Запрос.УстановитьПараметр("Дата", КонецДня(Дата));
Запрос.УстановитьПараметр("Ответственный", Ответственный);
Результат = Запрос.Выполнить();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьЦентрОтветственности = Макет.ПолучитьОбласть("ЦентрОтветственности");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();
ВыборкаЦентрОтветственности = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаЦентрОтветственности.Следующий() Цикл
ОбластьЦентрОтветственности.Параметры.Заполнить(ВыборкаЦентрОтветственности);
ТабДок.Вывести(ОбластьЦентрОтветственности, ВыборкаЦентрОтветственности.Уровень());
ВыборкаДетали = ВыборкаЦентрОтветственности.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
КонецЦикла;
КонецЦикла;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
КонецПроцедуры