gifts2017

Добавление данных из других отчетов

Опубликовал Alex Necro (alexnecro) в раздел Программирование - Практика программирования

Бывает, что в отчет нужно включить какие-то данные из другого отчета, что же делать?

Идея наверное не нова, но не могу не поделиться:


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


Вариант первый, хороший:


Находим вызовы общих модулей в чужом отчете, из которых получаются нужные нам данные и вызываем их. Если нам повезло со структурой - всё хорошо.


Вариант второй, тоже хороший:


Пишем что-то вроде этого:


	    ЧужойОтчет = Отчеты.ЧужойОтчет.Создать();

	    ЧужойОтчет.ДатаНач = НачалоМесяца(ДатаОтчета);

	    ЧужойОтчет.ДатаКон = КонецДня(ДатаОтчета);

	    ЧужойОтчет.Подразделение = Подразделение;

	    ЧужойОтчет.ГрафикРаботы = ГрафикРаботы;

	    ТабличныйДокумент = Новый ТабличныйДокумент;

	    ЧужойОтчет.СформироватьОтчет(ТабличныйДокумент);
   


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


Вариант третий, плохой (зато часто используемый):


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


Почему используется третий вариант, когда есть второй?

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

Во-вторых, когда в чужом отчете не содержится средств для его программного формирования (а ведь как хорошо, когда в каждом моделе отчета есть экспортные функции СформироватьДанные() и СформироватьОтчет()!)

И вот этот второй случай можно победить четвертым вариантом.


Вариант четвертый, инновационный:


Мне пришлось воспользоваться этим вариантом по следующим причинам:

1. Конфигурация недоступна для изменения

2. Чужой отчет формируется в обработчике нажатия на кнопку (то есть функция модуля формы без экспорта)

3. Использоваться отчет будет в неизвестном файловом окружении на другом узле РИБ.

4. Формирование отчета слишком сложное для того чтобы тащить код к себе в отчет


Итак:

1. Сохраняем отчет как внешний.

2. Добавляем к нужной функции экспорт (ну или меняем что-то еще)

3. Загружаем чужой отчет в свой как макет (тип: ДвоичныеДанные)

4. В свой отчет вставляем следующий код:


	Макет = ПолучитьМакет("ЧужойОтчет1");

	Макет.Записать(КаталогВременныхФайлов()+"ЧужойОтчет1.erf");

	ЧужойОтчет = ВнешниеОтчеты.Создать(КаталогВременныхФайлов()+"ЧужойОтчет1.erf");

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

	ФормаОтчета.НачПериода = НачалоМесяца(ДатаОтчета);

	ФормаОтчета.КонПериода = КонецДня(ДатаОтчета);

	ФормаОтчета.Подразделение = Подразделение;    

	ФормаОтчета.КнопкаВыполнитьНажатие(0);

	ТабличныйДокумент = ФормаОтчета.ЭлементыФормы.ПолеТабличногоДокумента1;


Вот, собственно, и всё. Всем спасибо за внимание.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Александр (Trinitron) 27.08.14 16:33
а вот если чужой отчет реализован на СКД, то как в таком случае будет ваша метода работать?
а вцелом интересная идея, спасибо, возьму на заметку
2. script Мальчинко (script) 28.08.14 01:57
Если оба отчета На СКД, тогда все это делается в сто раз проще.
spogo; zaika; zqzq; +3 Ответить 2
3. Александр Лыткин (TrinitronOTV) 28.08.14 04:24
(2) script, а вкратце можно пояснить или где почитать про этот момент?
4. Alex Necro (alexnecro) 28.08.14 04:10
(2) script, я знаю только такой способ программного формирования:
...
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки, ДанныеРасшифровки);
...

а как правильно вставить чужой отчет на СКД в свой?
5. Макас (makas) 28.08.14 11:11
6. Fomix (fomix) 03.09.14 10:54
Не совсем понял фразу в инновационном способе № 4: "3. Использоваться отчет будет в неизвестном файловом окружении на другом узле РИБ.".
Мне интересно как автор собирается получать данные в свой отчет на другом узле РИБ, да еще во вражеском окружении?!
7. юрий гулидов (gull22) 03.09.14 10:55
8. Alex Necro (alexnecro) 03.09.14 08:59
(6) fomix, Я имею ввиду что нельзя просто пойти и подложить туда внешний отчет. Поэтому тащим его с собой.
9. Ольга Пушкова (POLGA) 03.09.14 12:00
Если отчет с использованием произвольного отчета или СКД и есть сохранённые настройки, то есть ещё вариант - использовать механизм "Произвольные отчеты", где в качестве источника данных указать "Отчет, Название, сохранённая настройка". Из видеоуроков с сайта www.spec8.ru
10. Michael Cher (mmch) 03.09.14 12:18
не очень понял, как это спасет от этого...

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

11. Alex Necro (alexnecro) 03.09.14 09:25
(10) mmch, спасет только от этого:
4. Формирование отчета слишком сложное для того чтобы тащить код к себе в отчет

В остальном, естественно, аналогично )
12. Natalia Z (droplet) 05.09.14 17:48
Плюсую за идею и манеру изложения
13. Ruslan (rus128) 10.09.14 12:03
"Все гениальное - просто!" и "кратк.-сестр.тал." :-)
14. haz haz (hazd) 12.10.14 01:18
Согласен, идея не нова, но правильно сделали, что поделились) спасибо
15. Алексей Драчков (Bassgood) 17.10.14 12:52
(4) alexnecro, если и свой и чужой отчеты реализован на СКД, то можно:
1. Позаимствовать схему СКД у чужого отчета и через конструктор СКД подправить ее соответствующим образом (результат ее работы можно получить из кода).
2. Воспользоваться в конструкторе схемы СКД своего отчета закладкой "Вложенные схемы", на которой можно извлечь данные из чужого отчета (предварительно загрузив его схему в свою), т.о. можно совместить в одной схеме СКД (в одном своем отчете) данные из разных отчетов (своего и чужого).
Вот как то так.
16. Сергей Погодин (spogo) 31.10.14 12:53
(4) Я делаю так:
1, В свой отчет в СКД добавляю набор данных объект, с нужными мне полями
2. Связываю наборы
3. В процедуре ПриКомпоновкеРезультата получаю схему СКД чужого отчета, (если необходимо очищаю настройки и делаю свои), устанавливаю параметры., выполняю программно, назначив процессор вывода (ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений), соответственно результат записывается в указанную мной таблицу значений
4. ну а дальше так же программно выполняю свою схему, указав таблицу значений как внешний набор
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа