|
Сохранение табличной части в ексель программно. | ☑ | ||
---|---|---|---|---|
0
kasazanov
01.08.13
✎
14:26
|
Добрый день!
В документе есть табличная часть и есть кнопочка "сохранить". Подскажите пожалуйста синтаксис для того чтобы при нажатии на эту кнопку программа предложила выбрать директорию на жестком диске и записала туда эту табличную часть в формате ексель. Заранее спасибо! |
|||
1
Капитан О
01.08.13
✎
14:27
|
точный синтаксис не подскажу, но каждая инструкция должная завершаться символом ";"
|
|||
2
kasazanov
01.08.13
✎
14:28
|
(1) и правда кэп
|
|||
3
Широкий
01.08.13
✎
14:29
|
(1) +1
|
|||
4
kasazanov
01.08.13
✎
15:06
|
Ну хоть примерно.
|
|||
5
Has
01.08.13
✎
15:33
|
||||
6
kasazanov
01.08.13
✎
15:51
|
Режим = РежимДиалогаВыбораФайла.Сохранение;
Диалог = Новый ДиалогВыбораФайла(Режим); Диалог.Заголовок = "Выбор файла для сохранения"; Диалог.Фильтр = "Excel (*.xls)|*.xls"; Если Не Диалог.Выбрать() Тогда Возврат ; Иначе ИмяФайла= Диалог.ПолноеИмяФайла; КонецЕсли Как теперь мне сохранить в этот выбранный файл мою таблицу "ЭтотОбъект.Выгрузка" ? |
|||
7
kasazanov
01.08.13
✎
15:54
|
Почему то даже пустой файл не создается :(
|
|||
8
Капитан О
01.08.13
✎
15:59
|
(7) всё правильно, записи в файл нет, значит, файл не создаётся
|
|||
9
Капитан О
01.08.13
✎
16:00
|
(6) предлагаю вывести что-нибудь как-нибудь в ТабДок и записать его
|
|||
10
kasazanov
01.08.13
✎
16:56
|
Вообщем получил я ТабДок, а как мне дальше его записать на диск в файл?
ТабДок = моя таблица "Выгрузка" |
|||
11
Капитан О
01.08.13
✎
16:56
|
(10) ты не поверишь..
|
|||
12
kasazanov
01.08.13
✎
17:00
|
ТабДок.Записать(<ИмяФайла>, <ТипФайлаТаблицы>)
какие сюда параметры нужны? |
|||
13
Капитан О
01.08.13
✎
17:01
|
(12) <ИмяФайла>, <ТипФайлаТаблицы>
|
|||
14
kasazanov
01.08.13
✎
17:04
|
А по подробнее нельзя?
|
|||
15
Капитан О
01.08.13
✎
17:06
|
(14) ты ж откуда скопипастил? попобней, чем там, вряд ли выйдет
|
|||
16
kasazanov
01.08.13
✎
17:07
|
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("Макет"); облСтрока = Макет.ПолучитьОбласть("Строка"); Для каждого стр Из ЭтотОбъект.Выгрузка Цикл облСтрока.Параметры.Дата = стр.Дата; облСтрока.Параметры.Номер = стр.Номер; облСтрока.Параметры.КомпанияИНН = стр.КомпанияИНН; облСтрока.Параметры.КомпанияНазвание = стр.КомпанияНазвание; облСтрока.Параметры.СрокОплаты = стр.СрокОплаты; облСтрока.Параметры.Сумма = стр.Сумма; ТабДок.Вывести(облСтрока); КонецЦикла; ТабДок.Записать("D:\Клиентские базы\Scheta_postavschikov.xls","xls"); //ТабДок.Показать(); Сделал так,файл записался как надо, как теперь сделать так чтобы путь зашивался не на програмном уровне? чтобы файлик пользователь мог выбирать? |
|||
17
hhhh
01.08.13
✎
17:11
|
(16) из типовой не судьба выбрать? Например, возьми клиент-банк, там файл выбирается.
|
|||
18
sunson
01.08.13
✎
17:16
|
скрести первый кусок кода со вторым и будет тебе щастье
|
|||
19
Капитан О
01.08.13
✎
17:19
|
(18) будет только до тех пор, пока он не попытается открыть этот ексельный документ
|
|||
20
Капитан О
01.08.13
✎
17:19
|
(19) а или вру
|
|||
21
Infsams654
01.08.13
✎
17:24
|
(20) токо что было v8: Платформа 8.2. Криво сохраняет табличный документ в эксель.
|
|||
22
kasazanov
01.08.13
✎
17:25
|
(19) (20) сохраняется красиво но только в жестко заданную папку.
|
|||
23
Капитан О
01.08.13
✎
17:31
|
(22) плавно возвращаемся в (6)
|
|||
24
kasazanov
01.08.13
✎
17:44
|
Процедура КнопкаВыполнитьНажатие(Кнопка)
ТабДок = Новый ТабличныйДокумент; Макет = ПолучитьМакет("Макет"); облСтрока = Макет.ПолучитьОбласть("Строка"); Для каждого стр Из ЭтотОбъект.Выгрузка Цикл облСтрока.Параметры.Дата = Формат(стр.Дата, "ДЛФ=Д"); облСтрока.Параметры.Номер = стр.Номер; облСтрока.Параметры.КомпанияИНН = стр.КомпанияИНН; облСтрока.Параметры.КомпанияНазвание = стр.КомпанияНазвание; облСтрока.Параметры.СрокОплаты = Формат(стр.СрокОплаты, "ДЛФ=Д"); облСтрока.Параметры.Сумма = стр.Сумма; ТабДок.Вывести(облСтрока); КонецЦикла; Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытияФайла.Фильтр = "Файл Эксель(*.xls)|*.xls"; Если ДиалогОткрытияФайла.Выбрать() Тогда ПолеВвода1 = ДиалогОткрытияФайла.ПолноеИмяФайла; КонецЕсли; ИмяФайла = ЭтаФорма.ФайлВыгрузки; ТабДок.Записать(ИмяФайла,"xls"); //ТабДок.Показать(); КонецПроцедуры Процедура КоманднаяПанель1Заполнить(Кнопка) Если ЗначениеЗаполнено(ЭтотОбъект.ДатаНачала) И ЗначениеЗаполнено(ЭтотОбъект.ДатаОкончания) Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СчетНаОплатуПокупателю.Номер, | СчетНаОплатуПокупателю.Дата, | СчетНаОплатуПокупателю.Контрагент, | СчетНаОплатуПокупателю.Контрагент.ИНН КАК ИНН, | СчетНаОплатуПокупателю.ДоговорКонтрагента.СрокОплаты КАК СрокОплаты, | СчетНаОплатуПокупателю.СуммаДокумента, | СчетНаОплатуПокупателю.ДоговорКонтрагента |ИЗ | Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю |ГДЕ | СчетНаОплатуПокупателю.Дата >= &ДатаНачала | И СчетНаОплатуПокупателю.Дата <= &ДатаОкончания"; Запрос.УстановитьПараметр("ДатаНачала", ЭтотОбъект.ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", ЭтотОбъект.ДатаОкончания); РезультатЗапроса = Запрос.Выполнить().Выбрать(); ТекстВопроса = "Перед заполнением табличные части будут очищены. Заполнить?"; Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да,); Если Ответ <> КодВозвратаДиалога.Да Тогда Возврат; КонецЕсли; ЭтотОбъект.Выгрузка.Очистить(); Пока РезультатЗапроса.Следующий() Цикл ДобавитьЭлементТаблицы = ЭтотОбъект.Выгрузка.Добавить(); ДобавитьЭлементТаблицы.Дата = РезультатЗапроса.Дата; ДобавитьЭлементТаблицы.Номер = РезультатЗапроса.Номер; ДобавитьЭлементТаблицы.КомпанияНазвание = РезультатЗапроса.Контрагент; ДобавитьЭлементТаблицы.КомпанияИНН = РезультатЗапроса.ИНН; ДобавитьЭлементТаблицы.Сумма = РезультатЗапроса.СуммаДокумента; Если РезультатЗапроса.ДоговорКонтрагента.Наименование = "" Тогда Продолжить Иначе ДобавитьЭлементТаблицы.СрокОплаты = РезультатЗапроса.Дата + 60*60*24*РезультатЗапроса.СрокОплаты; КонецЕсли; КонецЦикла; Иначе ТекстВопроса = "Ошибка! Не заполнены поля: дата начала, дата окончания."; Вопрос(ТекстВопроса, РежимДиалогаВопрос.Ок, , КодВозвратаДиалога.Ок,); КонецЕсли; КонецПроцедуры Процедура ФайлВыгрузкиНачалоВыбора(Элемент, СтандартнаяОбработка) Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытияФайла.Фильтр = "Файл Эксель(*.xls)|*.xls"; Если ДиалогОткрытияФайла.Выбрать() Тогда ФайлВыгрузки = ДиалогОткрытияФайла.ПолноеИмяФайла; КонецЕсли; КонецПроцедуры вообщем все работает как надо но файл приходится два раза выбирать в поле ввода и при нажатии на кнопку не пойму почему .... |
|||
25
Капитан О
01.08.13
✎
17:46
|
(24) рассказать? ты дважды просишь юзера сохранить файл
|
|||
26
kasazanov
01.08.13
✎
17:46
|
Где это? в каком фрагменте кода?
|
|||
27
Капитан О
01.08.13
✎
17:46
|
+(25) ну и дважды интерактивно пытаешься это сделать
|
|||
28
kasazanov
01.08.13
✎
17:47
|
А, нашел.
|
|||
29
kasazanov
01.08.13
✎
17:47
|
О чудо! Оно работает!
|
|||
30
Капитан О
01.08.13
✎
17:48
|
Если РезультатЗапроса.ДоговорКонтрагента.Наименование = "" Тогда
Продолжить хлобысь по рукам! |
|||
31
Капитан О
01.08.13
✎
17:48
|
а ещё предупреждение имеется у платформы
|
|||
32
kasazanov
01.08.13
✎
17:49
|
(30) а как тут лучше сделать?
|
|||
33
kasazanov
01.08.13
✎
17:49
|
Вообщем вот итоговый вариант
Процедура КнопкаВыполнитьНажатие(Кнопка) ТабДок = Новый ТабличныйДокумент; Макет = ПолучитьМакет("Макет"); облСтрока = Макет.ПолучитьОбласть("Строка"); Для каждого стр Из ЭтотОбъект.Выгрузка Цикл облСтрока.Параметры.Дата = Формат(стр.Дата, "ДЛФ=Д"); облСтрока.Параметры.Номер = стр.Номер; облСтрока.Параметры.КомпанияИНН = стр.КомпанияИНН; облСтрока.Параметры.КомпанияНазвание = стр.КомпанияНазвание; облСтрока.Параметры.СрокОплаты = Формат(стр.СрокОплаты, "ДЛФ=Д"); облСтрока.Параметры.Сумма = стр.Сумма; ТабДок.Вывести(облСтрока); КонецЦикла; ИмяФайла = ЭтаФорма.ФайлВыгрузки; ТабДок.Записать(ИмяФайла,"xls"); //ТабДок.Показать(); КонецПроцедуры Процедура КоманднаяПанель1Заполнить(Кнопка) Если ЗначениеЗаполнено(ЭтотОбъект.ДатаНачала) И ЗначениеЗаполнено(ЭтотОбъект.ДатаОкончания) Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СчетНаОплатуПокупателю.Номер, | СчетНаОплатуПокупателю.Дата, | СчетНаОплатуПокупателю.Контрагент, | СчетНаОплатуПокупателю.Контрагент.ИНН КАК ИНН, | СчетНаОплатуПокупателю.ДоговорКонтрагента.СрокОплаты КАК СрокОплаты, | СчетНаОплатуПокупателю.СуммаДокумента, | СчетНаОплатуПокупателю.ДоговорКонтрагента |ИЗ | Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю |ГДЕ | СчетНаОплатуПокупателю.Дата >= &ДатаНачала | И СчетНаОплатуПокупателю.Дата <= &ДатаОкончания"; Запрос.УстановитьПараметр("ДатаНачала", ЭтотОбъект.ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", ЭтотОбъект.ДатаОкончания); РезультатЗапроса = Запрос.Выполнить().Выбрать(); ТекстВопроса = "Перед заполнением табличные части будут очищены. Заполнить?"; Ответ = Вопрос(ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да,); Если Ответ <> КодВозвратаДиалога.Да Тогда Возврат; КонецЕсли; ЭтотОбъект.Выгрузка.Очистить(); Пока РезультатЗапроса.Следующий() Цикл ДобавитьЭлементТаблицы = ЭтотОбъект.Выгрузка.Добавить(); ДобавитьЭлементТаблицы.Дата = РезультатЗапроса.Дата; ДобавитьЭлементТаблицы.Номер = РезультатЗапроса.Номер; ДобавитьЭлементТаблицы.КомпанияНазвание = РезультатЗапроса.Контрагент; ДобавитьЭлементТаблицы.КомпанияИНН = РезультатЗапроса.ИНН; ДобавитьЭлементТаблицы.Сумма = РезультатЗапроса.СуммаДокумента; Если РезультатЗапроса.ДоговорКонтрагента.Наименование = "" Тогда Продолжить Иначе ДобавитьЭлементТаблицы.СрокОплаты = РезультатЗапроса.Дата + 60*60*24*РезультатЗапроса.СрокОплаты; КонецЕсли; КонецЦикла; Иначе ТекстВопроса = "Ошибка! Не заполнены поля: дата начала, дата окончания."; Вопрос(ТекстВопроса, РежимДиалогаВопрос.Ок, , КодВозвратаДиалога.Ок,); КонецЕсли; КонецПроцедуры Процедура ФайлВыгрузкиНачалоВыбора(Элемент, СтандартнаяОбработка) Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытияФайла.Фильтр = "Файл Эксель(*.xls)|*.xls"; Если ДиалогОткрытияФайла.Выбрать() Тогда ФайлВыгрузки = ДиалогОткрытияФайла.ПолноеИмяФайла; КонецЕсли; КонецПроцедуры |
|||
34
Капитан О
01.08.13
✎
17:50
|
(32) запросом сразу вынуть только нужное
|
|||
35
Капитан О
01.08.13
✎
17:50
|
+(34) не ориентируясь на наименование
|
|||
36
kasazanov
01.08.13
✎
17:51
|
Складывать и умножать внутри запроса?
|
|||
37
sunson
01.08.13
✎
17:51
|
да и расчет срока оплаты тоже можно в запрос засунуть
|
|||
38
sunson
01.08.13
✎
17:51
|
и пустых контрагентов исключить из выборки, кстати почему они пустые?
|
|||
39
Капитан О
01.08.13
✎
17:51
|
(37) согласен. сейчас он будет даты с числами складывать. посмотрим..
|
|||
40
sunson
01.08.13
✎
17:52
|
и вообще вставить в цикл ЗаполнитьЗначенияСвойств()
|
|||
41
kasazanov
01.08.13
✎
17:53
|
пофиг пускай так будет, надоели эти буквы уже О_о
|
|||
42
sunson
01.08.13
✎
17:53
|
а при установке даты начала и даты окончания навеное следует применить функции НачалоДня() и КонецДня()
|
|||
43
sunson
01.08.13
✎
17:54
|
(41) вы не программист?
|
|||
44
kasazanov
01.08.13
✎
17:54
|
А запросом как то можно вытащить внутренний индефикатор объекта?
|
|||
45
kasazanov
01.08.13
✎
17:55
|
(43) начинающий :)
|
|||
46
kasazanov
01.08.13
✎
17:55
|
+(44) идентификатор
|
|||
47
Капитан О
01.08.13
✎
18:02
|
(44) на зачем? иногда можно
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |