IE2017

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

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

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

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


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


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


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


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


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


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

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

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

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

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

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

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


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


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


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


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

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

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

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


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


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

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

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

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

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

В остальном, естественно, аналогично )
12. Natalia Z (droplet) 70 05.09.14 17:48 Сейчас в теме
Плюсую за идею и манеру изложения
13. Ruslan Odessa (rus128) 2 10.09.14 12:03 Сейчас в теме
"Все гениальное - просто!" и "кратк.-сестр.тал." :-)
14. haz haz (hazd) 12.10.14 01:18 Сейчас в теме
Согласен, идея не нова, но правильно сделали, что поделились) спасибо
15. Алексей Драчков (Bassgood) 632 17.10.14 12:52 Сейчас в теме
(4) alexnecro, если и свой и чужой отчеты реализован на СКД, то можно:
1. Позаимствовать схему СКД у чужого отчета и через конструктор СКД подправить ее соответствующим образом (результат ее работы можно получить из кода).
2. Воспользоваться в конструкторе схемы СКД своего отчета закладкой "Вложенные схемы", на которой можно извлечь данные из чужого отчета (предварительно загрузив его схему в свою), т.о. можно совместить в одной схеме СКД (в одном своем отчете) данные из разных отчетов (своего и чужого).
Вот как то так.
16. Сергей Погодин (spogo) 2 31.10.14 12:53 Сейчас в теме
(4) Я делаю так:
1, В свой отчет в СКД добавляю набор данных объект, с нужными мне полями
2. Связываю наборы
3. В процедуре ПриКомпоновкеРезультата получаю схему СКД чужого отчета, (если необходимо очищаю настройки и делаю свои), устанавливаю параметры., выполняю программно, назначив процессор вывода (ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений), соответственно результат записывается в указанную мной таблицу значений
4. ну а дальше так же программно выполняю свою схему, указав таблицу значений как внешний набор
17. Сергей Бендик (sergvmv) 10.05.17 09:48 Сейчас в теме
А как это будет работать на клиент-серверной 1с?
18. Сергей Погодин (spogo) 2 10.05.17 13:28 Сейчас в теме
19. Сергей Бендик (sergvmv) 11.05.17 08:39 Сейчас в теме
часть делается под сервером, а часть на клиенте. как этот все соединить?
20. Сергей Бендик (sergvmv) 11.05.17 08:40 Сейчас в теме
21. Сергей Бендик (sergvmv) 11.05.17 08:41 Сейчас в теме
точнее получитьформу выдаст ошибку. было как-то.
22. Сергей Погодин (spogo) 2 11.05.17 17:24 Сейчас в теме
(21) делайте как описано в (16)
Оставьте свое сообщение