Работа с расшифровкой отчета на СКД

Программирование - Практика программирования

СКД Расшифровка СКД Программная расшифровка Расшифровка отчет ОбработкаРасшифровкиКомпоновкиДанных произвольный отчет СКД произвольный

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

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

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

Ниже представлен программный код кнопки "Сформировать". На данном этапе формируется отчет и заполняются данные для расшифровки.


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

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

&НаСервере
Функция ПолучитьМакетОбъекта(ИмяМакета)
	ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
	Возврат ОтчетОбъект.ПолучитьМакет(ИмяМакета);
КонецФункции // ПолучитьМакетОбработки()

Для программной обработки расшифровки используем событие табличного документа "ОбработкаРасшифровки". Пишем там следующее:

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

&НаКлиенте
Процедура ОбработатьРасшифровку(ВыбранноеДействие,ВыбранноеЗначение,Параметр3) Экспорт

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

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

 

Вот и все. Можно пробовать.

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

33

Скачать файлы

Наименование Файл Версия Размер
Пример отчета
.erf 9,78Kb
27.02.18
6
.erf 9,78Kb 6 Скачать

См. также

Комментарии
Избранное Подписка Сортировка: Древо
2. HAMMER_59 72 28.02.18 07:06 Сейчас в теме
ДанныеРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровкиОтчета,Новый УникальныйИдентификатор)

Т.е. при каждом формировании отчета, данные расшифровки будут помещаться в отдельное хранилище, и будут храниться до конца сеанса.
Обычно, в таких случаях идентификатор формы передают.
3. Isonic 79 28.02.18 07:48 Сейчас в теме
(2) можно и идентификатор формы. Так, думаю, будет правильнее
4. awk 687 28.02.18 12:20 Сейчас в теме
Почему не в фоне формирование отчета? Почему не предопределенная процедура в модуле объекта?
5. Isonic 79 28.02.18 12:58 Сейчас в теме
6. awk 687 28.02.18 16:13 Сейчас в теме
Э... То что вы привели в процедурах Сформировать(Команда), СформироватьНаСервере очень плохой стиль...

Есть процедура модуля отчета ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) - лучше работать через нее...
starik-2005; CSiER; herfis; +3 Ответить
7. Isonic 79 28.02.18 16:20 Сейчас в теме
(6)не соглашусь.
когда "отчет" не будет является основным реквизитом, будет ли доступно ваше событие?
8. herfis 261 28.02.18 16:25 Сейчас в теме
(7) Пример должен быть цельным. Ваш пример - именно отчет. Компоновка не в отчете будет иметь свои особенности, как и расшифровка. Так что замечание по делу. Это же в помощь новичкам? А ваша статья может ввести новичков в заблуждение.
И было бы неплохо довести пример до программного обращения к данным расшифровки в ее программной обработке, так как это тоже неочевидный момент для новичков.
9. Isonic 79 28.02.18 16:25 Сейчас в теме
(6)прошу прощения, вы имели в виду модуль объекта отчета. тогда да.
10. herfis 261 28.02.18 16:40 Сейчас в теме
Настройки = МакетСКД.НастройкиПоУмолчанию

Вот это тоже фигня. Мало того, что игнорируются пользовательские настройки (которых в реальном отчете просто не может не быть), так еще и предполагается что вариант отчета только один.
Короче, пока что минус статье. Очень уж сырая.
12. Isonic 79 04.03.18 17:58 Сейчас в теме
(10)
(11)
Я неимоверно рад, что у нас есть такие умные люди как Вы!
13. Yashazz 2295 04.03.18 22:43 Сейчас в теме
(12) Автор, поучитесь общаться в интернетах. В частности, мой Вам добрый совет: научиться понимать разницу между обсуждением произведения и автора. Мы критикуем публикацию, а вы странным образом пытаетесь перейти на личности.
14. Isonic 79 05.03.18 08:59 Сейчас в теме
(13) вы пишете "кривизны и спорных моментов много". Так покажите где, иначе смысл вашей критики? Есть спорные моменты, давайте обсудим

Здесь не кинопоиск (или подобное), здесь люди учатся и делятся опытом. Вы указали на ошибку, я запомнил, изучил, и больше ее не повторяю. Разве это плохо?
15. herfis 261 05.03.18 10:18 Сейчас в теме
(12)
Я неимоверно рад, что у нас есть такие умные люди как Вы!

Моя критика была недостаточно конструктивной? Если что-то непонятно - уточняйте, не стесняйтесь.
Ваша критика моей критики уж точно неконструктивна.
Пока же я вижу, что вы не потрудились исправить в статье даже те недоработки, которые поняли и с которыми согласились.
11. Yashazz 2295 04.03.18 01:40 Сейчас в теме
С одной стороны, попытка рассказать своими словами, что хорошо; ибо обычно внаглую передирают Хрусталёву. С другой, да, кривизны и спорных моментов много.
Оставьте свое сообщение