Примеры использования Запросов
В режиме исполнения у нас получится такой отчет:
Далее, допустим, мы хотим получить более подробный отчет по конкретному товару, так, чтобы указав на товар в отчете, и дважды нажав кнопку мыши, мы получали отчет по продажам именно этого товара с точностью до каждого клиента. Для этого откроем в Конфигураторе редактор таблицы нашего отчета и в свойствах ячейки (Свойства ячейки – Текст – поле: Значение), отображающей наименование товара, проставим значение ячейки. ("Запрос.Товар")
Далее, в программном модуле напишем процедуру формирования дополнительного отчета.
Продолжение примера:
//********************************* // Процедура дополнительного отчета Процедура ПродТовар(ВТовар) Перем Запрос, ТекстЗапроса, Таб; ДатаКон = ДатаКонца; Если ДатаКон >= ПолучитьДатуТА() Тогда ДатаКон = Дата(0); КонецЕсли; //Создание объекта типа Запрос Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(ПродТовар) |Период с ДатаНачала по ДатаКон; |КЛИЕНТ = Документ.РасхНакл.Клиент; |ТОВАР = Документ.РасхНакл.Товар; |СУММ = Документ.РасхНакл.СуммаВал; |КОЛВО = Документ.РасхНакл.Количество; |Группировка КЛИЕНТ Упорядочить По КЛИЕНТ.Наименование; |Группировка ТОВАР Упорядочить По ТОВАР.Наименование; |Функция Продано = Сумма(КОЛВО); |Функция ПродСум = Сумма(СУММ); |"//}}ЗАПРОС ; Если ВТовар.Выбран() = 1 Тогда Если ВТовар.ЭтоГруппа() = 1 Тогда ТекстЗапроса = ТекстЗапроса + "Условие(Товар.ПринадлежитГруппе(ВТовар) = 1);"; Иначе ТекстЗапроса = ТекстЗапроса + "Условие (Товар = ВТовар);"; ФОдинТовар = 1; КонецЕсли; КонецЕсли; // Если ошибка в запросе, то выход из процедуры Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли; // Подготовка к заполнению выходных форм Таб = СоздатьОбъект("Таблица"); Таб.ВывестиСекцию("Отчет"); Пока Запрос.Группировка("Клиент") = 1 Цикл Таб.ВывестиСекцию("Клиент"); Пока Запрос.Группировка("Товар") = 1 Цикл Если ФОдинТовар = 0 Тогда Таб.ВывестиСекцию("Товар"); КонецЕсли; КонецЦикла; КонецЦикла; // Вывод заполненной формы Таб.ТолькоПросмотр(1); Таб.Опции(0, 4, 0, 0); Таб.Показать("Продажа товара", ""); КонецПроцедуры
Теперь нам осталось написать предопределенную процедуру, которая возьмет на себя обработку события "двойной щелчок мышью на выбранной ячейке таблицы". Главная задача этой процедуры – определить, что выбрана ячейка, где указано значение товара и вызвать на исполнение процедуру формирования дополнительного отчета, написанную ранее.
Продолжение примера:
//------------------------- Процедура ОбработкаЯчейкиТаблицы(ЗначЯч, ФлагСтандартнойОбработки) Если ТипЗначения(ЗначЯч) = 2 Тогда ФлагСтандартнойОбработки = 1; Возврат; КонецЕсли; ПродТовар(ЗначЯч); КонецПроцедуры
Теперь, в режиме исполнения, если в отчете "Продажи товаров" мы укажем курсором на товар, например, "Сапоги женские" и дважды щелкнем на нем мышью, то сформируется дополнительный подробный отчет "Продажа товара".