6Глава Концепция управляемого приложения
Скачать 6.74 Mb.
|
Глава 5. Отчеты Конечная цель любой учетной системы – формирование отчетов. 1С:Предприятие 8 предоставляет разработчику множество инструментов для создания отчетов – от достаточно простых механизмов, позволяющих создавать несложные отчеты, до 90 комплексных средств, таких, как система компоновки данных. Сейчас мы рассмотрим пример создания простого отчета. Нам нужно вывести отчет в виде списка контрагентов по группам с указанием наименования контрагента, основного контактного лица и телефона этого контактного лица. Сделаем это с помощью специализированного прикладного объекта Отчет. 5.1. Макет отчета Отчет, в нашем случае, будет строиться на основе макета, с областями которого работают в программном коде, формируя готовый отчет. Создадим в ветви дерева конфигурации Отчеты новый отчет, дадим ему имя СписокКонтрагентов, рис. 5.1. Рис. 5.1. Создание нового отчета Первым этапом работы над отчетом станет создание макета отчета. Макет позволяет заранее определить и оформить "блоки", из которых будет построен отчет. Следует отметить, что о всех возможных случаях при разработке прикладных решений для 1С:Предприятие 8 следует создавать их на основе схемы компоновки данных. Однако умение работать с макетами в форме табличных документов может пригодиться в том случае, если вам понадобится отредактировать сторонний отчет, выполненный в таком стиле. Перейдем на закладку формы редактирования объекта Макеты и нажмем на кнопку Добавить. Появится окно конструктора макета, где нам предложат задать его имя (оставим имя по умолчанию – Макет), и тип макета – нас устроит Табличный документ, рис. 5.2. После нажатия на кнопку Готово, мы видим табличный редактор, рис. 5.3, очень напоминающий Microsoft Excel. Работая с ним, мы можем пользоваться стандартной палитрой свойств, а так же – панелями инструментов, в частности – Форматирование, Табличный документ, Имена. 91 Рис. 5.2. Создание макета для отчета Наша задача сейчас – создать и отформатировать области, которые позже будут использованы для формирования готового отчета. Рис. 5.3. Средства редактирования макета отчета При создании макета мы можем вводить в ячейки обычный текст – такой текст отображается в ячейке без каких-либо дополнительных знаков. Ячейка может содержать именованный параметр, который будет заполнен при формировании отчета. Так же ячейки могут содержать шаблоны, состоящие из обычного текста и параметров, которые так же можно заполнить. На рис. 5.4. показан готовый макет. 92 Рис. 5.4. Готовый макет отчета Ячейка 2,2 заполнена следующим образом: в нее сначала введен текст "Список контрагентов на [ДатаФормированияОтчета]", после чего вызвано окно свойств этой ячейки, в которых, в свойстве Заполнение выбрано Шаблон, рис. 5.5. Рис. 5.5. Настройка ячейки, содержащей шаблон Параметр ДатаФормированияОтчета мы установим в текущую дату программно при формировании отчета. Ячейки с 4,2 по 4,4 содержат обычный текст – он будет выводиться в качестве шапки таблицы. И заголовок отчета и шапка таблицы объединены в область с именем Шапка. Для задания имени области достаточно выделить нужные ячейки (выделять нужно по заголовкам строк) и отредактировать в палитре свойств параметр Имя выделенного диапазона, или воспользоваться кнопкой Назначить имя панели инструментов Имена. Область Элемент содержит три параметра – Наименование, ОсновноеКонтактноеЛицо и ТелефонКонтактногоЛица. После ввода в каждую из ячеек имен параметров, нужно выделить их (все вместе или по одной) и в окне свойств в поле Заполнение указать Параметр. К тексту в ячейках будут автоматически добавлены угловые скобки (<>), что позволяет визуально определить наличие в ячейке параметра. Область Группа содержит лишь параметр Наименование. 93 Замечание. Имена параметров соответствуют именам реквизитов справочника, которыми мы собираемся их заполнять. Ячейки в шаблоне можно форматировать – задавать их границы, оформление текста, выравнивание и т.д. 5.2. Табличный документ Теперь приступим к созданию формы отчета. Перейдем на вкладку Формы окна редактирования объекта, добавим новую форму отчета, оставим все настройки в состоянии по умолчанию и нажмем Готово. Добавим, на вкладке Реквизиты редактора форм новый реквизит, назовем его ТабличныйДокумент, выберем для него тип ТабличныйДокумент. Перетащим созданный реквизит в поле Элементы. В состав команд формы добавим новую команду, зададим ей имя СформироватьОтчет и так же переместим в поле Элементы. В итоге у нас получится форма, выглядящая так, как показано на рис. 5.6. Рис. 5.6. Настройка формы отчета Табличный документ - это общий объект встроенного языка. Он используется для создания выходных документов - первичных документов и отчетов. Табличный документ является мощным интерактивным средством отображения информации и может использоваться как сам по себе, так и входить в состав любой из форм, используемых в прикладном решении. По своей сути табличный документ напоминает 94 электронные таблицы - он состоит из строк и столбцов, в которых размещаются данные, однако его возможности гораздо шире. Для построения отчета мы должны будем получать данные из справочника. Это можно сделать с помощью уже знакомого вам объекта СправочникВыборка, можно получить данные с помощью запроса. В любом случае, это предусматривает работу с базой данных, то есть, нам понадобится процедура, выполняемая на сервере. До настоящего времени мы пользовались лишь директивой компиляции &НаСервере – при вызове методов, объявленных с этой директивой, мы имеем доступ к контексту формы, при этом между клиентом и сервером происходит передача дополнительных данных – как при вызове серверного метода с клиента на сервер, так и в обратном направлении. Сейчас мы воспользуемся серверным внеконтекстным методом для формирования отчета. В этом методе мы собираемся формировать табличный документ, содержащий данные отчета. При реализации метода в виде процедуры, нам придется передать в него в качестве параметра наш реквизит ТабличныйДокумент. По умолчанию параметры передаются по ссылке, то есть, работать процедура будет непосредственно с нашим реквизитом. При реализации метода в виде функции мы можем ничего не передавать в него, сформировать внутри функции табличный документ и вернуть уже заполненный документ в точку вызова, присвоив его нашему реквизиту ТабличныйДокумент. Реализуем метод в виде функции. Готовый код формирования отчета (рис. 5.7.) будет выглядеть следующим образом: Рис. 5.7.. Готовый отчет &НаКлиенте Процедура СформироватьОтчет(Команда) ТабличныйДокумент=СформироватьОтчетНаСервере(); КонецПроцедуры &НаСервереБезКонтекста Функция СформироватьОтчетНаСервере() 95 ТабличныйДокумент=Новый ТабличныйДокумент(); Макет=Отчеты.СписокКонтрагентов.ПолучитьМакет("Макет"); Шапка=Макет.ПолучитьОбласть("Шапка"); Элемент=Макет.ПолучитьОбласть("Элемент"); Группа=Макет.ПолучитьОбласть("Группа"); Шапка.Параметры.ДатаФормированияОтчета=ТекущаяДата(); ТабличныйДокумент.Вывести(Шапка); Выборка=Справочники.Контрагенты.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл Если Выборка.ЭтоГруппа Тогда Область=Группа; Иначе Область=Элемент; КонецЕсли; Область.Параметры.Заполнить(Выборка); ТабличныйДокумент.Вывести(Область); КонецЦикла; Возврат (ТабличныйДокумент); КонецФункции В клиентской процедуре СформироватьОтчет() мы вызываем серверную функцию СформироватьОтчетНаСервере(), присваивая возвращаемое ей значение реквизиту ТабличныйДокумент. В серверной функции мы создаем новую переменную с типом ТабличныйДокумент и именем ТабличныйДокумент. Именно в него мы будем выводить данные и именно его будем возвращать в точку вызова. Несмотря на то, что имя реквизита формы и имя данной переменной совпадают, между ними нет никакой связи. Это – отдельные объекты. Далее, мы получаем макет из нашего отчета, пользуясь методом ПолучитьМакет() и задавая имя макета. Отчет может иметь несколько макетов, их выбор осуществляется по имени. В переменную Шапка мы записываем область макета Шапка, соответственно поступаем с переменными Элемент и Группа. Командой Шапка.Параметры.ДатаФормированияОтчета=ТекущаяДата(); мы заполняем ранее заданный в макете параметр ДатаФормированияОтчета, записав в него текущую дату. Дата, возвращаемая функцией ТекущаяДата, содержит, помимо года, месяца и дня, так же часы, минуты и секунды. При необходимости дату перед выводом можно отформатировать при помощи функции Формат(). После того, как параметр, находящийся в шапке, заполнен, мы можем вывести шапку в табличный документ командой ТабличныйДокумент.Вывести(Шапка); Следующим этапом нашей работы будет получение иерархической выборки справочника. Такая выборка позволяет получить элементы и группы справочника в иерархическом порядке, учитывая родительские отношения между элементами. В цикле обхода выборки мы сначала проверяем, является ли текущий элемент справочника группой. Если является, присваиваем переменной Область ранее полученную область отчета Группа. Если не является – присваиваем ей область Элемент. Благодаря совпадению имен параметров и имен реквизитов справочника, для помещения данных из выборки в область макета, достаточно воспользоваться 96 конструкцией Область.Параметры.Заполнить(Выборка);. После заполнения параметров мы выводим сформированную область в табличный документ. Когда цикл перебора выборки будет завершен, мы возвращаем сформированный табличный документ в точку вызова и пользователь видит готовый отчет. Для формирования простейших отчетов, пользователь может воспользоваться стандартной функциональностью, присутствующей в 1С:Предприятие 8. Для этого, открыв, например, список справочника, он может выполнить команду Все действия > Вывести список. Появится окно Вывести список, рис. 5.8., где в поле Выводить в можно выбрать либо Табличный документ (его обычно и используют), либо – Текстовый документ. Рис. 5.8. Окно Настройка списка В поле Выводить колонки можно настроить состав выводимых в документ колонок. После нажатия на ОК выбранные данные оформляются в виде табличного документа, а с помощью команды Файл > Сохранить как этот документ можно сохранить в нужном формате для дальнейшей обработки в других приложениях. 5.3. Дополнительные свойства табличного документа 5.3.1. Оформление ячеек Табличный документ обладает большими возможностями оформления. Разработчик может задавать тип и размер шрифта для отображения текста, расположенного в ячейках табличного документа, рис. 5.9.: 97 Рис. 5.9. Настройка шрифта ячеек табличного документа Табличный документ позволяет оформлять ячейки рамками различного вида, рис. 5.10.: Рис. 5.10. Настройка рамок ячеек табличного документа Также разработчик имеет возможность управлять цветом текста, фона и рамок, выбирая цвета как из палитры операционной системы, так и из палитры Web-цветов, поддерживаемой платформой, или из палитры того стиля, который будет использоваться прикладным решением, рис. 5.11.: 98 Рис. 5.11. Настройка цветов ячеек табличного документа 5.3.2. Группировки Табличный документ поддерживает возможность группировки строк и столбцов. Это позволяет группировать данные в отчетах, используя произвольное количество вложенных группировок. Бывают горизонтальные и вертикальные группировки, причем у разработчика есть возможность управлять расположением итогов в группировке: для вертикальных группировок они могут быть расположены сверху или снизу, а для горизонтальных группировок - справа или слева. Поддерживается отображение уровней группировок, и нажатием цифр в заголовках можно развернуть сразу все группировки данного уровня и свернуть более детальные группировки. Отступ уровней иерархии при использовании группировок формируется системой автоматически: Пример. Сформировать отчет печати иерархического справочника сотрудников. Макет, рис. 5.12.: 99 Рис. 5.12. Макет отчета Программный код: &НаКлиенте Процедура ПечатьСправочника(Команда) ТаблДокум=печать(); КонецПроцедуры Функция Печать() Таб = Новый ТабличныйДокумент(); Макет= Справочники.Сотрудники.ПолучитьМакет("МакетПечатиСотрудников") ; Область = Макет.ПолучитьОбласть("Шапка"); Таб.Вывести(Область); Таб.НачатьАвтогруппировкуСтрок(); Выб=Справочники.Сотрудники.Выбратьиерархически(); Пока выб.Следующий() Цикл Если Выб.ЭтоГруппа Тогда Область = Макет.ПолучитьОбласть("Группа"); Область.Параметры.НаименованиеГруппы=Выб.Наименование; Иначе Область = Макет.ПолучитьОбласть("Строка"); Область.Параметры.ФИО=Выб.Наименование; Область.Параметры.Пол=Выб.Пол; Область.Параметры.Образование=Выб.Образование; Область.Параметры.Оклад=Выб.Оклад; Область.Параметры.сотрудник=Выб.Ссылка; КонецЕСли; Таб.Вывести(Область,Выб.УровеньВВыборке(),,Истина); КонецЦикла; Таб.ЗакончитьАвтогруппировкуСтрок(); Возврат Таб; КонецФункции Результат, рис. 5.13.: 100 Рис. 5.13. Печатная форма справочника сотрудников 5.3.3. Расшифровки В системе поддерживается механизм расшифровок, который позволяет пользователю получить детальный или дополнительный отчет, щелкнув мышью на строке или ячейке табличного документа. Платформа поддерживает возможность обработки нажатий клавиши мыши в ячейках табличного документа. При этом система может выполнять как стандартные действия, так и алгоритмы, заданные разработчиком. Стандартные действия при расшифровке выполняются, например, если щелкнуть мышью на документе или элементе справочника. В этом случае система откроет этот объект для просмотра (если иное поведение не предусмотрено разработчиком). Для обеспечения стандартной расшифровки в макет необходимо внести добавления, указав параметр расшифровки Рис. 5.14. Макет отчета c подготовкой стандартной расшифровки А в программном коде эту переменную необходимо означить перед выводом области. В предыдущем коде такая строка уже есть: …………. Область.Параметры.сотрудник=Выб.Ссылка; ………… Результат вывода отчета, рис. 5.15. 101 Рис. 5.15. Печатная форма справочника сотрудников со стандартной расшифровкой Обработка нестандартных расшифровок производится средствами встроенного языка. Например, разработчик может задать алгоритм получения детального отчета, путем переформирования существующего с использованием дополнительных условий отбора ("показать продажи только по этому контрагенту"). Или же, используя расшифровку, пользователь может получить совершенно новый отчет (например "показать расходные накладные, которые сделали вклад в объем продаж по данному контрагенту"). Пример. В качестве нестандартной расшифровки предыдущего отчета будем выводить список детей выбранного в основном отчете сотрудника. Для этого: в макете основного отчета в свойстве ячейки «ФИО» установлен параметр расшифровки (см. Рис. 5.14.) Дополнительно, необходимо в свойствах элемента ТаблДок на событие «Обработка расшифровки» назначить процедуру – обработку с произвольным именем : 102 Рис. 5.16. Настройка табличного документа на нестандартную расшифровку Сформировать макет для конкретизирующего отчета - расшифровки: Рис. 5.17. Макет конкретизирующего отчета В модуль отчета добавить программный код: &НаКлиенте Процедура ТаблДокОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) СтандартнаяОбработка=ложь; Сотрудник=Расшифровка; ТабДетей=Новый ТабличныйДокумент(); ТабДетей=ВыполнитьРасшифровку(Сотрудник); ТабДетей.ТолькоПросмотр=Истина; ТабДетей.Показать(""); 103 КонецПроцедуры Функция ВыполнитьРасшифровку(Сотрудник) ТабДетей=Новый ТабличныйДокумент(); МакетДетей= Отчеты.СписокСотрудников.ПолучитьМакет("СписокДетей") ; Область = МакетДетей.ПолучитьОбласть("Шапка"); Область.Параметры.Сотрудник=Сотрудник; ТабДетей.Вывести(Область); Для каждого Стр из Сотрудник.Дети Цикл Область = МакетДетей.ПолучитьОбласть("Строка"); Область.Параметры.Имя=Стр.имя; Область.Параметры.Тип=Стр.ТипРебенка; Область.Параметры.ДатаРождения=Стр.ДатаРождения; ТабДетей.Вывести(Область); КонецЦикла; Возврат ТабДетей; КонецФункции Результат: Рис. 5.18. Печатная форма справочника сотрудников с нестандартной расшифровкой 5.3.4. Примечания Разработчик имеет возможность задавать примечания для отдельных ячеек или групп ячеек документа. Ячейка с примечанием имеет маленький треугольник в правом верхнем углу. При наведении курсора на ячейку, примечание отображается во 104 всплывающем окне. С помощью примечаний можно добавлять в табличные документы дополнительную (справочную) информацию, которая не отображается на экране (в обычном режиме), но может быть легко просмотрена, если подвести курсор мыши к нужной ячейке. Для добавления примечания в предыдущем примере необходимо внести добавления в программный код: &НаКлиенте Процедура ПечатьСправочника(Команда) ТаблДокум=печать(); КонецПроцедуры Функция Печать() Таб = Новый ТабличныйДокумент(); Макет= Справочники.Сотрудники.ПолучитьМакет("МакетПечатиСотрудников") ; Область = Макет.ПолучитьОбласть("Шапка"); Таб.Вывести(Область); ОбластьПримечанияГр=Макет.Область("R8C1:R8C4"); ОбластьПримечанияЭл=Макет.Область("R6C1"); Таб.НачатьАвтогруппировкуСтрок(); Выб=Справочники.Сотрудники.Выбратьиерархически(); Пока выб.Следующий() Цикл Если Выб.ЭтоГруппа Тогда ОбластьПримечанияГр.Примечание.Текст = Выб.Наименование; Область = Макет.ПолучитьОбласть("Группа"); Область.Параметры.НаименованиеГруппы=Выб.Наименование; Иначе ОбластьПримечанияЭл.Примечание.Текст = Выб.Наименование; Область = Макет.ПолучитьОбласть("Строка"); Область.Параметры.ФИО=Выб.Наименование; Область.Параметры.Пол=Выб.Пол; Область.Параметры.Образование=Выб.Образование; Область.Параметры.Оклад=Выб.Оклад; Область.Параметры.сотрудник=Выб.Ссылка; КонецЕСли; Таб.Вывести(Область,Выб.УровеньВВыборке(),,Истина); КонецЦикла; Таб.ЗакончитьАвтогруппировкуСтрок(); Возврат Таб; КонецФункции Результат: 105 Рис. 5.19. Печатная форма справочника сотрудников с примечаниями 5.4. Сохранение отчетов Поскольку табличный документ, чаще всего, используется для формирования выходных документов, он может быть сохранен в файл на диске для последующего использования или переноса на другие компьютеры. Табличный документ может быть сохранен как в собственном формате, так и экспортирован в другие форматы хранения данных, в том числе в формат документов Microsoft Office 2007 (*.xlsx, *.docx), в формат электронной таблицы OpenDocument (*.ods) или в формат электронных документов Adobe (*.pdf): 5.5. Конструктор печати Конструктор печати предназначен для создания макета печатной формы объекта прикладного решения и процедуры на встроенном языке, которая будет формировать печатную форму на основании этого макета. Конструктор печати может быть вызван, например, из окна редактирования справочника, или отчета. 5.6. Варианты заданий Выполнение работы состоит из следующих этапов: 1. Создать новую подсистему «Лабораторная работа 2». Поместить в данную подсистему все новые объекты задания. 2. Разработать отчет со стандартной расшифровкой вывода списка элементов основного справочника (см. варианты заданий в главе 4). Для этого необходимо: В форме списка основного справочника создать кнопку «Печать» и на событие нажатия на эту кнопку вызвать процедуру формирования отчета; Сформировать процедуру печати; Сформировать макет печати; Обеспечить группировку выводимого списка; Обеспечить вывод примечаний в табличном документе; Выполнить стандартную расшифровку отчета 3. Разработать отчет с нестандартной расшифровкой вывода списка элементов этого же справочника.. Для этого необходимо: Сформировать объект «Отчет» для печати справочника. Имя отчета – произвольно. 106 Сформировать макет печати; Сформировать процедуру печати; Выполнить нестандартную расшифровку отчета. В качестве конкретизирующего отчета-расшифровки брать данные из: А) для четных вариантов заданий – из табличной части выбранного элемента справочника; Б) для нечетных вариантов заданий – из подчиненного справочника. |