Все об 1С8 - просто и доступно

Добавить в Избранное  Сделать Стартовой  Написать письмо

Главная Статьи Вопрос-ответ Экспресс-справочник Гостевая книга
Статьи по 1С

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

Время от времени от пользователей решений на платформе 1С поступают разные задачи. Одной из таковых может быть просьба предоставить возможность "розовой" кнопки на форме отчета, по нажатию которой будут выполнены какие-то действия. Например, сформирован отчет с какими-то параметрами и отборами, и результат, полученный в отчете, используется для создания и заполнения каких-то документов. То есть нам заранее неизвестно, что в настройки и отборы выставит пользователь.

Можно ли в этом случае по нажатию этой самой "розовой" кнопки получить данные отчета и использовать их в дальнейшем? - Можно.

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

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

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

Первым шагом формируем отчет и получаем данные в таблицу значений:

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


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

Для полноты картины можно привести и этот кусочек кода.
	ТабДокумент = Новый ТабличныйДокумент;

	ТабДокумент.Очистить();
	Макет = ОтчетОбъект.ПолучитьМакет("Макет");

	ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
	ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
	ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");

	ТабДокумент.Вывести(ОбластьШапка);

	НомерПП = 1;

	Для Каждого ТекСтрока Из ТаблицаЗначений Цикл

		ОбластьСтрока.Параметры.НомерПП = Формат(НомерПП, "ЧГ=0");
		ОбластьСтрока.Параметры.Наименование = ТекСтрока.Наименование;
		ОбластьСтрока.Параметры.ДатаРождения = Формат(ТекСтрока.ДатаРождения, "ДФ=dd.MM.yyyy");
		ОбластьСтрока.Параметры.Пол = ТекСтрока.Пол;

		ТабДокумент.Вывести(ОбластьСтрока);

		НомерПП = НомерПП + 1;

	КонецЦикла; 

	ТабДокумент.Вывести(ОбластьПодвал);

	Возврат ТабДокумент;

Получившийся отчет для примера можно скачать тут