14 авг. 2012 г.

Произвольный макет в СКД

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

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

Теперь добавляем новое поле группировки, поля группировок не выбираем (Детальные записи), удаляем поле "Авто", переносим наш параметр.

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


Теперь немного кода. Создаем форму отчета. Отключаем видимость у Основной Командной Панели и Компоновщика Настроек. Создаем нашу команду "Сформировать", реквизит формы "Дата", перетаскиваем все это на форму. Пишем код в модуле формы:

&НаСервере
Процедура УстановитьПараметрыКомпоновки()

 пОтчета = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("Период");
 Если НЕ пОтчета = Неопределено Тогда
  пОтчета.Значение = КонецДня(Дата);
 КонецЕсли;
 ПредставлениеПериода = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ПредставлениеПериода");
 Если НЕ ПредставлениеПериода = Неопределено Тогда
  ПредставлениеПериода.Значение = "Остатки по складам на " + Формат(Дата, "ДЛФ=Д");
 КонецЕсли;
 
КонецПроцедуры

&НаСервере
Процедура СформироватьНаСервере()

 УстановитьПараметрыКомпоновки();
 
 Результат.Очистить();

 СхемаКомпоновкиДанных = РеквизитФормыВЗначение("Отчет").СхемаКомпоновкиДанных;
 КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
 МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Отчет.КомпоновщикНастроек.Настройки, ДанныеРасшифровки);

 ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
 ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

 ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
 ПроцессорВывода.УстановитьДокумент(Результат);
 ПроцессорВывода.ОтображатьПроцентВывода = Истина;

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

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

&НаКлиенте
Процедура Сформировать(Команда)
 
 СформироватьНаСервере();
 
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
 
 Дата = ТекущаяДата();
 
КонецПроцедуры
 
После этого, если все правильно сделали, результат отчета должен выглядеть вот так:

Подписи в своем отчете я реализовал таким же образом.

Выгрузка базы

17 комментариев:

  1. Привет. Возникла необходимость сделать по аналогии. Почти получилось. Что было сделано:
    1) Определил на закладке "Параметры" несколько строковых параметров.
    2) На закладке "Настройки" создал новую группировку и установил заголовок "Шапка".
    3) В других настройках группировки параметр "Макет оформления" установил в "Без оформления"
    4) На закладке "Макеты" сделал следующее:
    а) Нарисовал свою шапку и задал на ней мои переменные с типом "Параметр"
    б) Добавил макет заголовка группировки и указал ему область - строки моей шапки
    в) В параметрах макета связал имена параметров и выражений

    При формировании отчета у меня сначала выходит шапка отчета в виде таблицы из двух колонок (левая - параметр, правая - значение параметра)
    А вот дальше сразу под шапкой вылазит следующий косяк. У меня в одну строку в каждой колонке выходят значения всех моих заданных параметров. В твоем отчете такого нет. Что за косяк?

    ОтветитьУдалить
    Ответы
    1. Привет. В настройке компоновки на вкладке "Другие настройки" для секции "Шапка" и для отчета в целом проверь наличие выставленных параметров "Выводить параметры" и "Выводить отбор". Должно быть установлено значение "Не выводить" для нужной секции.

      Удалить
    2. Привет. Всё это было сделано. Делал все пошагово. Кстати у секции в других настройках нет параметра "Выводить параметры". Мой отчет вызывается из команды формы элемента справочника. Думал, что в этом дело. Перевел отчет в разряд внешние. Добавил фильтр на форму. В общем сделал все, как в статье. Безрезультатно. Причем скачал конфу с сайта. Там нормально. А у меня бред какой-то выходит. Я конечно же нашел хитрый способ. Добавил еще один пустой параметр. В выбранных полях группировки "Шапка" отключил все мои поля, а включенным оставил только этот пустой параметр. И все стало нормально. Но все же хотелось бы разобраться с этой проблемой и понять в чем причина.

      Удалить
    3. Всё! Я нашел решение проблемы. Дело было в том, что в статье были такие слова "Добавляем Заголовок группировки.". Я в макетах добавляю макет и вижу следующие варианты: "Добавить макет поля", "Добавить макет группировки", "Добавить макет заголовка группировки", "Добавить макет ресурсов". Написано же "Добавляем Заголовок группировки " ну я и добавил "Добавить макет заголовка группировки". А надо было добавить "макет группировки". Игра слов! Начал уже сравнивать чуть ли не до каждой картинки! Вот и нашел! :)

      Удалить
    4. Отлично, поздравляю. А то я уже начал было все свойства отчета просматривать :)

      Удалить
  2. Здравствуйте, не подскажете, можно ли сделать так, чтобы заголовок "Количество" не выводился? т.е. чтобы заголовок был не двухэтажный?

    ОтветитьУдалить
  3. Привет, как добавить шапку, которую используете в настройках СКД? Я пробовал и на своей, и на вашей конфигурациях, но не понимаю, как это сделать. Максимум, что получилось - это создать в настройках макета просто "".

    ОтветитьУдалить
    Ответы
    1. Максимум, что получилось - это создать в настройках макета просто "ДетальныеЗаписи".

      Удалить
    2. Привет. Могу предположить, что вы не задали имя группировки. В тексте статьи это явно не описывается, делается через вызов контекстного меню этой группировки, пункт "Задать имя". После этого именованную группировку можно выбирать в настройках полей макета. Если я ошибаюсь, то вам проще выложить ваш проблемный отчет, либо скинуть мне в почту.

      Удалить
  4. Спасибо за ответ, посмотрю, как это делается.

    ОтветитьУдалить
  5. А каким образом можно создать поля выбора даты: Начало периода и Конец периода, может у вас есть мануал?

    ОтветитьУдалить
    Ответы
    1. В этом примере поле и кнопка выведены на форму в конструкторе формы. Так же в настройках СКД можно установить свойство "включать в пользовательские настройки" для используемых параметров и элементов отбора. В этом случае, поля будут добавлены на форму автоматически, при условии, что форма отчета отсутствует в метаданных отчета, либо создана мастером с признаком "Использовать систему компоновки данных". Мануалы по СКД посмотрите на странице http://start1c.blogspot.ru/p/blog-page.html.

      Удалить
  6. Привет, я нашёл, что можно в форме задать период, используя встроенный реквизит "СтандартныйПериод". Но этот реквизит никак не влияет на результат работы отчёта.
    Т.е. какую бы я дату не поставил, она игнорируется, берутся за основу только параметры "НачалоПериода" и "КонецПериода", которые приходят из таблицы.
    Вопрос такой, как можно настроить перехват этих значений или как научить программу использовать данные из реквизита "СтандартныйПериод"?
    В обычных формах это получилось довольно просто, а вот в управляемых пока никак не выходит.

    ОтветитьУдалить
  7. Ок, для упр. форм все делается относительно просто. Форма отчета генерируется сама при ее отсутсвии в метаданных отчета. В параметры компоновки добавляешь параметр типа "СтандартныйПериод", например "ПериодОтчета". Для параметров "НачалоПериода", "КонецПериода" устанавливаешь признак "Оганичение доступности" и значения &ПериодОтчета.ДатаНачала, &ПериодОтчета.ДатаОкончания соответственно. В настройках компоновки для параметра "ПериодОтчета" устанавливаешь свойство "включать в пользовательские настройки".

    ОтветитьУдалить