MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
1С 8.2: Как перехватить формирование отчета с СКД?
19.09.2013
12:28
Раздел: Компьютер - Windows - 1С - Готовые решения

Вопрос

Как можно перехватить формирование отчета, чтобы не делать форму? Я нашел только предопределенную процедуру "ПриКомпоновкеРезультата".

Может я плохо искал? Ведь логично, чтобы для каждого этапа:

1.компоновка макета

2.копоновка данных

3.вывод результата компоновки

присутствовали обработчики, позволяющие программисту вмешиваться в работу.

Ответ 1

Делаешь свою кнопку и вперед.

Запрос=Новый Запрос;

Запрос.Текст="ВЫБРАТЬ

| ОстаткиТоваровОстаткиИОбороты.Склад,

| ОстаткиТоваровОстаткиИОбороты.Номенклатура,

| ОстаткиТоваровОстаткиИОбороты.КоличествоНачальныйОстаток,

| ОстаткиТоваровОстаткиИОбороты.КоличествоПриход,

| ОстаткиТоваровОстаткиИОбороты.КоличествоРасход,

| ОстаткиТоваровОстаткиИОбороты.КоличествоКонечныйОстаток

|ИЗ

| РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты КАК ОстаткиТоваровОстаткиИОбороты";

ТЗ=Запрос.Выполнить().Выгрузить();

ВнешнийНабор=Новый Структура("Наборчик",ТЗ);

// схема компановки из реквизита отчета

СКД=ЭтотОбъект.ПолучитьМакет("ЧерезНабор"); // получим схему из макета

// настройка из схемы по умолчанию

НастройкаСКД=ЭтотОбъект.КомпоновщикНастроек.Настройки; // текущие настройки

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

КомпоновщикМакетаКомпоновкиДанных=Новый КомпоновщикМакетаКомпоновкиДанных;

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

// процессор из макета делает себя самого

ПроцессорКомпоновкиДанных=Новый ПроцессорКомпоновкиДанных;

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

// прцессор вывода порождает ТД

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

ЭлементыФормы.Результат.Очистить();

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

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

ТД.Показать();

Ответ 2

Ну все правильно ПриКомпоновкеРезультата() для этого предназначена, и форму можно не делать.

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

СтандартнаяОбработка = Ложь;

Настройки = КомпоновщикНастроек.Настройки;

КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;

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

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;

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

ДокументРезультат.Очистить();

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

ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

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

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

Вопрос

А в какое время вызывается эта процедура? Нигде не нашел (и программно проверить тоже нельзя, потому что если в форме руками прописать код похожий на ваш, то процедура не вызывается).

Ответ

Код живёт в модуле Объекта.

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

Сообщить("Я тут!!");

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

Так же в этом разделе:
← Содержание ...
 
MyTetra Share v.0.35
Яндекс индекс цитирования