Как найти параметры отчета на скд

 +9 

   

Распечатать

Как программно Установить значения Параметров для отчета СКД?

Например у отчет есть следующие параметры:
title

Программно их задать можно следующим образом:

Код 1C v 8.х

 //Последовательно, начиная с 0 задаем значения параметров: ( НачПериода это 0 элемент, КонПериода - 1, ВыбНалог =2 )
КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[0].Значение = НачПериода;
КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[1].Значение = КонПериода;
КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы[2].Значение = ВыбНалог;

Есть параметр, предопределенное при открытии отчета каждый раз. Как его правильно указать в СКД?
Можно делать так:

Код 1C v 8.х

 Процедура ПриОткрытии()
//........................
ПараметрДанных= КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Товар");
ПараметрДанных.Значение = Справочники.Номенклатура.НайтиПоНаименованию("Гвозди");
ПараметрДанных.Использование=Истина;
//...........................................
КонецПроцедуры

или

Код 1C v 8.х

 //Пропишем ТОЧКИ МАРШРУТА
СписТочек = Новый СписокЗначений;
СписТочек.Добавить(БизнесПроцессы.м_Документооборот.ТочкиМаршрута.ОПФПД);
СписТочек.Добавить(БизнесПроцессы.м_Документооборот.ТочкиМаршрута.ОСФПД);

ПараметрСКД = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ТочкаМаршрута");
ПараметрСКД.Значение = СписТочек;
ПараметрСКД.Использование = ИСТИНА;

Для УП

Код 1C v 8.2 УП

 &НаСервере 
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

УстановитьПривилегированныйРежим(Истина);

СтандартнаяОбработка = Ложь; // если не отключить стандартную обработку, то настройки затрутся

ДатаОтчета = ТекушаяДата();
3начениеПараметра = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Найти3начениеПараметра(Новый ПараметрКомпоновкиДанных("ДатаНач"));
Если НЕ ЗначениеПараметра = Неопределено Тогда
ЗначениеПараметра.Использование = Истина;
ЗначениеПараметра.Значение = КонецДня(ДатаОтчета) - (7 * 86400);
КонецЕсли;

3начениеПараметра = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Найти3начениеПараметра(Новый ПараметрКомпоновкиДанных("Свойство1"));
Если НЕ ЗначениеПараметра = Неопределено Тогда
ЗначениеПараметра.Использование = Истина;
3начениеПараметра = Справочники.3наченияСвойствОбъектов.НайтиПоКоду("000000004");
КонецЕсли;
КонецПроцедуры

Содержание:

1.       Работа с отчетом в системе компоновки данных

2.       Поля параметров отчета СКД   

1.     Работа с отчетом в системе компоновки данных

При создании отчетов в системе компоновки данных данные запроса могут быть изменены или уточнены при помощи параметров отчетов в СКД.

Работают параметры СКД с запросом и его логикой, периодом получения данных, могут явно определять значение того или иного реквизита.

В СКД параметры определяются на одноименной закладке.   

2.     Поля параметров отчета СКД

В поле «Имя» указываем идентификатор параметра, при помощи имени платформа будет находить параметр.

Поле «Заголовок» определяет представление параметра для пользователя, в заголовке доступно использование пробелов.

«Тип» – тип данных, может быть составным.

В «Доступных значениях» Вы можете ограничить список значений параметра СКД.

Поле «Значение» — позволяет задать значение параметра СКД, либо список значений, что определяется флагом «Доступен список значений».

Поле «Выражение» позволяет установить параметр СКД программно, например :

Задать значение параметра СКД программно

Параметр «НачалоМесяца» будет автоматически выдавать первый день месяца от даты в параметре СКД «ДатаОтчета».

Параметр СКД«Период Отчета» — стандартный период в СКД, данные в который передают соответвенно «НачалоПериода» и «КонецПериода».

В поле «Параметр функциональных опций» Вы можете выбрать из Параметров функциональных опций конфигурации и установить параметр СКД.

Параметр функциональных опций — установить параметр СКД

Стереть ошибочно заполненное поле значения параметра СКД можно, если выделить текст двойным кликом, затем по правой кнопке мыши получите команду «Очистить».

 

Очистка параметров СКД в отчете

Поле Ограничение доступности регулирует доступность параметра СКД в таблице на вкладке «Параметры» в настройках отчета. Тут хочу сказать о том, что параметры в Схеме компоновки данных и Параметры в настройках, это разные объекты и вместе с ограничением доступности, установка флага сопровождается переносом значения параметра схемы компоновки данных в значение параметра СКД данных настроек. То есть если ограничение доступности установлено, то система ищет значение параметра СКД в схеме компоновки данных, если снято, то будет требовать его от пользователя. 

Есть еще один случай, когда система будет брать значение параметра в настройках при установленном ограничении доступности, это Установка признака «Использование» в положение «Всегда» и отметка «Запрещать незаполненные значения». В этом случае мы как бы вручную заставляем систему искать значение параметра СКД в настройках. Галка «Запрещать незаполненные» проверяет заполненность значения параметра данных настроек. На параметр схемы СКД не влияет. Если признак «Использование» в положении «Всегда» — то значение параметра всегда берется из значения параметра данных.


Значение параметров СКД

Обратите внимание, среди доступных параметров отчета СКД только те, в которых отжата галка ограничения.


Доступные параметры отчета СКД

Однако, если перейти в выбранные поля, то параметр «НачалоМесяца» среди них тоже есть, хотя его доступность мы ограничили.

Выбранные поля с параметрами отчета СКД

Чтобы убрать его и с этой закладки, нужно отжать галку «Включать в доступные поля» в настройках параметров.


настройка параметров отчета СКД

Поле «Параметры редактирования» открывает доступ к настройке формата, маски и интерфейсных свойств параметров. Например, можно ограничить вывод только элементов при помощи настройки «Вывод групп и элементов», или настроить быстрый выбор списка параметров при помощи одноименной настройки.


Список параметров отчета СКД

Специалист компании «Кодерлайн»

Дмитрий Доронов

В данной статье мы рассмотрим практически все возможности и множество нюансов, которые относятся к параметрам в Системе Компоновки Данных 1С (в сокращении — СКД). Параметры в запросе СКД, фигурные скобочки в запросе СКД — оно же Расширение языка запросов для СКД, особенности настройки страницы “Параметры” СКД, вывод параметров на форму, программная установка параметров, мягкие и жесткие параметры.

Contents

  • 1 Параметры в запросе 1С СКД.
  • 2 Расширение языка запросов для СКД.
    • 2.1 Выбрать.
    • 2.2 Где.
    • 2.3 Параметры виртуальных таблиц.
  • 3 Особенности настройки страницы “Параметры” СКД.
  • 4 Страница “Параметры” блока “Настройки” страницы “Настройки”.
  • 5 Параметры СКД на форме.
  • 6 Резюме.

Параметры могут использоваться практически в любом месте запроса и выполнять самые различные функции.

Параметры обозначаются знаком & после которого следует имя параметра.

Пример &МойПараметр.

Параметр может быть полем запроса, частью произвольного выражения поля запроса, условием для виртуальной таблицы, частью выражения в отборе запроса и так далее:

Пример:

ВЫБРАТЬ
  &МойПараметр Как Параметр,
  Машины.Ссылка КАК Ссылка,
  ВЫБОР
    КОГДА Машины.ДатаОсаго < &ТекДата
    ТОГДА "У машины нет действующего полиса ОСАГО!"
  ИНАЧЕ ""
    КОНЕЦ КАК Предупреждение
ИЗ
  Справочник.Машины КАК Машины
Где
  Машины.ПометкаУдаления = &ПометкаУдаления

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

Таким образом этот блок настраивается в конструкторе.

Если значение параметра не задано, то построение СКД будет невозможно и будет выдана ошибка, поэтому такие параметры называют “обязательными” или “жесткими”.

Расширение языка запросов для СКД.

Выбрать.

Этот блок располагается в запросе типа выборка данных пакета запросов СКД в первом запросе объединения между перечнем полей и “ИЗ” и заключается в фигурные скобки.

ВЫБРАТЬ
  Машины.Ссылка КАК Ссылка,
  Машины.ВерсияДанных КАК ВерсияДанных,
  Машины.ПометкаУдаления КАК ПометкаУдаления,
  Машины.Код КАК Код,
  Машины.Наименование КАК Наименование,
  Машины.Марка КАК Марка,
  Машины.ГосНомер КАК ГосНомер,
  Машины.ДатаОсаго КАК ДатаОсаго,
  Машины.Предопределенный КАК Предопределенный,
  Машины.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
{ВЫБРАТЬ
  Ссылка КАК Машина,
  Наименование,
  ДатаОсаго,
  Марка.*}
ИЗ
Справочник.Машины КАК Машины

В этом блоке мы перечисляем поля, которые пользователь может выбирать для вывода, группировки и упорядочивания. Конструкция «.*» в параметре “Марка.*” позволяет выбирать для вывода, группировки и упорядочивания дочерние поля значения, например, Марка.Код. Слово “КАК” позволяет задать псевдоним, например, “Ссылка КАК Машина”. Поля в этом блоке попадают в перечень полей набора, даже если отключено автозаполнение. Если автозаполнение включено, то упомянутые поля попадают в соответствии с тем, как они настроены расширением кода, то есть если ссылочное поле без конструкции “.*” дочерние поля доступны не будут, если указан псевдоним — именно он попадет в перечень полей набора.

Таким образом этот блок настраивается в конструкторе.

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

Где.

Отбор, установленный в пользовательских настройках, будет действовать не только на основной запрос, но и на все запросы в пакете. Но это не всегда соответствует логике отчета, к примеру, если помимо отобранной номенклатуры и сумм по ней нужно выводить общую сумму продаж для сравнения. В таких случаях нам нужны специфические отборы в каждом запросе пакета.

ВЫБРАТЬ
  Машины.Ссылка КАК Ссылка,
  Машины.ВерсияДанных КАК ВерсияДанных,
  Машины.ПометкаУдаления КАК ПометкаУдаления,
  Машины.Код КАК Код,
  Машины.Наименование КАК Наименование,
  Машины.Марка КАК Марка,
  Машины.ГосНомер КАК ГосНомер,
  Машины.ДатаОсаго КАК ДатаОсаго,
  Машины.Предопределенный КАК Предопределенный,
  Машины.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
{ВЫБРАТЬ
  Ссылка КАК Машина,
  Наименование,
  ДатаОсаго,
  Марка.*}
ИЗ
  Справочник.Машины КАК Машины
ГДЕ
  Машины.ПометкаУдаления = &ПометкаУдаления
{ГДЕ
  Машины.Марка.* КАК МаркаМашины,
  Машины.Наименование,
  Машины.ГосНомер,
  Машины.Предопределенный = &ТолькоПредопределенные}

Блок расширения “ГДЕ” может быть расположен после или вместо обычного блока “ГДЕ” в любом запросе, подзапросе, запросах объединения и заключается в фигурные скобки. Для присвоения отбору псевдонима используется конструкция “КАК”. Псевдоним нужно использовать чтобы отбор производился конструкцией расширения языка запросов, но не происходил автоматически по наименованию поля.

Если автозаполнение полей набора отключено, поля из этого блока попадают в перечень полей набора доступными только для отбора, использование дочерних полей зависит от наличия конструкции “.*”.

Если автозаполнение включено, и это поле включено в блок расширения “ВЫБРАТЬ” тогда настройки обоих блоков объединяются. Если не включено в “ВЫБРАТЬ” то поля попадают доступными для вывода, группировки, отбора и упорядочивания.

В случае если нужно дополнительно установить какое то ограничение полю, то можно вручную установить галочку в соответствующее поле перечня полей набора данных СКД.

Параметры в блоке «ГДЕ» не обязательны для заполнения, поэтому эти параметры называют “необязательными” или “мягкими”.

Также в блоке “ГДЕ” вместо параметра может быть произвольное выражение с использованием конструкции ВЫБОР или параметров со страницы “Параметры” СКД. Правда в последнем случае вид сравнения необходимо указывать конкретно.

Нужно с осторожностью использовать вид сравнения МЕЖДУ поскольку:

ВЫБРАТЬ
  РеализацияТоваровУслуг.Ссылка КАК Ссылка
{ВЫБРАТЬ
  Ссылка.*}
ИЗ
  Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
{ГДЕ
  (РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода)}

Если параметры НачалоПериода и КонецПериода не будут заданы, то система получит документы за весь период.

Если параметры НачалоПериода и КонецПериода будут заданы, то система получит документы за указанный период.

Если какой-то один из параметров не будет задан, то система выдаст ошибку.

Один из вариантов решения это разбить МЕЖДУ на два условия чтобы система не выдавала ошибку в случае одного незаполненного параметра.

ВЫБРАТЬ
  РеализацияТоваровУслуг.Ссылка КАК Ссылка
{ВЫБРАТЬ
  Ссылка.*}
ИЗ
  Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
{ГДЕ
  (РеализацияТоваровУслуг.Дата >= &НачалоПериода),
  (РеализацияТоваровУслуг.Дата <= &КонецПериода)}

Это же замечание относится к любым выражением с использованием нескольких параметров.

Параметры виртуальных таблиц.

ВЫБРАТЬ
  ВзаиморасчетыССотрудникамиОбороты.Сотрудник,
  ВзаиморасчетыССотрудникамиОбороты.Подразделение,
  ВзаиморасчетыССотрудникамиОбороты.СуммаВзаиморасчетовПриход,
  ВзаиморасчетыССотрудникамиОбороты.СуммаВзаиморасчетовРасход
