Имя: Пароль:
1C
1С v8
Сохранение табличной части в ексель программно.
,
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
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) на зачем? иногда можно
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn