Идея наверное не нова, но не могу не поделиться:
Итак, мы пишем какой-то отчет (СКД или руками - неважно) и нужно получить какие-то данные из других отчетов (я буду называть их “чужой отчет”).
Вариант первый, хороший:
Находим вызовы общих модулей в чужом отчете, из которых получаются нужные нам данные и вызываем их. Если нам повезло со структурой - всё хорошо.
Вариант второй, тоже хороший:
Пишем что-то вроде этого:
ЧужойОтчет = Отчеты.ЧужойОтчет.Создать();
ЧужойОтчет.ДатаНач = НачалоМесяца(ДатаОтчета);
ЧужойОтчет.ДатаКон = КонецДня(ДатаОтчета);
ЧужойОтчет.Подразделение = Подразделение;
ЧужойОтчет.ГрафикРаботы = ГрафикРаботы;
ТабличныйДокумент = Новый ТабличныйДокумент;
ЧужойОтчет.СформироватьОтчет(ТабличныйДокумент);
- всё, табличный документ получили, теперь можем наковырять из него данных либо вывести весь отчет в свой (бывает нужно сделать как раз это)
Вариант третий, плохой (зато часто используемый):
Копируем в свой отчет код из чужого отчета, исправляем, чтобы работало и получаем необходимые данные. Естественно, когда меняется чужой отчет, данные начинают расходиться.
Почему используется третий вариант, когда есть второй?
Во-первых, когда чужой отчет формирует не совсем те данные, которые нужны либо слишком много данных. Естественно, тут другими вариантами не обойтись.
Во-вторых, когда в чужом отчете не содержится средств для его программного формирования (а ведь как хорошо, когда в каждом моделе отчета есть экспортные функции СформироватьДанные() и СформироватьОтчет()!)
И вот этот второй случай можно победить четвертым вариантом.
Вариант четвертый, инновационный:
Мне пришлось воспользоваться этим вариантом по следующим причинам:
1. Конфигурация недоступна для изменения
2. Чужой отчет формируется в обработчике нажатия на кнопку (то есть функция модуля формы без экспорта)
3. Использоваться отчет будет в неизвестном файловом окружении на другом узле РИБ.
4. Формирование отчета слишком сложное для того чтобы тащить код к себе в отчет
Итак:
1. Сохраняем отчет как внешний.
2. Добавляем к нужной функции экспорт (ну или меняем что-то еще)
3. Загружаем чужой отчет в свой как макет (тип: ДвоичныеДанные)
4. В свой отчет вставляем следующий код:
Макет = ПолучитьМакет("ЧужойОтчет1");
Макет.Записать(КаталогВременныхФайлов()+"ЧужойОтчет1.erf");
ЧужойОтчет = ВнешниеОтчеты.Создать(КаталогВременныхФайлов()+"ЧужойОтчет1.erf");
ФормаОтчета = ЧужойОтчет.ПолучитьФорму("Форма");
ФормаОтчета.НачПериода = НачалоМесяца(ДатаОтчета);
ФормаОтчета.КонПериода = КонецДня(ДатаОтчета);
ФормаОтчета.Подразделение = Подразделение;
ФормаОтчета.КнопкаВыполнитьНажатие(0);
ТабличныйДокумент = ФормаОтчета.ЭлементыФормы.ПолеТабличногоДокумента1;
Вот, собственно, и всё. Всем спасибо за внимание.