Описание встроенного языка системы 1С Предприятие

         

Разработка вложенных отчетов


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

Поскольку каждая ячейка Таблицы может содержать значение, записанное в нее (см. Конфигуратор, редактор таблиц — Свойства ячейки — Текст — поле: Зна­чение), то в программном модуле формы отчета возможно обрабатывать это значение. Обработка значения ячейки Таблицы вызывается системой по кла­више <Enter> или по двойному щелчку мышью на какой-либо ячейке (если режим «только просмотр»). Стандартными действиями системы на обработку такого события являются: для документа — открытие документа, для элемента справочника — открытие формы редактирования элемента справочника. Дру­гими словами, стандартные действия системы зависят от типа данных содер­жащегося в ячейке значения. Однако, это событие возможно перехватить и об­работать нестандарным способом. Для этого предназначена предопределенная процедура встроенного языка ОбработкаЯчейкиТаблицы.

Примером нестандартной обработки значения ячейки таблицы может быть, например, вызов на формирование другого отчета. Таким образом, мы можем создавать как бы вложенные отчеты, которые вызываются один из другого, вы­давая с каждым разом более детальную информацию. Допустим отчет «Взаи­морасчеты» при формировании всегда выводится в кратком виде, когда виден только сводный баланс по контрагенту. Для того, чтобы получить детальный отчет по данному контрагенту, достаточно встать курсором в готовой форме отчета на этого контрагента и нажать клавишу <Enter>. Тогда сработает про­цедура ОбработкаЯчейкиТаблицы, в которой можно записать вызов форми­рования детального отчета. А если, кроме того, завести флаг режима отображе­ния, то можно вместо этого показывать карточку этого контрагента из справоч­ника.




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

Пример:

Процедура ПродВсего()

   Перем Запрос, ТекстЗапроса, Таб;

   ДатаКон = ДатаКонца;

   Если ДатаКон >= ПолучитьДатуТА() Тогда

      ДатаКон = Дата(0);

   КонецЕсли;



   //Создание объекта типа Запрос

   Запрос = СоздатьОбъект("Запрос");

   ТекстЗапроса = "//{{ЗАПРОС(ПродВсего)

   |Период с ДатаНачала по ДатаКон;

   |ТОВАР = Документ.РасхНакл.Товар;

   |Сумма_Прод = Документ.РасхНакл.СуммаРуб;

   |КОЛВО_Прод = Документ.РасхНакл.Количество;

   |Группировка ТОВАР;

   |Функция Продано = Сумма(КОЛВО_Прод);

   |Функция СуммаПродано = Сумма(Сумма_Прод);

   |"//}}ЗАПРОС

   ;

   // Если ошибка в запросе, то выход из процедуры

   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

      Возврат;

   КонецЕсли;

   // Подготовка к заполнению

   Таб = СоздатьОбъект("Таблица");

   Таб.ИсходнаяТаблица("ТабВсего");

   Таб.ВывестиСекцию("Отчет");

   Пока Запрос.Группировка("Товар") = 1 Цикл

      ПродСумма = Запрос.СуммаПродано;

      Если Запрос.Товар.ЭтоГруппа() = 1 Тогда

         Таб.ВывестиСекцию("Группа");

      Иначе

         Таб.ВывестиСекцию("Товар");

      КонецЕсли;

   КонецЦикла;

   // Вывод заполненной формы

   Таб.ТолькоПросмотр(1);

   Таб.Опции(0, 0, 4, 0);

   Таб.Показать("Продажа товаров ", "");

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



с 01.11.96 по 19.11.96

Товар"Продано

В режие исполнения у нас получится такой отчет:

Далее, допустим, мы хотим получить более подробный отчет по конкретно­му товару, так, чтобы указав на товар в отчете, и дважды нажав кнопку мыши, мы получали отчет по продажам именно этого товара с точностью до каждого клиента. Для этого откроем в Конфигураторе редактор таблицы нашего отчета и в свойствах ячейки (Свойства ячейки — Текст — поле: Значение), отображающей наименование товара, проставим значение ячейки. («Запрос.Товар»)



Далее, в программном модуле напишем процедуру формирования дополни­тельного отчета.

Продолжение примера:

//*********************************

// Процедура дополнительного отчета

Процедура ПродТовар(ВТовар)

   Перем Запрос, ТекстЗапроса, Таб;

   ДатаКон = ДатаКонца;

   Если ДатаКон >= ПолучитьДатуТА() Тогда

      ДатаКон = Дата(0);

   КонецЕсли;

   //Создание объекта типа Запрос

   Запрос = СоздатьОбъект("Запрос");

   ТекстЗапроса = "//{{ЗАПРОС(ПродТовар)

   |Период с ДатаНачала по ДатаКон;

   |КЛИЕНТ = Документ.РасхНакл.Клиент;

   |ТОВАР = Документ.РасхНакл.Товар;

   |СУММ = Документ.РасхНакл.СуммаВал;

   |КОЛВО = Документ.РасхНакл.Количество;

   |Группировка КЛИЕНТ Упорядочить По КЛИЕНТ.Наименование;

   |Группировка ТОВАР Упорядочить По ТОВАР.Наименование;

   |Функция Продано = Сумма(КОЛВО);

   |Функция ПродСум = Сумма(СУММ);

   |"//}}ЗАПРОС

   ;

   Если ВТовар.Выбран() = 1 Тогда

      Если ВТовар.ЭтоГруппа() = 1 Тогда

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

             "Условие(Товар.ПринадлежитГруппе(ВТовар) = 1);";

      Иначе

         ТекстЗапроса = ТекстЗапроса + "Условие (Товар = ВТовар);";

         ФОдинТовар = 1;

      КонецЕсли;

   КонецЕсли;

   // Если ошибка в запросе, то выход из процедуры

   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

      Возврат;

   КонецЕсли;

   // Подготовка к заполнению выходных форм

   Таб = СоздатьОбъект("Таблица");

   Таб.ВывестиСекцию("Отчет");

   Пока Запрос.Группировка("Клиент") = 1 Цикл

      Таб.ВывестиСекцию("Клиент");

      Пока Запрос.Группировка("Товар") = 1 Цикл

         Если ФОдинТовар = 0 Тогда

            Таб.ВывестиСекцию("Товар");

         КонецЕсли;

      КонецЦикла;

   КонецЦикла;

   // Вывод заполненной формы

   Таб.ТолькоПросмотр(1);

   Таб.Опции(0, 4, 0, 0);

   Таб.Показать("Продажа товара", "");

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

Теперь нам осталось написать предопределенную процедуру, которая возь­мет на себя обработку события «двойной щелчок мышью на выбранной ячейке таблицы». Главная задача этой процедуры — определить, что выбрана ячейка, где указано значение товара и вызвать на исполнение процедуру формирования дополнительного отчета, написанную ранее.

Продолжение примера:

//-------------------------

Процедура ОбработкаЯчейкиТаблицы(ЗначЯч, ФлагСтандартнойОбработки)

   Если ТипЗначения(ЗначЯч) = 2 Тогда

      ФлагСтандартнойОбработки = 1;

      Возврат;

   КонецЕсли;

   ПродТовар(ЗначЯч);

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

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


Содержание раздела