ИЗ
  РегистрНакопления.ВзаиморасчетыССотрудниками.Обороты(
  {&ДатаНачала},
  {&ДатаОкончания},
  ,
  {Сотрудник.*,
  Подразделение.* КАК ПодразделениеОтбор})
    КАК ВзаиморасчетыССотрудникамиОбороты

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

Поведение параметров из поля “Условие” при снятии или установке галочки “Автозаполнение” также аналогично блоку «ГДЕ».

Параметры из полей периода попадают на страницу “Параметры” СКД. Если автозаполнение включено и в поле периода параметр не вписан, параметры с именем поля периода будут автоматически созданы на странице “Параметры” СКД.

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

В параметрах виртуальных таблиц возможно совместное использование “жестких” параметров запросов и “мягких” параметров компоновки данных.

РегистрНакопления.ВзаиморасчетыССотрудниками.Обороты(&Начало {&НачалоПериода})

В этом примере если в настройках установлено значение параметра &НачалоПериода, то будет использоваться его значение. В противном случае в качестве значения параметра виртуальной таблицы будет использоваться значение “жесткого” параметра “&Начало”.

Если автозаполнение включено и в поля периода не вписаны “мягкие” параметры компоновки данных то параметры с именем поля периода будут автоматически созданы на странице “Параметры” СКД и текст запроса:

РегистрНакопления.ВзаиморасчетыССотрудниками.Обороты(&ДатаНачала)

будет соответствовать следующему:

РегистрНакопления.ВзаиморасчетыССотрудниками.Обороты(&ДатаНачала {&НачалоПериода}, {&КонецПериода})

В этом случае “мягкие” параметры также будут иметь приоритет над “жесткими”.

Особенности настройки страницы “Параметры” СКД.

Обзорный вид страницы.

На эту страницу автоматически добавляются все параметры из запроса. Можно добавлять свой параметр в для использования его в вычисляемых полях например.

Строка параметра имеет следующие реквизиты:

Имя — это имя параметра, с помощью которого к его значению можно обращаться в тексте запроса, в вычисляемых полях и других местах где доступны выражения.

Заголовок — название, выводимое пользователю.

Тип — определяет тип параметра. Иногда при выборе дат периода, пользователю не нужно указывать время. Тогда нажав на “…” можно указать состав даты — Дата.

Таким же образом можно указать формат числа для численного параметра и длину строки для строкового.

А для того чтобы введенные значения интерпретировались в отчете как начало и конец дня следует в запросе использовать функции НачалоПериода() и КонецПериода().

ВЫБРАТЬ
  ПродажиОбороты.Контрагент,
  ПродажиОбороты.Номенклатура,
  ПродажиОбороты.КоличествоОборот,
  ПродажиОбороты.СуммаОборот
ИЗ
  РегистрНакопления.Продажи.Обороты(
  НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ),
  КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ), , ) КАК ПродажиОбороты

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

Доступен список значений — определяет доступность параметру принимать значение “список значения”.

Значение — предустановленное значение параметра. Типа параметра. Для ссылочного типа доступны для выбора только предопределенные данные.

Выражение — выражение, значение которого примет параметр. Что примечательно здесь могут использоваться как функции встроенного языка запросов, так и функции встроенного языка программирования и даже функции из общих модулей. К примеру, параметру ТекДата присваивается значение функции встроенного языка программирования ТекущаяДата().

Также в примере к реквизиту “Тип” можно было в выражениях использовать функции встроенного языка запросов, особенность применения этих функций в данном месте такова, что строковые параметры функций надо брать в кавычки.

НачалоПериода(&НачалоПериода,"День")

КонецПериода(&КонецПериода,"День")

и в запросе можно было бы писать проще поскольку в параметрах уже будет содержаться начало и конец периода:

ВЫБРАТЬ
  ПродажиОбороты.Контрагент,
  ПродажиОбороты.Номенклатура,
  ПродажиОбороты.КоличествоОборот,
  ПродажиОбороты.СуммаОборот
ИЗ
  РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПродажиОбороты

Иногда, для повышения удобства пользователю для выбора периода лучше дать не два поля с типом Дата, а одно поле с типом Стандартный Период. Тогда, к примеру, создаем три параметра: “Период” с типом СтандартныйПериод, “ПериодНачало” и “ПериодОкончание” с типом Дата. Первый параметр без ограничения доступности. Вторые с ним. В выражение “ПериодНачало” пишем “&Период.ДатаНачала”, в “ПериодОкончания” — “&Период.ДатаОкончания”.

Даты начала и конца стандартного периода также содержат и время. ДатаНачала имеет время 00:00:00, а ДатаОкончания 23:59:59. Получится что пользователь выберет стандартный период в “Период” а разработчик будет использовать корректные “ПериодНачало” и “ПериодОкончание”.

Параметр функциональной опции — используется в механизме функциональных опций.

Включать в доступные поля — включает параметр в доступные поля для выбора в настройках.

Ограничение доступности — ограничивает возможность изменения значения параметра пользователем.

Запрещать незаполненные значения — если установлено и значение параметра не заполнено — отчет не сформируется и выдаст ошибку.

Использование — устанавливает использование параметра. Если установлено Авто и параметр используется в запросе или выражениях, а пользователь перед формированием не установит галочку около параметра — отчет при формировании выдаст ошибку. Пользователь может установить эту галочку непосредственно, или она установится автоматически при изменении значения параметра. Если установлено Всегда, то этой проверки на то, что пользователь заполнил этот параметр — не будет.

Параметры редактирования — содержит настройки редактирования как у поля формы.

Страница “Параметры” блока “Настройки” страницы “Настройки”.

В настройках варианта мы можем установить галочку “Отображать недоступные параметры”, это можно использовать если для разных вариантов мы хотим использовать разный набор параметров.

У параметров в табличной части мы можем установить значение по умолчанию для варианта, включить использование по умолчанию установив галочку слева. Нажав на кнопку, расположенную справа внизу, мы открываем окно пользовательских настроек параметра.

В пользовательских настройках мы можем включить параметр в пользовательские настройки. Установим режим редактирования обычный. Тогда он будет доступен в форме, вызываемой кнопкой “Настройки…”.

Если Режим редактирования установить Быстрый доступ, то параметр появится на форме.

Если у параметра “Период” представление заполнить строкой “ПеРиОд”, то вместо название будет показано содержания поля представление.

Параметры СКД на форме.

Если у отчета СКД нет формы, то платформа создаст автоматическую, на которой будут табличный документ результата, кнопки управления и быстрые пользовательские настройки.

Можно создать свою форму для отчета и вывести на нее табличное поле со всеми пользовательскими настройками. Вот так:

Для этого в созданной форме в конфигураторе вытаскиваем на форму Пользовательские настройки из Компоновщика отчета.

В некоторых случаях параметр не прост, и для его расчета нужен некий алгоритм с циклом или ветвлениями. К примеру если отчет формируем в понедельник то в отчете сравниваются продажи по дням позапрошлой и прошлой недели, а в остальные дни недели сравниваются продажи по дням прошлой и текущей недели. Получается у нас от значения дня недели текущего дня зависит сразу четыре параметра: &НачалоПрошлойНедели, &КонецПрошлойНедели, &НачалоТекущейНедели и &КонецТекущейНедели. А еще нам надо дать возможность пользователю формировать отчет как будто он сформирован вчера или неделю назад. В таком случае мы создаем реквизит формы ТекДата типа Дата. Выводим его на форму. В событии ПриИзменении() пишем.

Если ДеньНедели(ТекДата) = 1 Тогда
  Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(“НачалоПрошлойНедели”,НачалоНедели(ТекДата - 86400 * 7 * 2));
  Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(“КонецПрошлойНедели”,КонецНедели(ТекДата - 86400 * 7 * 2));
  Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(“НачалоТекущейНедели”,НачалоНедели(ТекДата - 86400 * 7));
  Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(“КонецТекущейНедели”,КонецНедели(ТекДата - 86400 * 7 ));
Иначе
  Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(“НачалоПрошлойНедели”,НачалоНедели(ТекДата - 86400 * 7));
  Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(“КонецПрошлойНедели”,КонецНедели(ТекДата - 86400 * 7 ));
  Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(“НачалоТекущейНедели”,НачалоНедели(ТекДата));
  Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(“КонецТекущейНедели”,КонецНедели(ТекДата));
КонецЕсли;

Таким образом можно программно менять параметры из формы.

Резюме.

Параметры это ключевой инструмент для управления отчетом. Использование параметров дает возможность решить множество прикладных задач, таких как калькуляция на основе информации в базе и значений введенных интерактивно для конкретной калькуляции и многих других. В данной статье рассмотрены практически все относящиеся к параметрам механизмы и особенности. Рамках статьи не рассмотрен блок “Характеристики” Расширения языка запросов для СКД поскольку он не касается параметров. Не рассмотрена настройка параметра “Параметр функциональной опции” поскольку ее описание лучше включить в статью по функциональным опциям.

В данном топике я хотел бы затронуть, некоторые моменты работы с СКД: работа с формой отчета, использование нескольких схем компоновки данных, работа с параметрами и так по мелочи, что накопилось за время использования СКД.
continue

Как использовать параметры в СКД?

При написании отчета для СКД иногда возникает потребность в использовании параметров, какие есть варианты? Для начала надо определиться что для того что бы параметры стали доступными, необходимо поставить галочку в схеме вот здесь:
Доступность параметра

  1. Тыкнуть по кнопочке настройки, и задать настройки на стандартной форме. Мы этот вариант даже рассматривать не будем, по той простой причине, что их видно на стандартной форме невооруженным глазом, достаточно тыкнуть на кнопку… Настройки конечно же.
  2. Сделать таблицу на форме и указать у нее источник.
  3. Добавить на форму отчета поля ввода и прописать изменение параметров СКД при их изменении

Рассмотрим все варианты по подробнее.

2. Вывод всех прописанных настроек в одной таблице

Это делается очень просто, добавляется таблица значений на форму а источником данных нужно указать: ОтчетОбъект -> КомпоновщикНастроек -> Настройки -> Параметры данных.

3. Вынесение параметров отчета на форму, как правило самый нужный и удобный метод установки параметров.

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

Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
Параметр = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПараметрУказанныйВЗапросе")); Если Параметр <> Неопределено Тогда Параметр.Значение = ЗначениеКотороеМыХотимУстановить; Параметр.Использование = Истина; КонецЕсли;

Готово! Теперь при изменении элемента на форме параметр будет автоматически загружаться в СКД.

Использование нескольких схем

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

Процедура СменитьСхему()
    СхемаКомпоновкиДанных = ПолучитьМакет("ЗдесьНадоУказатьИмяСхемы");
    Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
    КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
КонецПроцедуры

Как видите, все просто, при желании можно сократить до двух строк или даже одной, но не уверен, что это пойдет на пользу читаемости кода. Но тут есть свой нюанс, при загрузке новых настроек старые параметры сотрутся, что на самом деле логично, но нас такое положение дел совершенно не устраивает. Какой из этого есть выход? Я думаю надо перед сменой компоновки параметры, надо сохранить в какой то буфер, а потом их восстановить. Как получитьзаписать параметр я уже говорил выше и не буду на это останавливаться. Так как параметров как правило больше чем два, особенно если это сложный отчет, то неправильно будет, писать

Параметр1 = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПараметрИзЗапроса"));
СохраненноеЗначение1 = Параметр1.Значение;
Параметр2 = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПараметрИзЗапроса2")); СохраненноеЗначение2 = Параметр2.Значение;
//смена схемы компоновки Параметр1 = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПараметрИзЗапроса")); Параметр1.Значение = СохраненноеЗначение1; Параметр1.Использование = Истина;
Параметр2 = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПараметрИзЗапроса2")); Параметр2.Значение = СохраненноеЗначение2; Параметр2.Использование = Истина;
//и тд

Я надеюсь, что вы понимаете, что этот код написан для примера и не стоит использовать перемнные с именами «СохраненноеЗначение1″,»СохраненноеЗначение2», но даже если не понимаете, все равно не используйте.
Хочется оптимизировать вышеприведенный код, что бы просто указать: СохраниСписокПараметров("ЗдесьСписокПараметров"); потом сменить схему и сделать ВосстановиСписокПараметров("ЗдесьСписокПараметров"); Написанием этих процедур мы и займемся, для этого далее я напишу эти две процедуры, одна будет сохранять параметры в спецально для этого отведнную структуру, другая будет из нее восстанавливать параметры. Вот они обе:

Функция СохранитьПараметры(ИменаПараметров)
    Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
    МассивСИменами = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ИменаПараметров,",");
СтруктураДляПараметров = Новый Структура;
Для Каждого ИмяПараметра Из МассивСИменами Цикл Параметр = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ИмяПараметра)); Если Параметр <> Неопределено Тогда СтруктураДляПараметров.Вставить(ИмяПараметра, Параметр.Значение); КонецЕсли; КонецЦикла;
Возврат СтруктураДляПараметров;
КонецФункции
Процедура ЗагрузитьПараметры(СтруктураСПараметрами) Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
Для Каждого ТекущийПараметр Из СтруктураСПараметрами Цикл Параметр = Параметры.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(ТекущийПараметр.Ключ)); Если Параметр <> Неопределено Тогда Параметр.Значение = ТекущийПараметр.Значение; Параметр.Использование = Истина; КонецЕсли; КонецЦикла; КонецПроцедуры

Остановлюсь, что бы более подробно объяснить, что происходит. Функция СохранитьПараметры принимает на входе строку с именами тех параметров которые надо сохранить. Затем она находит по имени нужный параметр и сохраняет в структуру, которую возвращает по окончании перебора всех параметров полученых из строки. То же самое, только наоборот делает процедура загрузить, она принимает структуру и загружает из нее в СКД параметры. Далее надо собрать все вместе, выглядеть это будет примерно так:

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

Вывод СКД в отчет

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

КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.Настройки,ДанныеРасшифровки);
ПроцессорКомпоновкиДанных=Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,,ДанныеРасшифровки,Истина);
ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

Если вы не понимаете, что вообще происходит, просто сделайте кнопку на форме, и засуньте в обработчик этот код, сразу станет понятно, что все просто и что в целом то даже процессом вывода можно управлять, например перед формированием отчета, можно установить заголовок, в зависимости от установленных параметров или свернуть группировки после формирования, или время там формирования засечь, всякое бывает. Также можно вывести разом, а можно построчно, посмотреть детали можно в синтаксис помощнике по адресу Общие объекты -> Система компоновки данных -> Работа с механизмом -> ПроцессорВыводаРезультатаКомпоновкиДанных

Установка в качестве параметра списка значений.

Когда нужно использовать список значений, для параметра необходимо установить галочку «Доступен список значений» иначе, даже если на входе будет список, СКД все равно будет брать только первое значение, галочка вот здесь:
Параметр в списке
С этой галочкой в штатном списке параметров СКД, вы бонусом получаете красивый и удобный список для подбора ваших значений.

Вывод СКД в таблицу.

Бывает нужен, если нужно проанализировать или что то сделать с результатами работы, что бы получить результат работы СКД в таблицу значений или в дерево значений, вам поможет следующий код:

КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновкиДанных=Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
ТЗДляВывода = Новый ТаблицаЗначений;//здесь может быть и дерево значений
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТЗДляВывода);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

собственно здесь в ТЗДляВывода мы получаем результат формирования отчета. Собственно если не касаться непосредствнно самого СКД, то здесь описаны практически все моменты работы с формой отчета построенного на СКД.

Бонусы

Тому кто домучал до конца эту длинную повесть, пригодятся бонусы:
Курс от гилева про СКД, что бы не искать информацию про СКД, можно скачать бесплатный курс по СКД
Можно взять шаблон, в котором есть все нужные для оформления фичи

В данном материале приведены примеры и кейсы программного формирования отчетов с использованием системы компоновки данных. Статья в большей степени практическая, с конкретными рецептами кода для той или иной задачи.

Пример программного формирования отчета на СКД

&НаСервере
Процедура СформироватьНаСервере(ТабДок)
	
	ОбъектОтчетНаСервере = РеквизитФормыВЗначение("Отчет");
	// Здесь стоит обратить внимание, что мы можем работать с любым макетом,
	// не обязательно с основной схемой компоновки данных
	СхемаСКД = ОбъектОтчетНаСервере.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	КомпоновщикНастроекДанныхОтчета = Новый КомпоновщикНастроекКомпоновкиДанных;
	КомпоновщикНастроекДанныхОтчета.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаСКД));
	КомпоновщикНастроекДанныхОтчета.ЗагрузитьНастройки(СхемаСКД.НастройкиПоУмолчанию);
	
	// В том случае, если нам нужно учитывать настройки, выполненные пользователем, их необходимо загрузить
	КомпоновщикНастроекДанныхОтчета.ЗагрузитьПользовательскиеНастройки(Отчет.КомпоновщикНастроек.ПользовательскиеНастройки);
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	Макет = КомпоновщикМакета.Выполнить(СхемаСКД, КомпоновщикНастроекДанныхОтчета.ПолучитьНастройки());
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(Макет);
	
	// Выведем полученные данные в табличный документ
	ТабДок.Очистить();
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ТабДок);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
КонецПроцедуры

&НаКлиенте
Процедура СформироватьОтчетПрограммно(Команда)
	// Для того, чтобы сделать код универсальнее, явным образом передадим табличный документ, куда будет выведен отчет.
	СформироватьНаСервере(Результат);	
	Элементы.Результат.ОтображениеСостояния.Видимость = Ложь;	
	Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
КонецПроцедуры

Программная установка параметров и отборов в СКД

Для того чтобы программно установить параметр или отбор в отчете СКД, дополним рассмотренный выше пример.
Важно! Чтобы без дополнительного кода применять программно заданные настройки, соответствующие элементы (конкретные параметры, или строки отбора) необходимо исключить из пользовательских настроек! В противном случае, приоритет будут иметь пользовательские настройки. 

// Использование текущих настроек компоновщика вместо настроек по умолчанию из схемы
КомпоновщикНастроекДанныхОтчета.ЗагрузитьНастройки(ОбъектОтчетНаСервере.КомпоновщикНастроек.Настройки);

// Параметры в СКД можно найти по имени параметра.
ПараметрыДанных = КомпоновщикНастроекДанныхОтчета.Настройки.ПараметрыДанных.Элементы;
ЭлементНачалоПериода = ПараметрыДанных.Найти("НачалоПериода");
ЭлементНачалоПериода.Использование = Истина;
ЭлементНачалоПериода.Значение = ДАТА(2017,01,01,00,00,00);
	
// В отличие от параметров, отбор необходимо обходить циклом и проверять каждую строку.
// Кроме того, сравниваем не строки, а поля компоновки, используя ПолеКомпоновкиДанных
ОтборКомпоновщика = КомпоновщикНастроекДанныхОтчета.Настройки.Отбор;
Для Каждого ЭлементОтбора Из ОтборКомпоновщика.Элементы Цикл
	Если ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товар") Тогда
		ОтборКомпоновщика.Элементы.Удалить(ЭлементОтбора);
	КонецЕсли;
КонецЦикла;

НоменклатураОтбор = ОтборКомпоновщика.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НоменклатураОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
НоменклатураОтбор.Использование = Истина;
НоменклатураОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Товар");
НоменклатураОтбор.ПравоеЗначение = Справочники.Товары.НайтиПоНаименованию("Авторучка");

Как программно изменить структуру отчета СКД

Иногда возникает задача в зависимости от разных условий изменять структуру отчета – включить одну группировку и выключить другую, заменить детальные записи на группировку по каким-нибудь полям, добавить новую группировку, изменить отбор на уровне группировки и т.п.
Для решения данного класса задач используется объект Структура. Следует иметь в виду, что структура имеет древовидный характер, и в общем виде обходить ее нужно рекурсивно.

	// Добавим программно группировку по складу
	Структура = КомпоновщикНастроекДанныхОтчета.Настройки.Структура;
	ГруппировкаПоСкладу = Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	ГруппировкаПоСкладу.Имя = "Склад";
	ГруппировкаПоСкладу.Использование = Истина;
	
	//группировка по полю "Склад". Если нужны детальные записи, то просто не заполняем ПоляГруппировки
	ПолеГруппировкиСклад = ГруппировкаПоСкладу.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));       
	ПолеГруппировкиСклад.Использование      = Истина;
	ПолеГруппировкиСклад.Поле               = Новый ПолеКомпоновкиДанных("Склад");
	ПолеГруппировкиСклад.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Элементы;
	
	//добавить выводимые поля в группировке: склад и количество приход.
	ВыбранноеПоле = ГруппировкаПоСкладу.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));     
	ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Склад");
	ВыбранноеПоле = ГруппировкаПоСкладу.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));     
	ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("КоличествоПриход");

В случае, если нам понадобится добавить подчиненную (вложенную) группировку, нужно будет работать с коллекцией ГруппировкаПоСкладу.Структура. Принцип останется тот же – добавить при необходимости поля группировки, добавить выводимые поля. Также, на уровне конкретной группировки в структуре можно программно настроить отбор, сортировку, условное оформление и др.

Использование обработчика ПриКомпоновкеРезультата

У отчетов в 1С есть обработчик события ПриКомпоновкеРезультата. В контексте этого обработчика доступны объекты КомпоновщикНастроек и СхемаКомпоновкиДанных, если у отчета задана Основная схема компоновки данных.
Важный нюанс: данный обработчик не будет выполнен, если отчет формируется программно, как рассмотрено в примерах выше.
Начнем с простого формирования отчета, без учета пользовательских настроек:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;		
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, 
						КомпоновщикНастроек.Настройки,,,
						Тип("ГенераторМакетаКомпоновкиДанных"));
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	Результат = Новый ТабличныйДокумент;
 	ПроцессорВывода.УстановитьДокумент(Результат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);	
	ДокументРезультат.Вывести(Результат);
	
КонецПроцедуры

Это по сути заготовка, шаблон для всех дальнейших манипуляций с отчетом. Подходы к работе с СКД в этом обработчике практически ничем не отличаются от рассмотренных выше.

Следующий распространенный вариант использования программного формирования отчета – вывод данных в таблицу значений или дерево значений. Ключевое отличие – другой тип генератора, и использование метода УстановитьОбъект вместо метода УстановитьДокумент.

//Вывод результата в Таблицу значений или Дерево значений
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;		
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, 
					КомпоновщикНастроек.Настройки,,,
					Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	Результат = Новый ТаблицаЗначений;
 	ПроцессорВывода.УстановитьОбъект(Результат);
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);	
	
КонецПроцедуры 

Понравилась статья? Поделить с друзьями:
  • Как найти угол треугольника зная его площадь
  • Найти маршала control как пройти
  • Ошибка в начислении больничного листа как исправить
  • Как найти хорошего психотерапевта в саратове
  • Как найти поселок в казахстане