Как в запросе осуществить отбор по значению перечисления?
Причем реквизит «Размещение» имеет составной тип
(ДокументСсылка.ЗаказПоставщику,
СправочникСсылка.Склады) а количество списываемого товара в базовых единицах должно определяться по формуле:
КоличествоСписываемогоТ овара = Количество* Коэффициент.
Регистр «ТоварыНаСкладах» имеет следующую структуру:
і
9 ТовврыНаСкладах Й-/ * Измерения —!. Склад —. Номенклатуре I. ХарактеристикаНоменклатурія . . СермяНомеиклатуры . Качество ?-|_ Ресурсы
*•—I Количество
Для проверки достаточности остатков желательно получить одним запросом таблицу вида:
Номенклатура |
Склад |
Количество |
Количество |
|
|
списываемое |
в остатке |
Минск-Атлант 126 |
Главный склад |
1 |
10 |
Минск-Атлант 712 |
Главный склад |
3 |
2 |
Стинол 101 |
Главный склад |
1 |
11 |
Bosh-675 |
Главный склад |
7 |
17 |
Минск-Атлант 712 |
Склад электротоваров |
1 |
1 |
Обратите внимание, в общем случае в табличной части документа может иметь место неоднократное указание какой-нибудь конкретной комбинация «Номенклатура-Склад» (в нашем случае «Минск-Атлант 712 - Главный склад»). В выходной таблице данные документа в таких случаях должны быть свернуты.
Поэтому запрос можно построить левым внешним соединением вложенного запроса по документу (группирующего данные из документа по номенклатуре и складу) и виртуальной таблицы «РегистрНакопления.ТоварыНаСкладах.Остатки»
ВЫБРАТЬ
ВложенныйЗапрос. Номенклатура. ВложенныйЗапрос.Размещение КАК Склад. ВложенныйЗапрос. КоличествоСписываемое,
Товары НаС кладахОстатки. Кол и чествоОстаток ИЗ
(ВЫБРАТЬ
ВнутреннийЗаказТовары.Номенклатура КАК Номенклатура, ВнутреннийЗаказТовары.Размещение КАК Размещение. СУММА(ВнутренннйЗаказТовары. Количество
¦ВнутренннйЗаказТовары. Коэффициент)
КАК КоличествоСписываемое
ИЗ
Документ. ВнутренннйЗаказ.Товары КАК ВнутреннийЗаказТовары ГДЕ
ВнутреннийЗаказТовары.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО ВнутреннийЗаказТовары.Номенклатура.
ВнутреннийЗаказТовары.Размещение ) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ
РеіисірНакогшения.ТоварыНаСкладах.Остатки(&МоментВремениДокумента, Склад В (ВЫБРАТЬ РАЗЛИЧНЫЕ
ВЫРАЗИТЫВнутреннийЗаказТоварыДляОтбора. Размещение КАК Справочник.Склады)
ИЗ
Документ.ВнутреннийЗаказ.Товары
КАК ВнутреннийЗаказТоварыДляОі бора
ГДЕ
ВнутреннинЗаказТоварыДдяОтбора.Ссылка = &Ссылка И
НЕ ВЫРАЗИТЫВнутреннийЗаказТоварыДляОтбора.Размещение КАК Снравочннк.Склады) ЕСТЬ NULL )
И
Номенклатура В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
ВнугреннийЗаказТоварыДляОтбора.Номенклатура
ИЗ
Доку мент. ВнутренннйЗаказ.Товары
КА К ВнутренннйЗаказТоварыДляОтбора
ГДЕ
ВнутреннийЗаказТоварыДляОтбора.Ссылка = &Ссылка)) КАК ТоварыНаСкладахОстатки НО
ВложенныйЗапрос. Номенклатура = ТоварыНаСкладахОстатки.Номенклатура И
ВложенныйЗапрос. Размещение = ТоварыНаСкладахОстатки.Склад
Немножко подробнее о параметрах виртуальной таблицы « РегистрНакопления. Товары НаСкладах. Остатки»:
Первым параметром должен передаваться момент времени документа. Момент времени - это тип данных, содержащий дату и ссылку на документ. Именно он позволяет однозначно позиционировать документ среди других, обладающих той же датой (дата ведь,, как известно, имеет точность - только до секунды). В результате мы получим данные об остатках именно на момент времени документа.
Вторым параметром передаем отбор по измерениям.
Для измерения «Склад» надо передать таблицу тех складов, которые встречались в табличной части нашего документа. Получаем ее вложенным запросом. Сложность в данном случае заключается в том, что тип значения реквизита «Размещение» - составной. А нам нужны только значения типа СпрЗВОЧНИкСсылка.Склад. Сложность разрешается применением Выразить(). В результате мы приводим данные к нужному типу значения, а значения NULL, которые «не привелись» -отсекаем условием. Кроме того, выбираем только не повторяющиеся записи.
Аналогично - для измерения «Номенклатура». В качестве таблицы для возможных значений отбора передаем таблицу номенклатурных позиций, полученную запросом по табличной части нашего же документа.
Осуществлять такие отборы на параметрах виртуальных таблиц важно для обеспечения быстроты получения виртуальной таблицы. Чтобы не получилось, что она строится по тем номенклатурным позициям и тем складам, которых и в документе-то и нет.
Само же соединение осуществляется по полям «Номенклатура» таблиц «ВложенныйЗапрос» и «ТоварыНаСкладахОстатки» и по полям «Размещение» и «Склад».
Как в запросе осуществить отбор по значению перечисления?
Необходимо отобрать всех работников предприятия, стоящих на момент «ДатаОтчета» на воинском учете. Данные о воинском учете данные хранятся в периодическом регистре сведений «ВоинскийУчет».
Ф ВоинскийУчет ? * . Измерения I—I. Физ/ыцо 0 _ Ресурсы
— 0 ОтношениеКВсимскойОбязаиности — I ОтнсзшениеКВсиеоюмуУчегту
— I Категория Запас а
— 0 Звание — I Состав -0 ВУС
— 0 Годность
— 0 Воемиэмат
— 0 НаличиеМоблренгысаиия
— 0 НомерКоманаьПарпы
I— 0 Забронировано реализацией 2 Реквизиты
Тип значения ресурса «ОтношениеКВоинскомуУчету» «ПеречислениеСсылка.ОтношениеКВоинскомуУчету».
Получить требуемое можно посредством запроса:
Запрос.Текст= "ВЫБРАТЬ I ВоинскнйУчетСрезПоследних.Физлицо |ИЗ
I Регистреведений.ВоинскийУчет.СрезПоследнихІ&ДатаОтчета)
КАК ВоинскийУчетСрезПоследних
I
ГДЕ
I ВоинскийУчетСрезПоследних.ОтношениеКВоинскомуУчету = &Состоит'
Источником является виртуальная таблица
«РегистрСведений.ВоинскийУчет.СрезПоследних», рассчитанная на дату, указываемую в параметре «ДатаОтчета».
В результате запроса получим таблицу физических лиц, удовлетворяющих условию отбора. Отбор производится по полю «ОтношениеКВоинскомуУчету».
Сами же значение параметров устанавливается следующим образом:
Запрос.Установить! Іараметр< "ДатаОтчета". ДатаОтчета): Запрос.УстановитьПараметрС'Состоит",
Перечнслення.ОтношениеКВоішскомуУчету. Состоит);
Как получить курсы валют на две интересующие даты?
Для получения данных используем запрос. Текст запроса приведен ниже:
ВЫБРАТЬ
ВалютыСрезПоследннх.Валюта,
ВалютыСрезПоследних.Курс,
&ПерваяДата Как Дата ИЗ
Регистреведений.Валюты.СрезПоследних(&ПерваяДата,) КАК ВалютыСрезПоследних
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ВалютыСрезПоследннх.Валюта,
ВалютыСрезПоследних.Курс,
& Вторая Дата ИЗ
Регистре ведений. Валюты.СрезПослелних(&ВтораяДата.) КАК ВалютыСрезПоследних
Фактически первый запрос получает курсы валют на первую, интересующую нас дату, второй на вторую. Для сортировки можно дополнительно описать раздел «Упорядочить».
Как одним запросом получить таблицу расхождений курсов взаиморасчетов всех выписанных документов «ЗаказПокупателя» с официальным курсом?
Необходимо получить таблицу следующего вида:
Документ |
Валюта
договора |
Курс
взаиморасче
тов |
Курс
официальный |
Превышение |
Заказ покупателя
ТК000007 от 05.08.2004 12:00:01 |
USD |
31,51 |
30,6691 |
0,8409 |
Заказ покупателя
ТК000003 от 26.07.2004 11:42:39 |
руб |
1 |
1 |
|
Заказ покупателя
ТК000023 от 26.09.2004 12:00:02 |
EUR |
33,42 |
33,1609 |
-2,74 |
В отличие от вышеприведенного примера, дат получения курсов у нас очень много (по числу документов).
В таком случае лучше поступить следующим образом:
ВЫБРАТЬ
ВложенныйЗапрос.Ссылка КАК Документ, ВложенныйЗапрос.ДоговорКонтраіеніаВалютаВзаиморасчетов КАК ВалютаДоговора, ВложенныйЗапрос.КурсВзаиморасчетов,
ВЫБОР
КОГДА КурсыВалют.Курс ЕСТЬ NULL ТОГДА О ИНАЧЕ
Курсы Валют. Курс КОНЕЦ КАК КурсОфициальный,
ВЫБОР
КОГДА КурсыВалют.Курс ЕСТЬ NULL ТОГДА ВложенныйЗапрос. Курс Взаиморасчетов ИНАЧЕ
ВложснныйЗапрос.КурсВзаиморасчетов - Курсы Валют. Курс КОНЕЦ КАК Превышение ИЗ
(ВЫБРАТЬ
ЗакачІ Іокупателя.Ссылка КАК Ссылка.
МАКСИМУМ(КурсыВалют.Период) КАК Период. ЗаказПокупагеля.КурсВчанчорасчстов КАК КурсВчаиморасчетов. ЗакачГІокупателя.ДоговорКонграі ента ВалюіаВчанморасчечов КАК ДоговорКончрагентаВаіютаВзаиморасчетов ИЗ
Докумснт.ЗакаіПокупагеля КАК ЗакачІІокупателя ЛЕВОЕ СОЕДИНЕНИЕ
РегистрСведений.КурсыВалют КАК КурсыВалют НО
ЗакачПокупателя.ДоговорКонтрагента.ВалютаВчаиморасчетов =
КурсыВалют.Валюта
И
ЗакачПокупателя.Дата >= КурсыВалют.Период
СГРУППИРОВАТЬ ПО ЗакачПокупателя.КурсВчаиморасчетов,
ЗакачПокупателя.ДоговорКоитраіента.ВалютаВчаиморасчетов.
ЗакачПоку пателя.Ссылка ) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ
Рсгнс?рСведений.КурсыВачют КАК КурсыВалют ПО
ВложенныйЗапрос ДоговорКонтрагентаВа.чютзВчаиморасчетов =
КурсыВалют.Валюта
И
ВложенныйЗапрос.Период = КурсыВалют.Период
Во вложенном запросе получаем необходимые данные из документа и максимально близкий к дате документа период записи по такой же валюте из таблицы регистра сведений «КурсыВалюты».
Полученную таблицу внутренним соединением соединяем опять с таблицей регистра сведений «КурсыВалюты». Но теперь уже по совпадению полей «Валюта» и «Период». Из соответствующих этому совпадению записей получаем выходные поля, согласно требуемому.
Обратите внимание, может иметь место ситуация, когда дата документа меньше периода самой первой записи регистра. Предусмотрено, что в этом случае поле «КурсОфициальный» вернет нулевое значение, а поле «Превышение» курс взаиморасчетов.
Как написать запрос таким образом, чтобы на определенном уровне иерархии запроса считались одни итоговые функции, а на другом уровне другие?
Необходимо получить данные в следующем виде:
Номенклатура |
Характеристика |
Остаток |
Заказ |
Резерв |
Ботинки муж. |
Размер 45 |
10 |
|
8 |
Ботинки муж. |
Размер 45 |
10 |
|
|
Ботинки муж. |
Размер 45 |
|
Заказ**1 |
2 |
Ботинки муж. |
Размер 45 |
|
Заказ №2 |
6 |
Ботинки жен. |
Размер 38 |
5 |
|
2 |
Ботинки жен. |
Размер 38 |
5 |
|
|
Ботинки жен. |
Размер 38 |
|
Заказ №4 |
2 |
В самой базе данных данные находятся в регистрах накопления следующей структуры:
Остатки номенклатуры:

Остатки заказов покупателей:
? і« ЗакаэыПокупателем Измерения
— L. Догоеор?заиморасчетое ' . ЗакаэЛокулателя t. ТоварТара — t - Номенклатура — L ХарактеристикаНоме»*латуры В-Гя Ресурсы
Количество
Следует отметить, что в прямой постановке задача не решается. При определении раздела «Итоги» агрегатные функции итогов будут
считаться на всех уровнях иерархии запроса. Но постараться добиться подобного эффекта можно с помощью запроса:
ВЫБРАТЬ
ОстаткиТоваровКомпанииОстаткн.Номенклатура КАК Номенклатура. ОетаткнТоваровКомпанинОстатки. Номенклатура. Представление. ОстаткиТоваровКомпанииОстаткн. Хара ктеристикаНоменклатуры КАК ХарактсрпсіикаНомснклатуры,
ОстаткнТоваровКомпанинОстатки.Хара ктеристикаНоменклатуры. Представление, ОстаткиТоваровКомнанниОстаткн.КоличествоОстаток КАК КолнчествоОстаток, NULL как Закат.
О КАК Резерв ИЗ
РегистрНакопления.ОстаткиТоваровКомпанин.Остатки КАК ОстаткиТоваровКомпанииОстаткн
ОБЪЬДИНИТЬ ВСЕ
ВЫБРАТЬ
ЗаказыПокупателейОстатки. Номенклатура,
ЗаказыПокупателейОстаткн. Номенклатура. Представление. ЗаказыПокупателейОстатки. ХарактернстикаНоменклатуры, ЗаказыПокупателейОстатки.ХарактеристикаНоменклатуры.Представление.
О,
ЗаказыПокупателейОстатки.ЗаказПокупателя, ЗаказыПокупателейОстаткн.КоличествоОстаток ИЗ
Реі истрНакопления. Заказы Покупателей. Остатки КАК ЗаказыПокупателейОстатки
ИТОГИ СУММА(КоличествоОстаток), СУММА(Резерв) ПО Номенклатура,
ХарактернстикаНоменклатуры_
Первым запросам выбираются остатки, в полях соответствующих данным о резерве проставляем NULL и 0. Вторым запросом получаем данные по резервам. Раздел ИТОГИ позволяет внести иерархию в результат запроса с указанием остатка по позиции и итога по количеству зарезервированного товара.
Как получить перечень документов, приведших данные подчиненного периодического регистра сведений к определенному состоянию?
По данным периодического регистра сведений «КандидатыНаРаботу»
' КеноиаетьМаРаботу ф-^t-. Измерения
1—U Ф из Лицо ф~ f
a Ресурсы
L-1 Статус Оі Реквизиты |— — Оценке
— Подразделение — Должность
требуется построить таблицу:
ФизЛицо |
Документ |
Статус |
Андреева Жанна Юрьевна |
|
Отложен |
Андреева Жанна Юрьевна |
Регистрация кандидатов 000000
01 от 31.01.2004 0:00:00 |
Принят к рассмотр
ению |
Андреева Жанна Юрьевна |
Регистрация собеседования канд идата 00000005 от 09.02.2004 0:0 0:00 |
Отложен |
Арефьев Виталий Федорович |
|
Отложен |
Арефьев Виталий Федорович |
Регистрация кандидатов 000000
03 от 28.03.2004 0:00:00 |
Принят к рассмотр
ению |
Арефьев Виталий Федорович |
Регистрация собеседования канд идата 00000027 от 30.03.2004 0:0 0:00 |
Отложен |
На первом уровне таблица включать в себя указание всех кандидатов, для которых на момент формирования отчета статус приема на работу равен «отложен».
На втором уровне должны быть указаны все документы, выполнявшие движения по данным кандидатам с указанием устанавливаемого ими статуса.
Данную задачу лучше всего решить посредством запроса со следующим текстом:
ВЫБРАТЬ
КандидатыНаРаботу .ФизЛицо КАК ФизЛицо,
КандидатыНаРаботу.Регистрзтор КАК Документ.
КандидатыНаРаботу.Статус КАК Статус ИЗ
Регистре ведений. КандидатыНаРаботу.СрезІ1оследних(&ДатаОтчста.)
КАК Кандидаты НаРаботуСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ
Регистреведений.КандидатыНаРаботу КАК КандидатыНаРаботу ПО
КандидатыНаРаботуСрезПоследних.ФнзЛицо = КандидатыНаРаботу .ФизЛицо ГДЕ
КандидатыНаРаботуСрезПоследних.Статус = &Отложен И КандидатыНаРаботу.Период <= &ДатаОтчета
УПОРЯДОЧИТЬ ПО
КандидатыНаРаботу. ФизЛицо. Наименование,
Документ
ИТОГИ МАКСИМУМ(Статус) ПО ФизЛицо
АВТОУПОРЯДОЧИВАНИЕ
В качестве источника будет таблица - результат внутреннего соединения виртуальной таблицы
«РегистрСведений.КандидатыНаРаботу.СрезПоследних», рассчитанной на момент формирования отчета и реальной таблицы записей регистра сведений «КандидатыНаРаботу» по полю «ФизЛицо».
В результате отбора останутся только записи, в которых значение поля «Статус» равно «Отложен» и где период записей меньше даты отчета.
Выходными полями назначаем те, что требовались при постановке задачи.
Запросы,отчеты
Как установить параметры запроса, если текст запроса заранее не известен?
Такая необходимость может возникнуть, когда текст запроса формируется динамически, в зависимости от некоторых установок, выбранных пользователем.
В этом случае можно воспользоваться методом запроса НаЙТиПараметры(), который возвращает коллекцию объектов ОписаниеПараметраЗапроса, содержащих имя и тип значения каждого параметра:
Запрос = Новый ЗапросС ІВЫБРАТЬ
I Номснклатура.Ссылка |ИЗ
I Справочник.Номенклатура КАК Номенклатура |ГДЕ
I Номенклатура.Ссылка В ИЕРАРХИІН&ГруппаНоменклатуры)’’);
// Получить описание параметров запроса.
ПараметрыЗапроеа = Запрос.НайтиПараметры();
Для Каждого ПараметрЗапроса Из ПараметрыЗапроеа Цикл ЗаданноеЗначение = Неопрелелено;
// Открыть диалог ввода значения данного параметра.
Если ВвестиЗначение(ЗаданноеЗначение,
"Задайте значение параметра " + ПарамегрЗапроса.Имя ПараметрЗапроса.ТипЗначения) Тогда Запрос.УстановитьПарачетр(ПараметрЗапроса.Нмя, ЗаданноеЗначение);
Иначе
Возврат;
КонецЕсли:
КонецЦикла;
РезультатЗапроса = Запрос.ВыполнитьО;
Анализ данных
® Как получить данные о товарах продаваемых вместе?
В ряде случаев необходимо получить данные о совместно продаваемых товарных позициях. Такая информация может учитываться представителями торгующих компаний при раскладке товаров на стендах и прилавках. Например, если такие товары будут находиться рядом, то этот факт может увеличить объем их совместных продаж.
Рассмотрим следующий фрагмент кода:
Анализ = Новый АналмзДанных;
// Выбранный тип анализа как раз и указывает на то, что ишем // «совместно продаваемые» товары.
Анализ.ТипАнализа = ТипС’АнализДанныхПоискАссоциаций");
Запрос = Новый Запрос:
Запрос.Текст = "ВЫЬРАТЬ
I ПродажнКомпанииОбороты.Регистратор Как ДокументПродажи,
I ПродажиКомпанниОбороты.Номенклатура |ИЗ
I РегистрНакопления.ПродажиКомпанни.ОборотьК&НачПериода,
&КонПериода,
Регистратор)
I КАК ПродажиКомпанниОбороты |УПОРЯДОЧИТЬ ПО ДокументПродажи”;
Запрос.УстановитьПараметрС'НачПериода", НачПериода); Запрос.УстановитьПараметрГ'КонПериода", КонПериода);
// Получить продажи за указанный период.
// Выбрана периодичность по Регистратору, т.к. необходимо получить // данные о совместных продажах в рамках одной покупки.
Анализ.ИсточникДанных = Запрос. ВыполнитьО;
II Выполнить анализ в соответствии с указанным источником. РезультатАнализа = Аналнз.ВыполнитьО;
//Для вывода результата анализа воспользуемся построителем // отчета анализа данных.
Построитель = Новый ПостроительОтчетаАнализаДанныхО: Построитель. Макет = Неоиределено;
Построитсль.Тнп Анализа = Тип("АнализДанныхПоискАсс< |
иіиаиии'); |
ТабДок = Новый ТабличныйДокумент;
Построитель.Вывести(РезультатАнализа, ТабДок);
ТабДок. Показать)); |
|
Результат анализа будет показан в открытом окне табличного документа. Следует обратить внимание на тот факт, что полученный таким образом анализ произведен исходя из значений параметров «по умолчанию». Значения таких параметров можно менять программно, либо через «связанный» элемент управления ТабличноеПоле. В общем случае состав и назначение параметров определяется видом анализа.
ф Как порекомендовать сопутствующие товары?
При покупке может возникнуть необходимость получения данных о том, чем данная покупка отличается от «среднестатистической» подобной покупки. Реализуем возможность получения рекомендаций покупателю исходя из соображения: «Обычно когда покупают закупленный вами перечень товаров, берут еще это...».
Рассмотрим фрагмент кода:
Анализ = Новый АналмзДанных:
// Найти ассоциации.
Анализ.ТипАнализа = ТнпС'АнализДанныхПоиск Ассоциаций");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
I ПродажиКомпанниОбороты.Ретистратор КАК Доку мет Продажи
I ПродажнКомпанииОбороты.Номенклатура
|ИЗ
I РегистрНакоплення.ПродажиКомпании.Обороты(&НачПериода,
&Кон Периода, Регисіратор)
I КАК ПродажнКомпанииОбороты ІУПОРЯДОЧИТЬ ПО ДокумснтПродажи";
// Ассоциации ищем подокументно, это определяется поведением //объекта «АналнзДанных» «по умолчанию» при выборе // периодичности виртуадьной таблицы Регистратор
Запрос.УстаиовитьПараметрГ'НачПериода", НачПериода).
Запрос.УстановитьПараметрС'КонПериода", КонПсриода);
Анализ данных
Анализ.ИсточникДанных = Запрос.ВыполнитьО:
РезультатАнализа = Анализ.Выполнить();
// Исходя из полученного анализа создать прогноз.
МодельПрогноза = РезультатАнализа.СоздатьМодельПроі ноза();
// ТЗ- таблица значений, содержащая данные о том.
// какие номенклатурные позиции вошли в "текущую" покупку. МодельПрогноза.ИсточникДанных = ТЗ;
// ТП - элемент управления "Табличное поле" связанный через // свойство "Данные" с реквизитом формы "ТП“ (тип ТаблицаЗначений) ТП = МодельПрогноза.ВыполнитьО;
Элементы Формы.ТП.СоздатьКолонкиО:
В результате выполнения фрагмента кода «рекомендации» будут отображены в табличном поле «ТП». Следует помнить, о том, что в данном примере, что прогноз произведен исходя из значений параметров «по умолчанию». В общем случае состав и назначение параметров определяется видом анализа.
ф Как посмотреть, что будет покупаться в дальнейшем?
Необходимо решить следующую задачу: если клиент приобрел какой-либо товар, то с определенной долей вероятности он может прийти еще за каким-то дополнительным товаром. (Например, после покупки принтера он может приходить за расходными материалами к нему). Как получить подобную информацию?
Рассмотрим следующий фрагмент кода:
ТабДок = Новый ТабличныйДокумент:
Анализ = Новый АналнзДанных;
// Нужно спрогнозировать цепочку событий, поэтому выбираем // тип анализа «Поиск последовательностей».
Анализ.Тип Анализа = ТмпГАнализДанныхПоискПоследователыіостей");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
I ПродажиКомпанииОбороты.ДоговорВзаиморасчетовПокупателя. Владелец I КАК Контрагент,
I ПродажиКомпанииОбороты. Номенклатура,
I ПродажиКомпанииОбороты.Период |ИЗ
I РегистрНакопления.ПродажиКомпании.Обороты(&НачПериода.
&КонІ Іериода,
Регистратор)
КАК ПролажиКомпанииОбороты";
Запрос.УстановитьПараметр("НачПериода", НачПериода); Запрос.УстановнтьІІараметрС’КонПериода", КонПериода);
А и ал и). И сточи и к Д а н н ых = Запрос.ВыполннтьО:
Колонка = Анализ.НастройкаКолонок.НайтиС'Пернод");
//Указать, что колонка «Период» имеет тип «Время»,
// что «позволит понять» хронологию событий
Колонка.ТипКолонки = Тип Колонки АнализаДаниыхІ Іоиск Последовательностей .Время:
РезультатАнализа = Аналнз.ВыполнитьО;
МодельПрогноза = РезулыатАнализа.СоздатьМодельПрогнозаО;
// ТЗ- таблица значений, содержащая исходные данные для прогноза // например, какой контрагент, какой товар закупил (исходя из чего // попытаемся узнать, что они еще закупят).
МодсльПрогноза.ИсточникДанных = ТЗ;
// ТП - элемент управления «Табличное поле» связанный через //свойство «Данные» с реквизитом формы «ТП»
//(тип ТаблицаЗначений)
ТП = МодельПрогноза. ВыполнитьО:
ЭлементыФормы.ТП.СоздатьКолонкиО;
// Построитель - реквизит формы, имеющий тип // ПостроительОтчетаАнализаДанных. Ряд табличных полей // в диалоге могут быть связаны со свойствами-коллекциями // данного объекта
Построитсль.ТипАнализа = ТипС'АнализДанныхГІоискПослсдователыіостей''):
Построитель.Вывестн( РезультатАнализа. ТабДок);
ТабДок.ПоказатьО;
Полученные данные (что клиенты еще будут приобретать дополнительно исходя из уже совершенных ими покупок) можно использовать, например, при анализе складских запасов.
Представление результатов отчетов
Табличный документ, текстовый документ
Как вывести результат запроса в табличный документ?
Наиболее эффективным способом решения этой задачи является использование построителя отчета.
Однако в некоторых случаях требуется более «тонкая» работа с макетом табличного документа и тогда формирование результирующего табличного документа необходиомо выполнять самостоятельно, без использования возможностей построителя отчета.
Предварительно создадим макет (тип макета «Табличный документ»). Внешний вид макета приведен на рисунке. Имя макета: «Макет».

Текст процедуры, в которой формируется запрос, и результат запроса выводится в табличный документ, приведен ниже:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
I ОстаткиТоваровКомпанииОстатки.СкладКомпанни КАК СкладКомпанииСсылка, I ОстаткиТоваровКомпанииОстатки.Номенклатура КАК НоменклатураСсылка.
I СУММА(ОстаткиТоваровКомманииОстатки.КоличествоОстаток) КАК Остаток,
I ОстаткиТоваровКомпанииОстатки.Номенклатура.Представление КАК Номенклатура,
I ОстаткиТоваровКомпанииОстатки.СкладКомпании.Представление КАК Склад |ИЗ
I РегистрНакопления.ОстаткиТоваровКомпанин.Остатки(&Момент)
КАК ОстаткиТоваровКомпанииОстатки
|СГРУППИРОВАТЬ ПО
I ОстаткиТоваровКомпанииОстатки.СкладКомпанииСсылка,
I ОстаткиТоваровКомпанииОстаткн.НоменклатураСсылка
|ИТОГИ СУММА(Остаток) ПО Общие,
I Склад";
Запрос.УстановитьПараметрС'Момент", Неопределено);
Результат = Запрос.ВыполнитьО;
// Получить поле табличного документа, в которое будем выводить результат. ТабДок = ЭлементыФормы.ПолеТаблнчногоДокумента;
// Очистить данные в табличном документе // (возможно данные уже выводились ранее).
ТабДок.Очистить!);
Макет = ПолучитьМакетС'Макет");
// Получить именованные области из макета.
ОбластьОбщийИтог = Макег.ПолучитьОбласть("ОбщийИтог");
ОбластьСклад = Макет.ПолучитьОбластьС'Склад");
ОбластьНоменклатура = Макет.ПолучитьОбластьІ "Номенклатура");
// Получить выборку по первой итоговой группировке (первый уровень). ВыборкаОбшийИтог = Результат
.Выбрать!ОбходРезультатаЗапроса.ПоГруппнровкам);
// Запись общего итога всегда одна, поэтому можно обойтись без организации цикла. ВыборкаОбшийИтог.СледующийО;
// Произвести запись данных из полей выборки в именованные // области с совпадающими именами.
ОбластьОбщийНтог.Парамстры.Заполнить(ВыборкаОбщийИтог);
// Включить область с заполненными параметрами в табличный документ.
ТабДок. ВывестиЮбластьОбщийИтог):
// "От" записи первого уровня получить подчиненную выборку // записей второго уровня (по итоговой группировке "Склад").
ВыборкаПоСкладу = ВыборкаОбшийИтог
.Выбрать(Об.\одРезультатаЗаироса.ПоГруппировкам);
Пока ВыборкаПоСкладу.СледующийО Цикл ОбластьСклад. Параметры.Заполнить! ВыборкаПоСкладу); ТабДок.Вывести(ОбластьСклад);

// Получить подчиненную выборку, содержащую детальные записи ВыборкаПоНоменклатуре = ВыборкаПоСкладу.Выбрать!);
Пока ВыборкаПоНомеиклатуре.Следующийі) Цикл ОбластьНоменклатура.ІІараметры.ЗаполннтыВыборкаПоНоменклатуре): ТабДок.Вывести(ОбластьНоменклатура);
КонецЦикла;
КонецЦнкла;
Следует сделать несколько замечаний к приведенному тексту.
В полях выборки результата запроса получаются представления ссылочных полей «Склад» и «Номенклатура». Получение представлений необходимо для вывода их в табличный документ. В противном случае, если бы в табличный документ выводились не представления ссылочных полей, а сами ссылки, выполнялись бы неявные запросы к базе данных для получения представления ссылочных значений, что привело бы к замедлению вывода отчета.
После выполнения запроса в переменную «ТабДок» получается расположенный в форме элемент управления
ПолеТабличногоДокумента, в который и будет осуществляться вывод результата отчета.
Результат запроса обходится по группировкам, в нескольких вложенных циклах. Сначала выбирается группировка верхнего уровня, содержащая запись общих итогов. Затем в цикле обходится группировка «Склад», и для каждого значения выборки этой группировки также во вложенном цикле перебираются детальные записи результата запроса.
Как вывести данные в табличный документ с возможностью сворачивания и разворачивания данных по группировкам?
Вывод данных в табличный документ рассмотрен в примере «Как вывести результат запроса в табличный документ?» на странице 257. Рассмотрим особенность организации группировок (в нашем примере: группировок строк, хотя можно группировать и колонки).
// Перед выводом данных в табличный документ используеі ТабДок. ИачатьАвтогруппировкуСтрокО; |
ся метод: |
// Выести область с указанием уровня. |
|
ТабДок.Вывестн(ОбластьОбщийИтог. ВыборкаОбщнйИтог |
УровеньО); |
// В конце работы с табличным документом необходимо выі // следующий метод:
ТабДок.ЗакончитьАвтогруппировкуСтрокО: |
ЮЛНИТЬ |
Перед выводом данных в табличный документ используется метод табличного документа НачатьАвтогруппировкуСтрок(), который автоматически создает группировки в табличном документе в соответствии со значением уровня строк, задаваемым при их выводе вторым параметром метода Вывести().
Следует отметить, что для определения группировок не обязательно это делать через автогруппировку. Для группировки строк можно использовать методы табличного документа НачатьГруппуСтрок() и ЗакончитьГруппуСтрок() (аналогичные методы существуют и для группировки колонок табличного документа).
Как при выводе данных в табличный документ свернуть все выводимые группировки?
Необходимо при выводе данных в табличный документ в развернутом виде оставить только группировки нулевого и первого уровней, а группировки более низких уровней отобразить в свернутом состоянии:
УровеньГруппировки = 1; //содержит индекс, с нуля ТабДок.Закончить Автогру ш іировкуСтрок();
ТабДок. ПоказатьУровеньГруипиро во кСтрок(УровеньГрупиировки);
В переменной «УровеньГруппировки» определяется уровень, до которого необходимо раскрыть группировки в табличном документе.
Как при выводе данных в табличный документ произвольно определить состав свернутых и развернутых группировок?
При выводе данных по заранее известным правилам, необходимо отображать какие-либо группировки в свернутом состоянии, какие-то - в развернутом. Допускается, что свернутые и развернутые группировки могут находиться на одном уровне.
ТабДок.Вывсс і ЩОб.'іаеі ьНоменкаа тура.
ВыборкаПоНоменклатуре.УровеньО,
Ложь);
Установка четвертого параметра метода Выбратъ() в значение Ложь приведет к тому, что данная область будет отображаться в свернутом виде.
ф Как выгрузить результат запроса с показом иерархии?
В форме расположено табличное поле с именем ТП. Тип значения табличного поля - ДеревоЗначениЙ. Необходимо в табличном поле показать результат выполнения запроса с показом иерархии данных.
Для реализации этой задачи необходимо написать текст запроса, который в обязательном порядке должен содержать раздел ИТОГИ (именно этот раздел определяет иерархию). В процедуре, отвечающей за заполнение данными табличного поля необходимо разместить следующие строки:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
I ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура,
I ПродажиКомпанииОбороты.КолнчествоОборот КАК КолнчествоОборот |ИЗ
I РеінстрНакоиления.ПродажиКомпании.Обороты(&НачПернода. &КонПериода,, ) I КАК ПродажиКомпанииОбороты
ІИТОГІІ СУММА(КоличсствоОборот) ІЮ_
I Номенклатура ИЕРАРХИЯ";
Запрос.УстановитьПарамстрС’І ІачПериода", НачПериода); Запрос.УсгановитьПараметр<"КонГ1ериода”. КонПсриода);
Результат = Запрос. ВмполнитьО;
ЭлементыФормы.ТП.Значение = Результат
.Выгрузить(ОбходРезультатаЗапроса .ПоГ руппиронкам):
// Осуществить выгрузку с сохранением иерархии. ЭлсментыФормы.ТП.СоздатьКолонкиО:
Метод СоздатьКолонки() элемента управления ТабличноеПоле
удаляет ранее существовавшие колонки и создает новые в соответствии с новым источником данных.
® Где и как можно увидеть макет, автоматически генерируемый построителем отчета?
Поскольку тип значения свойства Макет построителя отчета -ТабличныйДокумент, то, как и всякий табличный документ, - его можно вывести на экран при помощи метода Показать():
ІіостроительОтчета. Макет = Неопределено: I ІостроитсльОтчета.Макеі НоказатЫ)
В данном примере имя построителя отчета было «ПостроительОтчета». Разумеется, данный код можно писать после того, как построитель отчета сформирован.
Первая строка кода - с присвоением свойству Макет значения Неопределено нужно только в тех случаях, когда мы точно хотим получить именно автоматически генерируемый построителем отчета макет. Дело в том, что до нашего кода построителю мог быть назначен другой макет, или он был изменен.
ф Как из построителя отчета передать данные в сводную таблицу?
В форме отчета есть табличный документ «ДокументРезультат», в его составе встроенная таблица «СводнаяТаблица». Необходимо обеспечить ее автоматическое заполнение по данным построителя отчета «ПостроительОтчетаОтчет».
После формирования построителя отчета можно сделать следующее:
ЭлементыФорчы
.ДокументРезультат
.ВстроенныеТаблицы
.СводнаяТаблица
.ИсточникДанных = ПостроительОтчетаОтчет:
ЭлементыФормы ¦ДокументРезультат ¦ ВстроенныеТаблицы ¦СводнаяТаблица ¦ОтображатьПоля = Истина;
Сначала указываем сам построитель отчета сводной таблице в качестве источника данных. Далее установкой свойства «ОтображатьПоля» вызываем на экран окно для интерактивного управления полями сводной таблицы.
Хочется подчеркнуть, что источником данных для сводной таблицы может быть не только построитель отчета, но и результат запроса.
Отчет формируется построителем отчета. Как убрать одну из колонок, поместив ее данные в расшифровку другой?
По документам «РегистрацияСобеседованияКандидата»:
РегмстрацияСобеседовамияКамаиаата 0 г Реквизиты
І.....- Ответственна
г — Контент арий
- ДатеСобеседоееимя
— - ВремяСобеседовения
— - ФизЛицо
— - Подразделение
— - Должность
[— - РезупьтатСобеседоваммя
- Помешение
— - РезюмеСобеседоваиия
Факт
—=-5і Т абли^ые чести
необходимо построить отчет по форме:
Кандидат |
Результат |
Абрамов Андрей Алексеевич |
Отклонен |
Аввакумов Алексей Аркадьевич |
Предложили работать |
Алексеев Вадим Юрьевич |
Отклонен |
Андреева Жанна Юрьевна |
Отложен |
Кандидаты должны располагаться в алфавитном порядке.
Причем при двойном клике по любому «результату» должен открываться сам документ, в котором данный результат был зафиксирован.
Данную задачу можно решить посредством следующей процедуры:
Процедура АлфавнтныйПереченьКандидатовСРасшифровкойО
ПостроительОгчета = Новый ПостроительОтчета:
ПостроительОтчета.Текст ="ВЫБРАТЬ
I РегисграцияС'обсседованияКандидата.ФнзЛиио КАК Кандидат.
I РегистрацняСобеесдованняКандидата.РезультатСобеседования КАК Результат.
I РегистрацияСобеседованияКандидата.Ссылка
|ИЗ
I Документ.РегиетрацияСобеседованияКандидата КАК РегнстрацияСобеседованияКандидата
ІУПОРЯДОЧИТЬ по
I РегистрацияСобеседованияКандндата.ФизЛицо. Наименование";
ПостронтсльОтчета.ВыполнитьО;
Макет = ПостроительОтчета.Макет:
// Очистить области, связанные с ссылкой.
ТекущаяОбласть = Неопределено;
Пока Истина Цикл
ТекущаяОбласть = Макет.НайтиТекст(”Ссылка”,
Т еку щаяОбласть.
Макет.ОбластьО);
Если ТекущаяОбласть = Неопределено Тогда Прервать;
Иначе
ТскущаяОбласть.ОчиститМ Истина. Истина, Истина);
КонецЕсли:
КонецЦнкла;
И Заполнить параметр расшифровки для областей, где параметр = "Результат". ТекущаяОбласть = Неопределено;
Пока Истина Цикл ТекущаяОбласть = Макет
.НайтиТекстІ "Результат". ТекущаяОбласть, Макет.ОбластьО);
Если ТекущаяОбласгь = Неопределено Тогда Прервать;
Иначе
Если ТекущаяОбласть.Параметр = "Результат" Тогда ТекущаяОбласть.ПараметрРасшифровки = "Ссылка";
КонецЕсли;
КонецЕсли;
КонецЦнкла;
ПостроительОтчета.Макет = Макет:
ПостроительОтчета. ВывестиО;
КонецПроцедуры_
Используем объект ПостроительОтчета. Текст запроса позволяет получить из таблицы документов
«РегастрацияСобеседованияКандидата» данные о кандидате, результате и ссылке на документ, в которой были зарегистрированы эти данные.
Далее построитель отчета выполняет указанный текст запроса.
Поскольку в выходной форме табличного документа колонок должно быть две - исправим макет построителя отчета.
Для этого считываем на переменную «Макет» макет, автоматический генерируемый построителем отчета.
Далее открываем цикл перебора областей ячеек макета, в которых присутствует текст «ссылка». Метод области ячеек табличного документа «Очистить()>> позволяет за счет своих параметров добиться очистки текста, формата и рамок области. Каждую найденную область - очищаем полностью.
Далее открываем цикл перебора областей ячеек табличного документа «Макет», где присутствует текст «Результат». Если в найденной области еще и параметр установлен, как «Результат» - значит именно в этой области нам нужно установить значение «ПараметрРасшифровки» как «Ссылка». Таким образом, мы обеспечим размещение содержимого полей «Ссылка» результата построителя отчета в расшифровки ячеек отображения полей «Результат» при формировании табличного документа по исправленному макету.
Остается только назначить построителю отчета исправленный макет и вывести построитель отчета.
Как сохранить настройки построителя отчета до следующего открытия формы отчета?
Допустим, необходимо сохранить настройки построителя отчета «П остроительОтчета».
Для этого нужно в обработчике события При закрытии формы вписать команду на сохранение значения настроек. Например, так:
СохранитьЗначение("НастройкаПостроителяДляОтчетаПродажи' + МстаданныеОИмя.
ПостроительО гнета. ПолучитьНастройкиО);
Первым параметром указано имя сохраняемого значения. Вторым -само сохраняемое значение. Поскольку метод сохраняет значение индивидуально для пары «ИнформационнаяБаза - Пользователь», то уникальность имени сохраняемого значения обеспечиваем за счет его формирования. Например, из имени отчета и имени формы.
При открытии данной же формы, для того, чтобы «вернуть» построителю отчета его настройки - можно будет сделать следующее:
// До установки настроек они ранее должны были быть таполнены И по тексту таироса.
ПостроительОтчета.ЗаполнитьНастройки():
И Установить настройки построителя отчета.
Настройка = ВосстановнтьЗначсниеС'НастройкаПостронтеляДляОтчетаПродажи"
+ МетаданныеО.Имя);
Если Настройка о Неопределено Тогда
ПостроительОтчета.УстановитьНастройки(Нас тройка):
КонецЕсли;
Восстанавливаем (сохраненное при окончании предыдущего сеанса работы с формой) значение настроек - по соответствующему имени значения.
Убедившись, что восстановить значение настроек действительно удалось - устанавливаем эти настройки для построителя отчета.
Как организовать показ примечаний в формируемом табличном документе?
По данным документов «Событие»:
~ Событие ? « Реквизиты
.....— АаресЗ лектроннойЛ очты
— - Важность
- ВиаОбъекта
— - ВииСобыгия
-- ВремяНапомм«ания
- Исто^икИнформецииПриОбрешеиии
- Комментарии
- Контактное Лицо .....- Контрагент
.....— Напот-емтьОСобьты
.....— НачалоСобытия
.....— ОкоичаниеСобытия
— - ОписатыеСобытия —— Основание
— - Ответответный —- Проект
— — СоцержаниеСобытия
— - СостоямиеСобытия —• Т ипСобытия
0 5:* Табличные части Й-liI СторокмиеЛмца
необходимо вывести информацию о зарегистрированных за период событиях по следующей форме:
ІОтветствеитІДата |
ВіиСобыпи |
Контрагент |
ОпткаимеСо4ытмя |
Федоров
(адмитыстр
втор) |
09102004
1647:00 |
Почтовое
гьсьмо |
Белявский-част мое лицо |
Просьба отослать ^
текст договора |
Федоров
гадмимістр
втор) |
03102004
165900 |
ТЪтчмая встреча |
Инвема |
Fw Установка
контактов с
контрагентом |
Федоров
(адкаеатстр |
28 09 2004 Г?чная встреча 121636 |
Алхимов АЛ |
Поговорить 0 '
продлении договора иа следующей год |
Федоров
(адьынистр
втор) |
28 09 2004 Телефотеа** 120002 звонок |
Свергуметжо |
Пет>вичт«)й звонок ' клиента |
Как видите, в колонке «ОписаниеСобытия» в некоторых ячейках установлены примечания, содержащие «СодержаниеСобытия»
Для формирования подобного табличного документа потребуется макет «Отчет» по следующей форме
Огысание |
|
|
^ = ОписаниеСобытия |
|
|
. |
2 1 3 1 4 1 S 1 « |
За го по в о* |
1 |
|
|
2 |
Состоявшиеся события (кратко) |
|
3 |
<Период с [ДатаНач] по [ДатаКон]> |
|
4 |
|
|
ШалкаТабп |
5 |
|
нтвекіпснныіІДла Віи' ооиііи | Контрагент ІОткаммеСооытмя |
Дета/ы |
< |
|
«Ответственны«Дата» «?идСобытмя» «Коитрагемт^кОг»«са»*іеСобытмя» |
ПодвапТаб |
7 |
|
|
Подвал |
8 |
|
|
|
О |
Обратите внимание, ячейка, содержащая «ОписаниеСобытия» -поименована («Описание»).
Сам же табличный документ будет формироваться следующей процедурой:
Процедура Отчет(ДатаНач, ДатаКон) Экспорт
Запрос = Новый Запрос;
// Сбор данных.
Запрос.Текст =
"ВЫБРАТЬ
I Событие.Ответственный КАК Ответственный,
I СобытиеДата.
I Событие.ВидСобытия.
I Событис.Контрагент,
I Событие.СодержаниеСобытия.
I Событие.ОписанисСобытня |ИЗ
I Документ.Событие КАК Событие |ГДЕ
I СобытиеДата МЕЖДУ &ДатаНач И &ДатаКон
I И
I (Событие.Проведен)
I И
I Событие.СостояниеСобытия = &Завершено
I
(УПОРЯДОЧИТЬ по I Ответственный";
Запрос.УстановитьПарамегрС'ДатаКон”, ДатаКон); Запрос.УстановитьПараметрСДатаНач", ДатаНач); Запрос.УстановитьПараметр( "Завершено".
Перечисления.СостоянияСобытий.Завершено)
Результат = Запрос.Выполнить():
// Сформировать табличный документ.
Макет = ПолучитьМакетСОтчет");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок”); ОбластьШапкаТаблнцы = Макет. ПолучитьОбластьСШаикзТаблицы”): ОбластьДетальныхЗаписсй = Макет.ПолучитьОбластьСДегали");
ТабДок = Новый ТабличныйДокумент;
ОбластьЗаголовок.І1араметры.ДатаНач = ДатаНач;
ОбластьЗаголовок. ІІарамстры.ДатаКон = ДатаКон;
ТабДок.Вывести(ОбластьЗа головок);
ТабДок. Вывести(ОбластьШапкаТаблицы);
ВыборкаДетали = Результат.Выбрать();
Пока ВыборкаДетали.СледующнйО Цикл ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали); ОбластьДетальныхЗаписей.Область("Описание'').Примечание.Текст =
ВыборкаДетаіи.СодержаниеСобытия ТабДок. Вывести(ОбластьДетальныхЗапнсей);
КонецЦикла;
ТабДок.ПоказатьО;
КонецПроцедуры
Выполняем запрос для получения всех необходимых данных по записям таблицы документа «Событие», которые удовлетворяют условиям отбора: документы проведены, их дата находится в интервале формирования отчета и значение реквизита «СостояниеСобытия» равно Завершено (тип значения
ПеречислениеСсылка.СостоянияСобытий).
Далее работа идет по выводу результата запроса в табличный документ.
Получаем макет. Из макета получаем необходимые для работы области.
Создаем табличный документ «ТабДок». Устанавливаем параметры области «Заголовок» и выводим ее в табличный документ «ТабДок».
Выводим область шапки таблицы.
Далее открываем цикл выборки из результата запроса.
Внутри цикла:
Заполняем параметры области детальных записей данными из одноименных полей строки выборки по результату запроса.
А в область «Описание» области детальных записей добавляем примечание. В качестве текста примечания указываем данные из поля «СодержаниеСобытия» выборки результата запроса.
Выводим очередную область детальных записей в «ТабДок».
По окончании цикла показываем сформированный табличный документ пользователю.
ф Как обеспечить, чтобы при вводе на печать не печатались первая колонка и первая строка табличногодокумента «ДокументРезультат»?
Для решения этой задачи лучше всего воспользоваться свойством табличного документа ОбластьПечати. После того, как табличный документ «ДокументРезультат» сформирован, пишем:
Доку мснтРезультат.Обласі ьі Іечати = ДокументРезультат
.Область(2,
2,
ДокументРезультат. ВысотаТаблицы, Документ Результат.ШирннаТаблицы
);
В качестве комментария: свойству ОбластьПечати необходимо передать область ячеек табличного документа, которую будем выводить на печать.
Для определения этой области указываем прямоугольную область, начинающуюся со 2-ой строки, 2-го столбца, и заканчивающуюся последней строкой табличного документа (ее номер определяем из свойства табличного документа ВысотаТаблицы) и последним столбцом (его номер определяем из свойства табличного документа
ШиринаТаблицы).
ф Как обеспечить фиксацию верхней части табличного документа, генерируемого построителем отчета, по срезу шапки таблицы?
Если макет автоматически генерируется построителем отчета можно воспользоваться тем, что в его составе есть область «ШапкаТаблицы» и следовать она будет сразу после области «Заголовок». Значит низ области «ШапкаТаблицы» как раз и будет границей желаемой области фиксации.
Например, построитель отчета называется «ПостроительОтчета», а табличный документ «ДокументРезультат».
Тогда после вывода построителя отчета в табличный документ можно сделать следующее:
ДокументРезультат.ФиксацияСверху = ПостроительОтчета
.Макет
.Области
.ШапкаТаблицы
.Низ;
То есть, устанавливаем значение свойства ФиксацияСверху табличного документа как номер нижней строки области «ШапкаТаблицы» макета табличного документа.
© Табличный документ формируется построителем отчета. Как при печати табличного документа обеспечить вывод шапки таблицы на каждой странице?
Если табличный документ строится по макету, сгенерированному построителем отчета, то в его составе будет область «ШапкаТаблицы».
Если табличный документ называется «ДокументРезультат», а построитель отчета - «ПостроительОтчета», после вывода построителя отчета в табличный документ можно сделать следующее:
ОбластьШапкн = ПостроительОтчета.Макет.Области. ШапкаТаблицы: ДокументРезультат.ПовторятьПриПечатиСтроки =
ДокументРезультат.Область(ОбластьШапки.Верх,. ОбластьШапки.Низ):
В свойство ПовторятъПриПечатиСтроки табличного документа достаточно передать любую область ячеек табличного документа, и она станет повторяться в каждом печатаемом листе.
В нашем случае данную область определили по координатам области «ШапкаТаблицы» автоматически генерируемого построителем отчета макета.
ф Как при выводе на печать «длинного» документа указать в колонтитулах страниц номер документа, дату и номер страницы?
Работа должна вестись со свойством ВерхниЙКолониіул табличного документа. Тип значения его объект
Колонтитул ТабличногоДокумента.
ТабДокумент.ВерхнийКолонтитул. Выводить = Истина; ТабДокумент.ВсрхнийКолонтитул.НачальнаяСтраница = 2; ТабДокумент.ВерхнийКолонтитул.ТекстСлева = Метаданные().Представление() +
" № ’ +
Номер;
ТабДокумент.ВерхнийКолонтитул.ТекстСтірава = "|&НомерСтраницы|";
Устанавливаем для нужного колонтитула признак вывода на печать. Далее указываем, что начинать вывод колонтитула следует не с первой страницы (по умолчанию), а со страницы № 2.
Передаем значения для заполнения свойств ТекстСлева и ТекстСправа. Обратите внимание, что типы значений этих свойств -Строка. В текст слева выводим представление и номер документа. В текст справа выводим номер текущей страницы.
ф Табличный документ формируется по макету, автоматически генерируемому построителем отчета. Как задать ориентацию страницы при печати?
Ориентация страницы в любом случае задается уже для самого табличного документа.
ПостроительОгчета.Вывести(ДокумеитРезультат);
ДокументРезультат.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт:
В данном примере свойству ОриентацияСтраницы табличного документа «ДокументРезультат» назначается значение Ландшафт системного перечисления ОриентацияСтраницы.
Табличный документ формируется построителем отчета. Как для всех выводимых числовых показателей установить вывод без дробной части?
Регистр «ПартииТоваровНаСкладах» имеет ресурсы
«Сумма» (точность: 2) и «Количество»(точность: 3). По регистру строится отчет посредством построителя отчета. Внешний вид табличного документа определяется настройками построителя отчета.
Необходимо обеспечить, чтобы все числовые показатели отчета выводились в формате целых чисел.
Для решения данной задачи лучше всего поработать с областями макета построителя отчета перед выводом построителя отчета в табличный документ.
Текст областей макета построителя отчета (названия параметров) будет определяться названиями выходных полей запроса.
Как правило, псевдонимы выходных полей запроса построителя отчета в своих именах упоминают имена ресурсов («Количество» или «Стоимость»). Обязательно проверьте - так ли это в Вашем случае. Для этого можно получить макет построителя отчета, как показано в примере «Где и как можно увидеть макет, автоматически генерируемый построителем отчета» на странице 262.
В результате можно утверждать, что в тексте областей макета построителя отчета, связанных с выводом информации по ресурсам, скорее всего, будут присутствовать упоминания названий этих ресурсов.
Значит, нам достаточно перебрать все области с текстом содержащим «Количество» или «Стоимость», и для каждой из них установить формат "ЧДЦ=0".
Находим в процедуре выведения построителя отчета на табличный документ сам момент выведения и перед ним дописываем:
// Получить макет построителя отчета.
Макет = ПостронтельОтчета.Макет;
// Сформатировать все области, где встречается слово «Стоимость» ТекущаяОбласть = Неопредслено;
Пока Истина Цикл
ТекущаяОбласть = Макет.НайтиТекстССтонмость”.
Текущая Область. Макет.ОбластьО);
Если ТекущаяОбласть = Неопределено Тогда Прервать;
Иначе
Если ТекушаяОбласть.Параметр о Тогда ТекущаяОбласть.Формат = "ЧДЦ=0";
КонецЕсли:
КонецЕсли;
КонецЦикла;
// Сформатировать все области, где встречается слово «Количество». ТскущаяОбласть = Неопределено;
Пока Истина Цикл
ТекущаяОбласть = Макет.НайтиТекстСКоличество”,
Текущая Область, Макет.Область());
Если ТекущаяОбласть = Неопределено Тогда Прервать;
Иначе
Если ТекущаяОбластъ.Параметр о Тогда ТскущаяОбласть.Формат = "ЧДЦ=0";
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Назначить построителю измененный максг. ПостроительОтчета.Макет = Макет;
// Вывести результат работы построителя отчета в табличный документ
Сначала в переменную «Макет» получаем макет построителя отчета. Промежуточной переменной «ТекущаяОбласть» назначаем значение Неопределено.
Открываем цикл, который будет выполняться до точки прерывания. Внутри цикла находим очередную область табличного документа, в тексте которой упоминается слово «Стоимость». На первом витке цикла
это будет первая область от начала макета, на каждом очередном -следующая.
Если не удалось найти такую очередную область (то есть ее значение Неопрбделено) - прерываем цикл.
Если же удалось, проверяем, есть ли у данной области параметр. Если есть - меняем формат выводимых в этой области числовых данных. Форматная строка «ЧДЦ» определяет количество разрядов после запятой. В нашем случае - ноль. При этом сами данные будут при выводе округляться в соответствии с правилами округления, заданными для конфигурации.
Далее аналогичные действия выполняются для слова «Количество».
После всех циклов измененный макет отдаем в качестве значения макету построителя отчета.
Еще раз хочется подчеркнуть, что решение основано на известности названий выходных полей запроса построителя отчета. Необходимо искать области, текст которых содержит эти названия.
ф Как для построителя отчета совместить назначение своего макета и применение одного из стандартных макетов оформления?
ПоегроительОгчега.МакеЮформления =
ПолучитьМакетОформления(СтандартноеОформление. Апельсин): ПостроительОтчета.Макет = ПолучитьМакет(«МакегЭтогоОгчета»): Постронтель0гчета.ОформитьМакет();
Назначаем макет оформления построителя отчета, выбирая его из стандартных.
Устанавливаем макету построителя отчета значение макета, созданного вручную и хранимого в составе макетов этого отчета.
Для применения стандартного макета оформления к назначенному макету - перед выводом табличного документа необходимо использовать метод ОформитьМакет().
Замечание: «свой» макет должен иметь области со стандартными именами, иначе построитель не будет знать, что оформлять.
Как при получении данных из запроса обойти только итоговые записи?
При обходе результата запроса не хотим обходить детальные записи.
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента:
ТабДок.Очистнть():
Макет = ПолучитьМакет(”Отчет”);
Запрос = Новый Запрос;
Запрос.Текст ~
"ВЫБРАТЬ
I ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура,
I ПродажиКомпанннОбороты.Номенклатура.Представлеиие,
I ПродажиКомпанииОбороты.КолнчествоОборот КАК КоличествоОборот,
Содержание раздела