Как программно изменить вариант отчета скд

Курсы по 1С (Профессиональные курсы по 1С: программирование, типовые конфигурации (УПП, КА, ЗУП, УТ11), подготовка к аттестации, разработка, настройка и внедрение) -

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

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

В курсе Профессиональная разработка отчетов в 1С 8.3 на Системе Компоновки Данных (СКД) подробно рассматривается программная работа со схемой компоновки данных.

Задача действительно очень актуальная, участники Мастер-группы по СКД задают много вопросов на эту тему :)

Также традиционно много вопросов возникает при программной работе с пользовательскими настройками отчетов:

  • Почему отличаются значения параметра в настройках компоновщика и в пользовательских настройках? Которое из этих значений используется для формирования отчета?
  • Как связываются между собой настройки компоновщика и пользовательские настройки?
  • Как установить значение отбора или параметра, если они вынесены в пользовательские настройки?
  • И многие другие…

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

Общая длительность всех видеоуроков – 1 час 5 минут.

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

Полезного просмотра :)

Видео 1 – Программное создание варианта отчета

00:37 – В каком обработчике можно расположить код для создания настроек компоновки
01:00 – Где в Синтакс-помощнике можно “подсмотреть” свойства, которые потребуются при написании кода
01:58 – Как настроить группировки отчета
02:28 – Какое свойство позволяет создавать вложенные группировки
03:11 – Как включить/выключить отдельные элементы настроек.

Видео 2 – Программное создание группировки

00:22 – Как создать структуру отчета
02:00 – Как указать поля, по которым выполняется группировка
04:10 – Как настроить выбранные поля
06:30 – Как создать автополе.

Видео 3 – Программное создание вложенной группировки

00:22 – Как создать подчиненную группировку
02:05 – Почему в отчете группировки могут выводиться несколько раз
02:40 – Как проверить наличие группировок в структуре отчета.

Видео 4 – Программное добавление отбора

00:18 – Где в Синтакс-помощнике найти типы данных, необходимые для создания отборов
00:55 – Какие свойства объекта типа ЭлементОтбораКомпоновкиДанных нужно использовать для создания отбора
01:20 – Как создать отбор при помощи программного кода.

Видео 5 – Программная установка сортировки

00:25– Где в Синтакс-помощнике найти типы данных, необходимые для включения сортировки
00:50 – Какие свойства объекта типа ЭлементПорядкаКомпоновкиДанных нужно использовать для включения сортировки
01:00 – Как установить сортировку при помощи программного кода.

Видео 6 – Программное добавление условного оформления

00:25 – Где в Синтакс-помощнике найти типы данных, необходимые для работы с условным оформлением
00:33 – Какие свойства объекта типа ЭлементУсловногоОформленияКомпоновкиДанных нужно использовать
02:08 – Как добавить условное оформление при помощи программного кода
02:31 – Как задать перечень полей, к которым будет применяться условное оформление
03:34 – Как отобрать оформляемые данные
04:15 – Как при помощи программного кода описать применяемое оформление.

Видео 7 – Программная работа с пользовательскими настройками

01:01 – Как программно установить значение параметра
02:00 – Почему значения параметров, выводимые на форму отчета, не совпадают со значениями в самом отчете
04:25 – Что делает метод ПолучитьНастройки
05:10 – Как нужно работать с пользовательскими настройками
06:17 – Для чего нужно свойство ИдентификаторПользовательскойНастройки
07:10 – Где в типовой конфигурации УТ 11 можно найти пример работы с пользовательскими настройками.

Видео 8 – Особенности использования метода ПолучитьНастройки

00:58 – Почему отличаются значения параметра в настройках компоновщика и в пользовательских настройках
01:23 – Как связываются между собой настройки компоновщика и пользовательские настройки
03:06 – Как работает метод ПолучитьНастройки и значение какого типа он возвращает

Видео 9 – Программное создание отборов в пользовательских настройках

00:34 – Чем отличается отбор в настройках компоновщика и отбор в пользовательских настройках
02:34 – Как используется свойство ИдентификаторПользовательскойНастройки
03:08 – Какой алгоритм должен использоваться для установки значения отбора в пользовательских настройках
03:42 – Как реализовать процедуру для установки значения отбора в пользовательских настройках.

Видео 10 – Программное создание схемы компоновки

00:40 – Как при компоновке отчета программно создать схему, по которой будет формироваться отчет
02:15 – Какой алгоритм должен использоваться для программного создания с нуля схемы компоновки
02:50 – Как программно создать источник данных схемы компоновки
04:00 – Как программно добавить в схему набор данных – объект
06:25 – Как программно добавить поля набора данных.

Хотите научиться грамотно создавать отчеты на СКД и дорабатывать отчеты в типовых конфигурациях?

Чтобы подробнее изучить возможности системы компоновки данных и уверенно применять механизм на практике, рекомендуем пройти курс Профессиональная разработка отчетов в 1С 8.3 на Системе Компоновки Данных (СКД)

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

Contents

  • 1 Открытие формы отчета с помощью ПолучитьФорму и расширения формы отчета.
  • 2 Открытие формы отчета с помощью ОткрытьФорму и расширения формы отчета.
  • 3 Программный вывод СКД в табличный документ и таблицу значений.
  • 4 Возможности настройки Схемы Компоновки Данных и Компоновщика Настроек СКД при программном формировании.
    • 4.1 Параметры
    • 4.2 Отбор
    • 4.3 Структура
  • 5 Резюме

Открытие формы отчета с помощью ПолучитьФорму и расширения формы отчета.

Сначала получаем форму.

Если отчет хранится в базе тогда выполняем на клиенте код:

Форма = ПолучитьФорму("Отчет.<Отчет>.Форма");

Иначе

Отчет = ВнешниеОтчеты.Создать("ПутьКОтчету");
Форма = Отчет.ПолучитьФорму("ИмяФормы");

Если нужен не «вариант по умолчанию»

Форма.УстановитьТекущийВариант("<КлючВарианта>");

Далее получаем настройки:

Настройки = ПолучитьНастройки(Форма.Отчет.КомпоновщикНастроек);

Через серверный вызов получаем настройки и если нужно заполняем параметры Компоновщика в отдельной процедуре.

&НаСервереБезКонтекста
Функция ПолучитьНастройки(КомпоновщикНастроек)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Возврат Настройки;
КонецФункции

Загружаем измененные настройки в компоновщик

Форма.Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);

Формируем отчет

Форма.СкомпоноватьРезультат();

Открываем форму

Форма.Открыть();

Открытие формы отчета с помощью ОткрытьФорму и расширения формы отчета.

Код выполняется на клиенте, сначала мы формируем структуру с необходимыми параметрами формы, а потом вызываем процедуру открытия. Часто используемые параметры в данном случае это:

  1. СформироватьПриОткрытии — нужен чтобы отчет открылся сразу сформированным.
  2. Отбор — Устанавливает отбор на результат СКД.
  3. КлючВарианта — Имя варианта настроек для отчетов с несколькими вариантами.

Пример:

УсловияОтбора = Новый Структура("<ИмяПоля>",<ЗначениеОтбора>);
ПараметрыФормы = Новый Структура("Отбор, СформироватьПриОткрытии,КлючВарианта", УсловияОтбора, Истина, <КлючВарианта>);
ОткрытьФорму("Отчет.<Отчет>.Форма", ПараметрыФормы);

Программный вывод СКД в табличный документ и таблицу значений.

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

Код выполняется на сервере.

Получение локального макета

СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

Получение макета произвольного отчета

СхемаКомпоновкиДанных = Отчеты.<Отчет>.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

Получение макета во внешней обработке

Обработка =  РеквизитФормыВЗначение("Объект");
СхемаКомпоновкиДанных = Обработка.ПолучитьМакет(<ИмяМакета>);

Получение макета из внешней обработки или отчета

Обработка = ВнешниеОбработки.Создать("ПутьКОбработке");
СхемаКомпоновкиДанных = Обработка.ПолучитьМакет("ИмяМакета");

или

Отчет = ВнешниеОтчеты.Создать("ПутьКОтчету");
СхемаКомпоновкиДанных = Отчет.ПолучитьМакет("ИмяМакета");

Далее мы получаем настройки. Настройки СКД могут быть взяты из разных источников. Мы можем их получить из самой СКД:

Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;

Мы можем создать новый компоновщик настроек на основе схемы и получить настройки из него.

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

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

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

И когда будем формировать

Настройки = КомпоновщикНастроекРеквизитФормы.ПолучитьНастройки();

Далее программно заполняем параметры Компоновщика. Об этом подробно в разделе 4 .

Объявляем создаем необходимые объекты:

ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;

Создаем макет компоновки с помощью компоновщика макета:

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

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

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

Инициализируем процессор компоновки данных

ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки);

Создаем процессор вывода:

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

Для вывода в таблицу значений используется другой процессор вывода:

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

Запускаем процесс вывода:

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

Теперь мы можем проводить нужные операции с полученными данными.

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

Возможности настройки Схемы Компоновки Данных и Компоновщика Настроек СКД при программном формировании.

При программном формировании СКД как в пункте 2 у нас есть огромное количество возможностей по управлению отчетом. Опишем самые часто используемые из них.

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

СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = СхемаКомпоновкиДанных.НаборыДанных[0].Запрос + " ГДЕ Не Водители.ПометкаУдаления";

Или если с добавлением нового параметра

СхемаКомпоновкиДанных.НаборыДанных[0].Запрос = СхемаКомпоновкиДанных.НаборыДанных[0].Запрос + " ГДЕ Не Водители.ПометкаУдаления = &Пометка";

Также при получении настроек можно выбрать не «настройки по умолчанию», а один из вариантов настроек.

Настройки = СхемаКомпоновкиДанных.ВариантыНастроек[0].Настройки;

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

Параметры

Все параметры создаются при создании исходного отчета, исключение если параметр был добавлен при редактировании запроса. Значение существующего параметра устанавливается следующим образом:

Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("<ИмяПараметра>",<ЗначениеПараметра>);

Добавление параметра делается следующим образом

СтрПараметр = Настройки.ПараметрыДанных.Элементы.Добавить();
СтрПараметр.Параметр = Новый ПараметрКомпоновкиДанных("<ИмяПараметра>");
СтрПараметр.Значение = <ЗначениеПараметра>;
СтрПараметр.Использование = Истина;

Отбор

У отборов нет специальных функций по установке значений. Поэтому нужно перебирать коллекцию циклом.

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

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

Структура

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

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

Резюме

Система компоновки данных была создана для ускорения разработки отчетов и упрощения работы пользователей. Программные изменения помогают усилить этот эффект. Программист может создать выгрузки и по сути свои отчеты на основании типовых отчетов. К примеру, выгрузка заработной платы в управленческую базу. Структура базы может сильно изменена, но поля в отчете “Расчетная ведомость Т-51” будут называться так же, и сам отчет вряд ли переименуется. Да и если что-то переименуется — выгрузку исправить будет очень просто.

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

Приведенные примеры кода были протестированы на платформе 1С:Предприятие 8.3 (8.3.13.1690).

Как известно, система компоновки данных в 1С позволяет создавать различные варианты отчетов с заранее подготовленными настройками еще на этапе создания.

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

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

Процедура УстановитьВариантыНастроек()

//Добавляем кнопку подменю на панель действий формы. Имя кнопки «ВариантыОтчетов», пользователю. будет видна как «Варианты»
КП = ЭлементыФормы.ДействияФормы;
НоваяКнопка = КП.Кнопки.Вставить(1,«ВариантыОтчетов», ТипКнопкиКоманднойПанели.Подменю, «Варианты», );

НовоеДействие = Новый Действие(«ИзменитьВариант»); //Создаем действие, которое потом назначим на кнопки с вариантами

Счетчик = 1; //посчитаем кнопки, у них должны быть разные имена

//Добавляем кнопки для каждого варианта настроки СКД
//Отображение кнопки берем из представления настройки
//Назначаем в качестве действия кнопки действие, созданное выше
Для каждого Настройка Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл

НоваяКнопка = КП.Кнопки.ВариантыОтчетов.Кнопки.Добавить(«Вариант»+Строка(Счетчик), ТипКнопкиКоманднойПанели.Действие, Настройка.Представление, НовоеДействие);
Счетчик = Счетчик + 1;

КонецЦикла;

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

Вызовем эту процедуру при открытии формы:

Процедура ПриОткрытии()

УстановитьВариантыНастроек();

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

А теперь создаем обработчик события для добавленных кнопок. В предыдущем коде была строчка НовоеДействие = Новый Действие(«ИзменитьВариант»); значит обработчик должен иметь название ИзменитьВариант.

Процедура ИзменитьВариант (Элемент)

//Обходим в цикле все варианты отчета и проверяем, совпадает ли их представление с заголовком кнопки, на которую нажали.
//Если совпало, значит это и есть искомая настройка
Для каждого Вариант Из СхемаКомпоновкиДанных.ВариантыНастроек Цикл

Если Элемент.Текст = Вариант.Представление тогда

//Загружаем вариант
КомпоновщикНастроек.ЗагрузитьНастройки(Вариант.Настройки);

//Меняем заголовок формы, чтобы было понятно, что за вариант работает
//Можно и где-то в другом месте отобразить название варианта
ЭтаФорма.Заголовок=ЭтотОбъект.Метаданные().Представление()+«: «+Вариант.Представление;

//У меня на форму были выведены дополнительные поля отборов из компоновщика настроек
//Если есть что-то подобное, то такие процедуры писать сюда
//Если нет, то следующую строчку удалить
ЗаполнитьОтборНастроек();

//Прерываем цикл, т.к. нашли настройку
Прервать;

КонецЕсли;

КонецЦикла;

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

За идею спасибо коллегам с сайта programmist1s.ru

На днях делал несколько однотипных отчетов на СКД. 

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

Потом возникла мысль попробовать объединить все схемы в один отчет, чтобы не плодить лишних объектов в конфигурации. При этом количество вариантов в этих схемах заранее неизвестно. Ok, challenge accepted.

В тестовой конфигурации создаю для отчета две схемы компоновки, «Склад» и «Заявки».

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

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

Код 1C v 8.2 УП

 &НаСервере
Процедура СоздатьПереченьОтчетов()

 Для Каждого Макет Из РеквизитФормыВЗначение("Отчет").Метаданные().Макеты Цикл
  Элементы.МакетОтчета.СписокВыбора.Добавить(Макет.Имя, Макет.Синоним);
 КонецЦикла;

КонецПроцедуры // СоздатьПереченьОтчетов()

&НаСервере
Процедура ОбработатьВыборМакета()

 Макет = РеквизитФормыВЗначение("Отчет").ПолучитьМакет(МакетОтчета);

   мУдалить = ?(ПустаяСтрока(РеквизитыКУдалению), Новый Массив, ПолучитьИзВременногоХранилища(РеквизитыКУдалению));
 мДобавить = Новый Массив;
 кУдалению = Новый Массив;

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

   ИзменитьРеквизиты(мДобавить, мУдалить);

   Пока Элементы.СтраницыОтчета.ПодчиненныеЭлементы.Количество() Цикл
  Элементы.Удалить(Элементы.СтраницыОтчета.ПодчиненныеЭлементы[0]);
 КонецЦикла;

   Для Каждого Вариант Из Макет.ВариантыНастроек Цикл

     Страница = Элементы.Добавить("Страница_" + Вариант.Имя, Тип("ГруппаФормы"), Элементы.СтраницыОтчета);
  Страница.Вид = ВидГруппыФормы.Страница;
  Страница.Заголовок = Вариант.Представление;

     ИмяРеквизита = "ТабДок_" + Вариант.Имя;
  ТабДок = Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), Страница);
  ТабДок.Вид = ВидПоляФормы.ПолеТабличногоДокумента;
  ТабДок.ПутьКДанным = ИмяРеквизита;
  ТабДок.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;

     ЭтаФорма[ИмяРеквизита].Очистить();

 КонецЦикла;

   РеквизитыКУдалению = ПоместитьВоВременноеХранилище(кУдалению, УникальныйИдентификатор);

КонецПроцедуры // ОбработатьВыборМакета()

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

 Схема = РеквизитФормыВЗначение("Отчет").ПолучитьМакет(МакетОтчета);

   Для Каждого Вариант Из Схема.ВариантыНастроек Цикл

     Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Вариант.Настройки);

           КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
     Макет = КомпоновщикМакета.Выполнить(Схема, Отчет.КомпоновщикНастроек.ПолучитьНастройки());

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

           ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
     ПроцессорВывода.УстановитьДокумент(ЭтаФорма["ТабДок_" + Вариант.Имя]);
     ПроцессорВывода.Вывести(ПроцессорКомпоновки); 

    КонецЦикла;

КонецПроцедуры // СформироватьОтчеты()

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

   СоздатьПереченьОтчетов();

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

&НаКлиенте
Процедура МакетОтчетаПриИзменении(Элемент)

   ОбработатьВыборМакета();

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

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

   СформироватьОтчеты();

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

Смотрим, что получилось.

Выгрузка базы 1Cv8skd.rar 

Источник

Содержание

  • 1 Особенности создания отчетов в 1С v8 в режиме толстого клиента
    • 1.1 Как сделать выбор варианта?
  • 2 Особенности создания отчетов через СКД
    • 2.1 Поэтапное создание отчета
    • 2.2 Как добавить нередактируемый пользователем параметр?
    • 2.3 Как задать варианты отчета?
    • 2.4 Как задать группировки?
    • 2.5 Как программно вывести отчет?
    • 2.6 Как тестировать отчет?
    • 2.7 Как загрузить нужные настройки отчета?
    • 2.8 Как сделать множественные (списком) параметры запроса в СКД?
    • 2.9 Как сделать отключаемые параметры запроса в СКД?
    • 2.10 Как сделать отчет с разворотом по колонкам?
    • 2.11 Как настроить формат вывода полей?
  • 3 Особенности установки параметров системы компоновки данных
    • 3.1 ПараметрыДанных
    • 3.2 Отбор
    • 3.3 ПользовательскиеНастройки
  • 4 Использование источника данных в виде объекта
  • 5 Язык выражений системы компоновки данных
  • 6 Использование нестандартных макетов оформления отчета СКД
  • 7 Вывод разрыва страницы при печати через СКД

Особенности создания отчетов в 1С v8 в режиме толстого клиента

Как сделать выбор варианта?

  • На панель отчета помещаем кнопку «ВыбратьВариант»
  • На форму помещаем поле «НаДату»

Пример кода:

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

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

Процедура Сформировать()
	ЭлементыФормы.Результат.Очистить();
	КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", НаДату);
	СкомпоноватьРезультат(ЭлементыФормы.Результат);
КонецПроцедуры

Процедура ПриОткрытии()
	НаДату = ТекущаяДата();
	Сформировать();
КонецПроцедуры

Особенности создания отчетов через СКД

Поэтапное создание отчета

  1. Создать Отчет в узле Отчетов
  2. Создать Макет в отчете, тип которого — Схема компоновки данных
  3. В свойствах отчета установить: Основная схема компоновки данных = Созданный Макет
  4. В свойствах отчета установите подсистему, которой он принадлежит (отчет в Предприятии будет выведен в верхней навигационной панели)
  5. Создать запрос в Макете (пункт: Добавить набор данных — Запрос)
  6. В закладке Параметры у Макета необходимо убрать галочки у всех строк в колонке ОграничениеДоступности — т.е. все параметры будут доступны для редактирования пользователю
  7. В закладке Настройки у Макета необходимо в окне, где выводится узел Отчет, создать новую группировку без указания поля группировки — будет создана детальная строка
  8. В закладке Настройки у Макета, в окне где выводится дополнительный набор закладок, выбрать доп. закладку Параметры — пометить все параметры галочкой и на каждом параметре нажать кнопку Свойства элемента пользовательских настроек, откроется окно настройки параметра, где необходимо поставить галочку — Включать параметр в пользовательские настройки
  9. В закладке Настройки у Макета, в окне где выводится дополнительный набор закладок, выбрать доп. закладку ВыбранныеПоля — там необходимо добавить колонки которые будут выводиться в отчете
  10. Запускайте Предприятие, открывайте отчет, устанавливайте значения параметров, Сформировать (проверьте что выбран Основной вариант формирования отчета)

Как добавить нередактируемый пользователем параметр?

Например, нам нужно установить параметр запроса «Информационная база»

  • В форме макета компоновки на закладке Параметры у нужного параметра снять флаги «Включать в доступные поля» и «Ограничение доступности»

Особенности создания отчетов 1Cv8-1.png

  • В форме макета компоновки на закладке Настройка на подзакладке (внизу) Параметры у нужного параметра снять флаг, открыть свойства (кнопка с гаечным ключом), на этой форме:
    • Снять флаг «Включать в пользовательские настройки»
    • Режим редактирования установить «Недоступный»

Особенности создания отчетов 1Cv8-2.png

Особенности создания отчетов 1Cv8-3.png

  • В модуле формы отчета в обработчике события «ПриЗагрузкеВариантаНаСервере» (можно и ПриОткрытии, но НЕ ПриСозданииНаСервере, т.к. она выполняется ДО загрузки настроек отчета и настройки будут перезаписаны) программно установить параметр:
&НаСервере
Процедура ПриЗагрузкеВариантаНаСервере(Настройки)

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

Как задать варианты отчета?

  • В форме макета компоновки на закладке Настройки в поле слева можно создать необходимые варианты отчета

Как задать группировки?

  • В форме макета компоновки на закладке Настройки в поле справа вверху можно создать необходимые группировки

Как программно вывести отчет?

В модуле формы:

&НаКлиенте
Процедура СформироватьОтчетВыполнить()
    ЭтаФорма.СкомпоноватьРезультат();
КонецПроцедуры

Как тестировать отчет?

Нужно выполнить:

  • Сформировать ситуацию в клиентском тесте — удобнее всего через таблицу ситуации
  • получить форму отчета — форма = ПолучитьФорму(«Отчет.ДвижениеПроцесов.Форма.ФормаОтчета»);
  • загрузить нужный вариант отчета — установить параметр расширения формы отчета «КлючВарианта» (имя настройки в макете компоновки данных)
  • загрузить нужные настройки отчета — ? заполнить параметр расширения формы отчета «ПользовательскиеНастройки» (тип «ПользовательскиеНастройкиКомпоновкиДанных «) так не получилось, все сложно, см. ниже.
  • открыть форму — форма.Открыть()
  • выполнить формирование — форма.СкомпоноватьРезультат();
  • проверить содержимое табличного документа форма.Результат — хорошо бы иметь функции сравнения с эталонной mxl
  • закрыть форму — форма.Закрыть(); — а может быть, можно и не открывать, надо проверить

см. также

  • описание: меню Справка/Синтакс-помощник/закладка Содержание/Интерфейсные объекты управляемого приложения/Расширения управляемой формы/Расширение управляемой формы для отчета/Параметры формы

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

  • проще создавать тестовую ситуацию
  • проще проверять результат
  • быстрее

Но хотя бы один простейший клиентский smoke-тест все равно нужен.

Как загрузить нужные настройки отчета?

В документации описано, что есть такой параметр расширения формы отчета «ПользовательскиеНастройки» типа «ПользовательскиеНастройкиКомпоновкиДанных», но там очень сложная объектная структура, не удалось её использовать.

Реально работающая схема:

1. Создаём в отчете параметры

  • Период типа СтандартныйПериод
  • Отбор типа СписокЗначений (лучше было бы Структура, но её нет в списке типов параметров, как и произвольного типа)

2. В процедуру ПолучитьФорму передаем нужные параметры:

период = Новый СтандартныйПериод;
период.Вариант = ВариантСтандартногоПериода.ПроизвольныйПериод;
период.ДатаНачала = текущаяДата;
период.ДатаОкончания = завтрашняяДата;

отбор = Новый СписокЗначений;
отбор.Добавить(Тестирование.ПолучитьОбъект(стСитуация, "БП1"), "БизнесПроцесс"); 

стПараметры = Новый Структура("КлючВарианта,Период,Отбор", "Основной", период, отбор);
// ОткрытьФормуМодально("Отчет.ДвижениеПроцессов.Форма.ФормаОтчета", стПараметры);
форма = ПолучитьФорму("Отчет.ДвижениеПроцессов.Форма.ФормаОтчета", стПараметры);

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

&НаСервере
Функция спПолучить(спСписок, представление) Экспорт 
	Для Каждого элемент Из спСписок Цикл
		Если элемент.Представление = представление Тогда
			Возврат элемент.Значение;
		КонецЕсли;
	КонецЦикла;
	Возврат Неопределено;
КонецФункции

&НаСервере
Процедура УстановитьЗначениеПользовательскойНастройки(Настройки, Имя, Значение)
	Для Каждого элемент Из Настройки.Элементы Цикл
		Если ТипЗнч(элемент) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
			Если Строка(элемент.Параметр) = Имя Тогда
				элемент.Значение = Значение;
				элемент.Использование = Истина;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

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

&НаСервере
Процедура ПриЗагрузкеВариантаНаСервере(Настройки)

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

&НаСервере
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Настройки)
	Настройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки;

	Если Параметры.Период.ДатаОкончания <> '00010101' Тогда
		Настройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки;
		УстановитьЗначениеПользовательскойНастройки(Настройки, "Период", Параметры.Период);
	КонецЕсли;
	
	ссБизнесПроцесс = спПолучить(Параметры.Отбор, "БизнесПроцесс");
	Если ссБизнесПроцесс <> Неопределено Тогда
		УстановитьЗначениеПользовательскогоОтбора(Настройки, "БизнесПроцесс", ссБизнесПроцесс);
	КонецЕсли;
	
КонецПроцедуры

Замечания:

  • Есть ПараметрыДанных, то есть то что устанавливается в параметры запроса СКД
  • Некоторые из них назначаются в настройке варианта в ПользовательскиеНастройки (в свойтсвах параметра есть флаг «Включить в пользовательские настройки»
  • Даже если при загрузке на сервере в параметры данных загрузить нужные значения, потом открывается форма, в которую автоматически загружаются сохраненные в прошлый раз настройки. Эти настноки при формировании отчета «перебивают» настройки данных
  • В обработчике ПриЗагрузкеПользовательскихНастроекНаСервере передаваемый объект Настройки является копией реальных настроек, поэтому чтобы изменить настройки, которые появятся на форме, надо заполнять объект Отчет.КомпоновщикНастроек.ПользовательскиеНастройки

Как сделать множественные (списком) параметры запроса в СКД?

В запросе нужно использовать выражение «В (&ИмяПараметра)» (см. Логические выражения в языке запросов 1Cv8)

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

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

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

Если галочка в форме отчета (панель быстрой настройки) у соответствующего параметра снята, то эта конструкция убирается из запроса.

Подробнее см. Расширение языка запросов для системы компоновки данных (1Cv8)

Как сделать отчет с разворотом по колонкам?

Для этого в настройке варианта отчета (редактирование макета компоновки данных, закладка «Настройка», поле справа вверху), нужно в качестве первой группировки добавить «Таблица».

После этого в узле «Таблица» появляются ветки «Строки» и «Колонки», куда и добавляются нужные группировки.

Как настроить формат вывода полей?

В редакторе макета компоновки данных на закладке «Наборы данных» в правой верхней области есть список полей отчёта.

Есть две возможности:

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

Для полей ресурсов можно задавать выражения вычисления (закладка «Ресурсы») — например,

Сумма(Время)/3600.0

для перевода из секунд в часы.

Нужную точность можно задать через «Оформление» поля на закладке «Наборы данных».

Особенности установки параметров системы компоновки данных

Существуют и требуют различной обработки по крайней мере ТРИ вида параметров:

ПараметрыДанных

ПараметрыДанных определяются в запросе (источнике данных) СКД.

Параметры данных передаются в запрос источника данных и определяют извлекаемые данные.

В объекта КомпоновщикНастроек есть специальное свойство для работы с параметрами данных КомпоновщикНастроек.Настройки.ПараметрыДанных

Можно установить вызовом вида

Настройки = Отчет.КомпоновщикНастроек.Настройки;
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ИнформационнаяБаза", Отчет.ИнформационнаяБаза);

Отбор

Отборы накладываются на полученные данные после извлечения из источника данных.

В объекта КомпоновщикНастроек есть специальное свойство для работы с отборами КомпоновщикНастроек.Настройки.Отбор.

Например:

Настройки = Отчет.КомпоновщикНастроек.Настройки;
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("ИнформационнаяБаза", Отчет.ИнформационнаяБаза);

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

ПользовательскиеНастройки

Пользовательские настройки определяют данные, которые пользователь может настроить на форме.

Пользовательские настройки могут отображаются на форме в специальной таблице и могут быть вызваны по кнопке «Настройки» и из меню «Все действия».

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

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

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

Удобное место для установки нужных значений — обработчик события «ПриЗагрузкеПользовательскихНастроекНаСервере» расширения формы отчёта.

&НаСервере
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Настройки)

	Если Параметры.Период.ДатаОкончания <> '00010101' Тогда
		Настройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки;
		Настройки.Элементы[0].Значение = Параметры.Период;
	КонецЕсли;

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

Использование источника данных в виде объекта

Для использования набора данных типа объект нужно передать внешний источник данных методу Инициализировать объекта «Процессор компоновки данных».

 
ДанныеРасшифровки = Неопределено;

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

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

Простой пример приложен (для работы примера необходимо наличие справочников «Контрагенты» и «Договоры контрагентов»).

Источник: http://partners.v8.1c.ru/forum/thread.jsp?id=496129#496129

Пример: Медиа:OtcetPoDetalam.rar

Язык выражений системы компоновки данных

  • Язык выражений системы компоновки данных (1Cv82)

Использование нестандартных макетов оформления отчета СКД

Кое-как удалось заставить СКД формировать заголовки группировок.

Непонятная на первый взгляд фишка — то, что в настройках группировок нужно задать «Имя» группировки (через контекстное меню — «Установить имя»), а кроме того это имя группировки надо добавлять в «Детальные записи» а не в групприровки..

В общем, темный лес, не для средних умов..

Вывод разрыва страницы при печати через СКД

Просто вставить в макет разрыв страницы ничего не дало — в результат он не попадает.

Поиск дал информацию что это проблема СКД

  • http://partners.v8.1c.ru/forum/thread.jsp?id=642887#642887
  • http://partners.v8.1c.ru/forum/thread.jsp?id=608501#608501

Ответ 1С:

Рекомендуют выводить программно через ВывестиГоризонтальныйРазделительСтраниц.

В новой версии 8.2 в модуле объекта отчета есть обработчик события ПриКомпоновкеРезультата. (Приятная особенность — пример в документации 8.2 написан с ошибками и вообще не работает:)

Работающая версия:

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

—Павел Лазарев 16:02, 7 сентября 2009 (SAMST)

  • В этом примере если НЕ создать объект ДанныеРасшифровки (как и было в документации 1С), то НЕ вызывается меню расшифровки по умолчанию по клику на ячейке.

Понравилась статья? Поделить с друзьями:
  • Как проводится работа над ошибками после диктанта
  • Как провести работу над ошибками после диктанта 3 класс
  • Как провести день рождения чтобы изменить жизнь к лучшему
  • Как провести гашение на кассовом аппарате меркурий 185ф ошибка 066
  • Как проверить электронику автомобиля на ошибки