Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Составление одного файла Exel из разных отчетов  (Прочитано 11738 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Vseslovur
Новенький

ru
Offline Offline

« : 24-07-2011 15:54 » 

Платформа 8.2

Конфа БП 2.0.25.5

Если не вдаваться в подробности, то нужен отчет по определенному дописанному регистру. При этом в отчете фигурируют разные промежутки времени (с15.09.10 по 15.10.10; с 15.10.10 по 15.12.10 ; с 15.12.10 по 15.02.11; с 15.02.11 по 15.06.11)

Пытаемся решить следующим образом:

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

Но вот как ни бейся второй отчет не пристыковывается к первому справа, а дописывается под ним(( голову сломал, не знаю как решить.



Все три шага реализуются нажатием на разные кнопки в форме отчета.


Шаг 1.

Код: (1C v8)
//Пишем первый отчет в файл

ТабДок = ЭлементыФормы.Результат;
 ТабДок.Записать("C:\temp\123",типфайлатабличногодокумента.mxl);

Шаг 2.

Код: (1C v8)
//Дописываем

ТабДок = ЭлементыФормы.Результат;

//Убираем столбец с контрагентами, так как он уже есть
 Область = ТабДок.Область("R4C1:R500C1");
 Смещать = ТипСмещенияТабличногоДокумента.ПоГоризонтали;
 ТабДок.УдалитьОбласть(Область, Смещать);



ТабДокСтар = Новый ТабличныйДокумент;
 ИмяФайла = "C:\temp\123";
 ТабДокСтар.Прочитать(ИмяФайла);
 ТабДокСтар.Присоединить(ТабДок);
ТабДокСтар.Записать(ИмяФайл,типфайлатабличногодокумента.mxl);

Шаг 3.

Код: (1C v8)
//Указываем куда все это сохранить и открываем

ТабДокФин = Новый ТабличныйДокумент;
 ТабДокСтар = Новый ТабличныйДокумент;
 ИмяФайла = "C:\temp\123";
 ТабДокСтар.Прочитать(ИмяФайла);
 ИмяФайла2 = ПолучитьИмяФайлаExcel(); //Эта функция работает нормально, здесь ее код не привожу
 ТабДокФин.Записать(ИмяФайла2,типфайлатабличногодокумента.xls);
 ЗапуститьПриложение(ИмяФайла2);
« Последнее редактирование: 06-08-2011 07:04 от RXL » Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 25-07-2011 12:57 » 

"пристыковывается" - это присодиняется справа?
Попробуй при этой операции добиться того, чтобы области у тебя были одной высоты, т.е. определи максимум строк отчета.
Кроме того попробуй писать области в новый документ.
В итоге должно быть что-то вроде:
Код: (1C v8)
ТабДок = Новый ТабличныйДокумент;

ТабДокРезультат = ЭлементыФормы.Результат;
Область = ТабДокРезультат.Область("R4C1:R500C1");

ТабДокСтар = Новый ТабличныйДокумент;
ИмяФайла = "C:\temp\123";
ТабДокСтар.Прочитать(ИмяФайла);
ОбластьСтар = ТабДокСтар.Область("R4C1:R500C1");

ТабДок.Вывести(ОбластьСтар)
ТабДок.Присоединить(Область);
ТабДок.Записать(ИмяФайл, типфайлатабличногодокумента.mxl);
Записан
Vseslovur
Новенький

ru
Offline Offline

« Ответ #2 : 25-07-2011 19:02 » 

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

Но точное число устанавливать нельзя, так как могут отобрать только по группе контрагентов, а могут по всем..
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 25-07-2011 20:24 » 

Главное - чтобы ты читал области одной высоты из твоих таблиц, т.е. возможно Присоединить() неверное работает с областями разной высоты.
Кроме того - возможно проблема в отм, что ты пытаешься присоединить в существующий файл - попробуй изучить мой код и сделать выводы.
То, что одинаковый отбор в отчетах еще не означает одинаковое количество строк результата: например за выбранный период у контрагента еще могло не быть оборотов и в отчет он не попадет (конечно - это зависит еще от отчета: можно написать отчет так, что попадет с нулевыми данными)
Записан
Vseslovur
Новенький

ru
Offline Offline

« Ответ #4 : 26-07-2011 05:17 » 

Несоответствие типов((
Область = ТабДокРезультат.Область("R4C1:R500C1"); 
"Возвращаемое значение:

Тип: ОбластьЯчеекТабличногоДокумента; РисунокТабличногоДокумента."

ТабДок.Вывести(ОбластьСтар)
ТабДок.Присоединить(Область);

"Синтаксис:

Присоединить(<Таблица>, <Уровень>, <ИмяГруппы>, <Открыта>)
Параметры:

<Таблица> (обязательный)

Тип: ТабличныйДокумент; ПолеТабличногоДокумента. "

ТабДок.Вывести то же самое...



Но смысл понял, спасибо. сейчас буду пробовать еще...

Добавлено через 1 день, 13 часов, 10 минут и 15 секунд:
Можно по-подробнее, как сделать так, что бы попал контрагент с нулевыми данными?
С остальным вроде разобрался, как будет готовый результат, выложу.
« Последнее редактирование: 27-07-2011 18:28 от Vseslovur » Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 27-07-2011 18:36 » 

Два запроса (один по контрагентам, второй по данным отчета) объединить с использованием СОЕДИНЕНИЕ (если запрос по контрагентам первый - то ЛЕВОЕ СОЕДИНЕНИЕ) и для получения корректных результатов использовать ЕСТЬNULL():
Код:
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток, 0) КАК СуммаВзаиморасчетов
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК ВзаиморасчетыСКонтрагентамиОстатки
| ПО ВзаиморасчетыСКонтрагентамиОстатки.Контрагент = Контрагенты.Ссылка
|ГДЕ
| Контрагенты.Ссылка В ИЕРАРХИИ(&ГруппаКонтрагентов)
| И ВзаиморасчетыСКонтрагентамиОстатки.Контрагент В ИЕРАРХИИ(&ГруппаКонтрагентов)"

P.S. Второе условие вроде не обязательно...
Записан
Vseslovur
Новенький

ru
Offline Offline

« Ответ #6 : 27-07-2011 18:39 » 

Два запроса (один по контрагентам, второй по данным отчета) объединить с использованием СОЕДИНЕНИЕ (если запрос по контрагентам первый - то ЛЕВОЕ СОЕДИНЕНИЕ) и для получения корректных результатов использовать ЕСТЬNULL():
Код:
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Контрагент,
| ЕСТЬNULL(ВзаиморасчетыСКонтрагентамиОстатки.СуммаВзаиморасчетовОстаток, 0) КАК СуммаВзаиморасчетов
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК ВзаиморасчетыСКонтрагентамиОстатки
| ПО ВзаиморасчетыСКонтрагентамиОстатки.Контрагент = Контрагенты.Ссылка
|ГДЕ
| Контрагенты.Ссылка В ИЕРАРХИИ(&ГруппаКонтрагентов)
| И ВзаиморасчетыСКонтрагентамиОстатки.Контрагент В ИЕРАРХИИ(&ГруппаКонтрагентов)"

P.S. Второе условие вроде не обязательно...

Огромное спасибо, буду пробовать)

Добавлено через 53 минуты и 50 секунд:
"Не задано значение параметра "ГруппаКонтрагентов""
Вроде поле ввода в форме сделал, данные - ГруппаКонтрагентов (из реквизитов формы), а все равно не задано(((
« Последнее редактирование: 27-07-2011 19:33 от Vseslovur » Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 27-07-2011 20:01 » new

Читать в синтакс-помощнике про параметры запроса и смотреть там пример для метода УстановитьПараметр()
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines