Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Волшебство программирования на 1С:Предприятие 7.7 и 8.0 . Выпуск 69


Информационный Канал Subscribe.Ru

Волшебство программирования на 1С:Предприятие 7.7 и 8.0
Выпуск 69 / 01.09.2004

Здравствуйте, уважаемые подписчики. В этом выпуске приводится третья (и пока последняя) статья Печенкина Романа о построителе отчета в 1С:Предприятии 8.0. Эту и предыдущие статьи со скриншотами можно найти здесь www.mista.ru/v8/repbuilder.htm. Свои замечания по статье можно присылать мне по e-mail или публиковать на форуме www.forum.mista.ru


Построитель отчета - часть 3

Автор: Печенкин Роман

7. Расширения языка запросов для построителя отчета

Построитель отчета имеет свой язык. Это обычный язык запросов, дополненный конструкциями “{…}”. С помощью этих конструкций можно отказаться от метода “ЗаполнитьНастройки()” и настроить построитель отчета в тексте запроса.
Таким образом можно настроить элементы “ВЫБРАТЬ”, “ГДЕ”, “УПОРЯДОЧИТЬ ПО”, “ИТОГИ ПО”, а также сделать еще несколько интересных вещей. В этом случае основной текст запроса построителя будет являться настройками по умолчанию, в то время как конструкции {…} будут описывать доступные настройки.

Если поле выборки позволяет получить что-то через точку, то можно указать “.*” после поля, тогда пользователь сможет выбирать реквизиты поля. Например, “Номенклатура.*” позволяет сделать сортировку по “Номенклатура.Код” или отбор по “Номенклатура.Услуга”. А вот “Количество.*” смысла не имеет, так как поле “Количество” реквизитов не имеет, а, значит, достаточно указать просто “Количество”.

Поля, указанные в конструкции “ВЫБРАТЬ”, ограничивают список полей, доступных пользователю.
Поля, указанные в конструкции “ГДЕ”, ограничивают список полей, которые можно использовать в фильтре.
Поля, указанные в конструкции “УПОРЯДОЧИТЬ ПО”, ограничивают список полей для сортировки.
Поля, указанные в конструкции “ИТОГИ ПО”, ограничивают список полей для группировки итогов.

А теперь интересные вещи.

Во-первых, в основном тексте запроса можно в параметрах источников также использовать конструкции {…}. К примеру, если вместо


|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&ДатаОкончания)
указать
|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки({&ДатаОкончания})


то в этом случае можно будет задать фильтр по полю “ДатаОкончания”.

При этом, в первом случае обязательно требуется установить параметр построителя отчета “ДатаОкончания”, во втором же случае этого не требуется, кроме того, если отбор по полю “ДатаОкончания” не будет задан, то этот параметр таблицы “РегистрНакопления.ОстаткиТоваровКомпании.Остатки” вообще не будет учитываться.

Во-вторых, источники в тексте запроса можно помечать как необязательные, помещая их в конструкцию “{…}”. К примеру, если составить такой текст запроса

|ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.Номенклатура КАК Номенклатура,
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток КАК Количество,
| ПартииТоваровКомпанииОстатки.КоличествоОстаток КАК КоличествоПоПартиям
|
|{ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.Номенклатура КАК Номенклатура,
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток КАК Количество,
| ПартииТоваровКомпанииОстатки.КоличествоОстаток КАК КоличествоПоПартиям}
|
|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки КАК ОстаткиТоваровКомпанииОстатки
| {ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровКомпании.Остатки КАК ПартииТоваровКомпанииОстатки
| ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = ПартииТоваровКомпанииОстатки.Номенклатура}
|
|ИТОГИ СУММА(Количество), СУММА(КоличествоПоПартиям) ПО
| ОБЩИЕ,
| Номенклатура

то левое соединение по регистру партий будет выполняться только в том случае, если в списке выбранных полей будет присутствовать поле “КоличествоПоПартиям”.

В-третьих, в параметрах источников можно указать, что в случае задания фильтров по возможности применять их не к результату выполнения запроса с помощью элемента “ГДЕ”, а к самому источнику. Таким образом, вместо
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки()

имеет смысл писать

| РегистрНакопления.ОстаткиТоваровКомпании.Остатки(, {Номенклатура.*, СкладКомпании.*, Заказ.*, ЦенаВРознице, ХарактеристикаНоменклатуры.*})

Ну и, в-четвертых, самое вкусное, на мой взгляд. В случае указания в источнике параметра “Периодичность” (для таблиц, позволяющих получать обороты) его также можно задать как “{…}”, и, в результате небольшой манипуляции с текстом запроса построителя мы можем использовать группировки по периодам.

              Пример:


        |ВЫБРАТЬ РАЗРЕШЕННЫЕ
   | ПартииТоваровКомпанииОбороты.Номенклатура,
   | СУММА(ПартииТоваровКомпанииОбороты.СтоимостьПриход) КАК СтоимостьПриход,
   | СУММА(ПартииТоваровКомпанииОбороты.СтоимостьРасход) КАК СтоимостьРасход
   |
   |ИЗ
   | РегистрНакопления.ПартииТоваровКомпании.Обороты(, , {&Периодичность}, 
   |  {Номенклатура.*}) КАК ПартииТоваровКомпанииОбороты
   |
   |СГРУППИРОВАТЬ ПО
   | ПартииТоваровКомпанииОбороты.Номенклатура
   |
   |ИТОГИ СУММА(СтоимостьПриход), СУММА(СтоимостьРасход) ПО
   | ОБЩИЕ,
   | Номенклатура
   |
   |{ВЫБРАТЬ
   | ПартииТоваровКомпанииОбороты.Номенклатура.*,
   | Регистратор.*,
   | НачалоПериода(Период, День) КАК ПериодДень,
   | НачалоПериода(Период, Неделя) КАК ПериодНеделя,
   | НачалоПериода(Период, Декада) КАК ПериодДекада,
   | НачалоПериода(Период, Месяц) КАК ПериодМесяц,
   | НачалоПериода(Период, Квартал) КАК ПериодКвартал,
   | НачалоПериода(Период, Полугодие) КАК ПериодПолугодие,
   | НачалоПериода(Период, Год) КАК ПериодГод,
   | СУММА(ПартииТоваровКомпанииОбороты.СтоимостьПриход) КАК СтоимостьПриход,
   | СУММА(ПартииТоваровКомпанииОбороты.СтоимостьРасход) КАК СтоимостьРасход}
   |
   |{УПОРЯДОЧИТЬ ПО
   | ПартииТоваровКомпанииОбороты.Номенклатура.*,
   | Регистратор.*,
   | СтоимостьПриход,
   | СтоимостьРасход}
   |
   |{ГДЕ
   | ПартииТоваровКомпанииОбороты.Номенклатура.*,
   | Регистратор.*,
   | СУММА(ПартииТоваровКомпанииОбороты.СтоимостьПриход) КАК СтоимостьПриход,
   | СУММА(ПартииТоваровКомпанииОбороты.СтоимостьРасход) КАК СтоимостьРасход}
   |
   |{ИТОГИ ПО
   | Номенклатура.*,
   | Регистратор.*,
   | НачалоПериода(Период, День) КАК ПериодДень,
   | НачалоПериода(Период, Неделя) КАК ПериодНеделя,
   | НачалоПериода(Период, Декада) КАК ПериодДекада,
   | НачалоПериода(Период, Месяц) КАК ПериодМесяц,
   | НачалоПериода(Период, Квартал) КАК ПериодКвартал,
   | НачалоПериода(Период, Полугодие) КАК ПериодПолугодие,
   | НачалоПериода(Период, Год) КАК ПериодГод}

Есть один нюанс, для того, чтобы группировка по периодам работала, необходимо добавить фильтр по параметру “Периодичность”. Чтобы не делать это вручную, для удобства можно перед выполнением построителя отчета программно его добавлять, а после выполнения удалять, чтобы он не смущал, так как с точки зрения здравого смысла понять такой фильтр невозможно. Делается это примерно так

Если ПостроительОтчета.ДоступныеПоля.Найти("Периодичность") <> Неопределено Тогда
   
   Периодичность = Неопределено;
   
   //программный код ниже проверяет, не встречается ли в измерениях строки или колонки
//определенная периодичность, заданная строкой, и если да, то устанавливает отбор по периодичности, //в котором в качестве значения отбора используется число
КодыПериодичности = Новый Структура("Периодичность,Код");
КодыПериодичности.Вставить("ПериодГод",9);
КодыПериодичности.Вставить("ПериодПолугодие",8); КодыПериодичности.Вставить("ПериодКвартал",7); КодыПериодичности.Вставить("ПериодМесяц",6); КодыПериодичности.Вставить("ПериодДекада",5); КодыПериодичности.Вставить("ПериодНеделя",4); КодыПериодичности.Вставить("ПериодДень",3); КодыПериодичности.Вставить("Регистратор",2); Для Каждого Элемент ИЗ КодыПериодичности Цикл Если ПостроительОтчета.ИзмеренияСтроки.Найти(Элемент.Ключ) <> Неопределено ИЛИ ПостроительОтчета.ИзмеренияКолонки.Найти(Элемент.Ключ) <> Неопределено Тогда Периодичность = Элемент.Значение; КонецЕсли; КонецЦикла; Если Периодичность=Неопределено Тогда
Если ПостроительОтчета.ВыбранныеПоля.Найти("Регистратор") <> Неопределено Тогда Периодичность = 2; КонецЕсли КонецЕсли; Если Периодичность <> Неопределено Тогда ПолеОтбораПоПериодичности = ПостроительОтчета.Отбор.Добавить("Периодичность"); ПолеОтбораПоПериодичности.Значение = Периодичность; ПолеОтбораПоПериодичности.Использование = Истина; КонецЕсли; КонецЕсли;
Построитель.Выполнить();
Если ПолеОтбораПоПериодичности <> Неопределено Тогда
                 
   ПостроительОтчета.Отбор.Удалить(ПостроительОтчета.Отбор.Индекс(ПолеОтбораПоПериодичности));
   
КонецЕсли;

См. также:
1С:Предприятие 7.7: учебник, курс лекций, статьи, ссылки
Книга "Разработка в системе 1С:Предприятие 8.0" - http://www.v8.1c.ru/book/v8develop.htm

Официальный сайт рассылки - www.mista.ru
Волшебный форум -
www.forum.mista.ru,
Форум по 1С - http://www.forum.mista.ru/index.php?forum=1c
Архив выпусков этой рассылки - http://www.mista.ru/subscribe

С уважением,
Станислав Митичкин (aka Волшебник)
stasmit@mail.ru



http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.magic1c
Отписаться

В избранное