Имя: Пароль:
1C
1С v8
Выгрузка в Excel из Таблицы
0 Alak92
 
28.07.16
10:01
Добрый день, хотелось бы узнать где не так делаю. Прописал чтобы у меня выводилась таблица с номенклатурой, теперь не могу понять как ее выгрузить.
//Заполнение Таблицы Значений
&НаКлиенте
Процедура ЗаполнениеФормы(Команда)
    ЗаполнениеФормыНаСервере ();    
КонецПроцедуры
&НаСервере
Процедура ЗаполнениеФормыНаСервере()
    
    //Задаем запрос
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИ,
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура.ВидНоменклатуры КАК ВидН,
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура.Код КАК Код,
    |    ВЫБОР
    |        КОГДА ЦеныНоменклатурыСрезПоследних.Упаковка.Ссылка ЕСТЬ NULL
    |            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    |        ИНАЧЕ ЦеныНоменклатурыСрезПоследних.Цена * ЦеныНоменклатурыСрезПоследних.Упаковка.Числитель / ЦеныНоменклатурыСрезПоследних.Упаковка.Знаменатель
    |    КОНЕЦ КАК Цена,
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура.ВидНоменклатуры.ЭтоГруппа КАК ГруппаН,
    |    ТоварыНаСкладах.Номенклатура.Ссылка КАК Номенклатура,
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура.СтавкаНДС.Ссылка КАК СтавкаНДС,
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура.ТипНоменклатуры.Ссылка КАК ТипН
    |ИЗ
    |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
    |        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
    |        ПО ЦеныНоменклатурыСрезПоследних.Номенклатура.Ссылка = ТоварыНаСкладах.Номенклатура.Ссылка
    |ГДЕ
    |    ЦеныНоменклатурыСрезПоследних.Регистратор.Дата МЕЖДУ &ДатаСКакого И &ДатаПоКакое
    |    И ТоварыНаСкладах.Склад.Ссылка = &Склад";
    
    //Установка параметров для задаемого нами запроса
    Запрос.УстановитьПараметр("Склад", Склад);
    Запрос.УстановитьПараметр("ДатаСКакого", ДатаСКакого);
    Запрос.УстановитьПараметр("ДатаПоКакое", ДатаПоКакое);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    //Программно создаем таблицу
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Номенклатура");
    ТЗ.Колонки.Добавить("ЕдиницаИзмерения");
    ТЗ.Колонки.Добавить("ВидНоменклатуры");
    ТЗ.Колонки.Добавить("Код");
    ТЗ.Колонки.Добавить("Цена");
    ТЗ.Колонки.Добавить("СтавкаНДС");
    ТЗ.Колонки.Добавить("ТипНоменклатуры");
    
    //Задаем таблице значения по запросу
    Пока Выборка.Следующий() Цикл
        НоваяСтрока = ТЗ.Добавить();
        НоваяСтрока.ЕдиницаИзмерения = Выборка.ЕдиницаИ;
        НоваяСтрока.Номенклатура = Выборка.Номенклатура;
        НоваяСтрока.ВидНоменклатуры = Выборка.ВидН;
        НоваяСтрока.Код = Выборка.Код;
        НоваяСтрока.Цена = Выборка.Цена;
        НоваяСтрока.СтавкаНДС = Выборка.СтавкаНДС;
        НоваяСтрока.ТипНоменклатуры = Выборка.ТипН;
    КонецЦикла;
    
    ТаблицаЗначений.Загрузить(ТЗ);
        
КонецПроцедуры

// Выгрузка в Exсel    
&НаКлиенте
Процедура ВыгрузкаВЕксель (Команда)
    ВыгрузкаФормыВЕксель(ТаблицаЗначений);
КонецПроцедуры
&НаСервере
Процедура ВыгрузкаФормыВЕксель(ТаблицаЗначений)
    
ТЗ = ТаблицаЗначений;
    
Попытка Эксель = Новый COMОбъект ("Excel.Application");
Исключение Сообщить (ОписаниеОшибки());
    Возврат;
КонецПопытки;

Книга = Эксель.WorkBooks.Add();
Лист = Книга.WorkSheets (1);

i = 1;

Для Каждого Стр из ТЗ Цикл
Лист.Cells (i,1).Value = Стр.Номенклатура;
Лист.Cells (i,2).Value = Стр.Код;
Лист.Cells (i,4).Value = Стр.ВидНоменклатуры;
Лист.Cells (i,7).Value = Стр.ЕдиницаИзмерения;
Лист.Cells (i,16).Value = Стр.ТипНоменклатуры;
Лист.Cells (i,17).Value = Стр.Цена;
Лист.Cells (i,18).Value = Стр.СтавкаНДС;
КонецЦикла;

Попытка Книга.SaveAs ("C:\Номенклатура.xls");
    Исключение
Сообщить (ОписаниеОшибки()+"Файл не сохранён!");    
КонецПопытки;
   Эксель.Application.Quit();     
КонецПроцедуры
1 Alak92
 
28.07.16
10:30
Все это делалось в 1с УТ 11.2 там управляемые формы.
2 Ёпрст
 
гуру
28.07.16
10:34
проще было бы табличный документ записать в xls, чем пользовать Excel.Application
3 b_ru
 
28.07.16
10:36
Она у тебя и выгружается. На диск C: как ты и хотел.
4 Alak92
 
28.07.16
10:38
Да, выгружается. только пустой файл выгружается
5 lodger
 
28.07.16
10:39
голосую за (2). сделайте табдок, набейте данными и выполняйте записать("имяфайла", ТипФайлаТабличногоДокумента.XLSX)
6 b_ru
 
28.07.16
10:40
(4) i = i + 1;
не забыл часом?
7 Alak92
 
28.07.16
10:48
&НаКлиенте
Процедура ВыгрузкаВЭксель (Команда)
    ВыгрузкаФормыВЭксель(ТаблицаЗначений);
КонецПроцедуры
&НаСервере
Процедура ВыгрузкаФормыВЭксель(ТаблицаЗначений)
    
ТД = Новый ТабличныйДокумент;

    КолонокВсего = ТаблицаЗначений.Колонки.Количество();
    Для Колонка = 1 По КолонокВсего Цикл
        ТД.Область(1, Колонка).Текст = ТаблицаЗначений.Колонки[Колонка - 1].Заголовок;
    КонецЦикла;
    Строка = 1;
    Для Каждого ТаблицаСтрока Из ТаблицаЗначений Цикл
        Строка = Строка + 1;
        Для Колонка = 1 По КолонокВсего Цикл
            ТД.Область(Строка, Колонка).Текст = ТаблицаСтрока.Получить(Колонка - 1);
        КонецЦикла;
    КонецЦикла;
    ТД.Записать("Номенклатура", ТипФайлаТабличногоДокумента.XLS);
    
КонецПроцедуры
Так должно быть в ТД. (6) точно про него и забыл.
8 Alak92
 
28.07.16
10:50
Просто не опытный, впервые вообще сталкиваюсь с понятием написать свой код и сделать обработку.
9 Nuobu
 
28.07.16
10:50
(7) Смотри, как за шесть постов гуглить научился!
10 b_ru
 
28.07.16
10:55
(7) А зачем тебе промежуточная таблица значений? Обычно сразу же в табличный документ данные сгружают
И для табличного документа можно использовать макет. Погугли как вообще в 1С делают отчеты (без СКД в твоем случае думаю будет проще).
Например знаменитый 1Совский курс "введение в конфигурирование"
11 Alak92
 
28.07.16
10:55
Гугл за меня код не напишет и результата не даст. К сожалению через ТД не выходит, ошибку выдает "Поле объекта не обнаружено (Колонки)"
12 Nuobu
 
28.07.16
10:57
(11) Код-то ты с гугла скопировал? А?
Где ты взял переменную "ТаблицаЗначений" из

&НаКлиенте
Процедура ВыгрузкаВЕксель (Команда)
    ВыгрузкаФормыВЕксель(ТаблицаЗначений);
КонецПроцедуры
??

Она на сервере хранится?
13 Alak92
 
28.07.16
10:58
Напрямую это конечно проще и быстрее, но надо чтобы была промежуточная таблица.

Код частично из Гугла. Переменная Находится выше. и Конец процедуры есть, просто не скопировался.
14 Alak92
 
28.07.16
10:59
//Заполнение Таблицы Значений
&НаКлиенте
Процедура ЗаполнениеФормы(Команда)
    ЗаполнениеФормыНаСервере ();    
КонецПроцедуры
&НаСервере
Процедура ЗаполнениеФормыНаСервере()
    
    //Задаем запрос
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИ,
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура.ВидНоменклатуры КАК ВидН,
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура.Код КАК Код,
    |    ВЫБОР
    |        КОГДА ЦеныНоменклатурыСрезПоследних.Упаковка.Ссылка ЕСТЬ NULL
    |            ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
    |        ИНАЧЕ ЦеныНоменклатурыСрезПоследних.Цена * ЦеныНоменклатурыСрезПоследних.Упаковка.Числитель / ЦеныНоменклатурыСрезПоследних.Упаковка.Знаменатель
    |    КОНЕЦ КАК Цена,
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура.ВидНоменклатуры.ЭтоГруппа КАК ГруппаН,
    |    ТоварыНаСкладах.Номенклатура.Ссылка КАК Номенклатура,
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура.СтавкаНДС.Ссылка КАК СтавкаНДС,
    |    ЦеныНоменклатурыСрезПоследних.Номенклатура.ТипНоменклатуры.Ссылка КАК ТипН
    |ИЗ
    |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
    |        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
    |        ПО ЦеныНоменклатурыСрезПоследних.Номенклатура.Ссылка = ТоварыНаСкладах.Номенклатура.Ссылка
    |ГДЕ
    |    ЦеныНоменклатурыСрезПоследних.Регистратор.Дата МЕЖДУ &ДатаСКакого И &ДатаПоКакое
    |    И ТоварыНаСкладах.Склад.Ссылка = &Склад";
    
    //Установка параметров для задаемого нами запроса
    Запрос.УстановитьПараметр("Склад", Склад);
    Запрос.УстановитьПараметр("ДатаСКакого", ДатаСКакого);
    Запрос.УстановитьПараметр("ДатаПоКакое", ДатаПоКакое);
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    //Программно создаем таблицу
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Номенклатура");
    ТЗ.Колонки.Добавить("ЕдиницаИзмерения");
    ТЗ.Колонки.Добавить("ВидНоменклатуры");
    ТЗ.Колонки.Добавить("Код");
    ТЗ.Колонки.Добавить("Цена");
    ТЗ.Колонки.Добавить("СтавкаНДС");
    ТЗ.Колонки.Добавить("ТипНоменклатуры");
    
    //Задаем таблице значения по запросу
    Пока Выборка.Следующий() Цикл
        НоваяСтрока = ТЗ.Добавить();
        НоваяСтрока.ЕдиницаИзмерения = Выборка.ЕдиницаИ;
        НоваяСтрока.Номенклатура = Выборка.Номенклатура;
        НоваяСтрока.ВидНоменклатуры = Выборка.ВидН;
        НоваяСтрока.Код = Выборка.Код;
        НоваяСтрока.Цена = Выборка.Цена;
        НоваяСтрока.СтавкаНДС = Выборка.СтавкаНДС;
        НоваяСтрока.ТипНоменклатуры = Выборка.ТипН;
    КонецЦикла;
    
    ТаблицаЗначений.Загрузить(ТЗ);
        
КонецПроцедуры

// Выгрузка в Exсel    
&НаКлиенте
Процедура ВыгрузкаВЭксель (Команда)
    ВыгрузкаФормыВЭксель(ТаблицаЗначений);
КонецПроцедуры
&НаСервере
Процедура ВыгрузкаФормыВЭксель(ТаблицаЗначений)
    
ТД = Новый ТабличныйДокумент;

    КолонокВсего = ТаблицаЗначений.Колонки.Количество();
    Для Колонка = 1 По КолонокВсего Цикл
        ТД.Область(1, Колонка).Текст = ТаблицаЗначений.Колонки[Колонка - 1].Заголовок;
    КонецЦикла;
    Строка = 1;
    Для Каждого ТаблицаСтрока Из ТаблицаЗначений Цикл
        Строка = Строка + 1;
        Для Колонка = 1 По КолонокВсего Цикл
            ТД.Область(Строка, Колонка).Текст = ТаблицаСтрока.Получить(Колонка - 1);
        КонецЦикла;
    КонецЦикла;
    ТД.Записать("Номенклатура", ТипФайлаТабличногоДокумента.XLS);
    
КонецПроцедуры
15 Nuobu
 
28.07.16
11:00
(14) Покажи строчку, где эта переменная появляется в первый раз в программе. Скорее всего строчка будет такой:

&НаСервере
Перем ТаблицаЗначений;

Вот покажи, пожалуйста, эту строчку.
16 Alak92
 
28.07.16
11:05
(15) Такой строки нету. У меня и возникли с ошибками в коде. Как мне обратиться к созданной таблице с данными ? Подскажите пожалуйста. Прощу прощения за не грамотность моего написания кода.
17 Nuobu
 
28.07.16
11:21
(16) Тогда покажи, откуда в функции

&НаКлиенте
Процедура ВыгрузкаВЕксель (Команда)
    ВыгрузкаФормыВЕксель(ТаблицаЗначений);
КонецПроцедуры

взялась "ТаблицаЗначений"?
18 Alak92
 
28.07.16
11:25
(17) Хотел таким образом из предыдущей Процедуры, якобы вытащить данные по Таблице которую создал.
19 Nuobu
 
28.07.16
11:34
(18) Её нужно где-то хранить. Она хранится на форме?
20 Alak92
 
28.07.16
11:35
(19) Да хранится в форме как реквизит под одноименным типом
21 Nuobu
 
28.07.16
11:38
(20) Тогда должно работать. Какую ошибку выдаёт?
22 b_ru
 
28.07.16
11:48
В реквизит формы нельзя упихать таблицу значений.
А табличный документ можно
23 Alak92
 
28.07.16
11:52
(21) КолонокВсего = ТаблицаЗначений.Колонки.Количество(); ссылается на это. То что колонок нету. Он их не может вытянуть из прошлой процедуры. Как мне вытянуть ?
24 Alak92
 
28.07.16
11:57
(22) то есть ? можно по конкретнее
25 Alak92
 
28.07.16
12:38
Тема все еще актуально
26 Alak92
 
28.07.16
12:39
Блин, 7 день в коде этом и уже окончания начал писать иначе )
27 VladZ
 
28.07.16
12:46
(0) А ты вообще кто? Прог? Админ? Или "мимо проходил, попросили помочь"?
28 Alak92
 
28.07.16
13:01
(27) Вообще для себя
29 Alak92
 
29.07.16
07:11
Нашел проблему. Дело в том что переменная не вызывалась, так как находилась в процедуре. Весь код из процедуры скопировал в функцию и сделал возврат переменной. Все заработало. Спасибо всем.
30 Горогуля
 
29.07.16
07:13
а что такое вызов переменной?
31 Alak92
 
29.07.16
07:17
(30) Из процедуры "ЗаполнениеФормыНаСервере" не мог вызвать уже переменную с значениями, переменная была "ТаблицаЗначений". Не мог вызвать ее так как Процедура закрытая команда, в отличие от функции.
32 Горогуля
 
29.07.16
07:19
вот опять какие-то переменные вызываются. это как вообще?
33 Горогуля
 
29.07.16
07:20
и что такое закрытая команда? мы сейчас по-русским разговариваем?
34 Alak92
 
29.07.16
07:26
(33) По русски. По крайне мере в моем понимании о том как всю картину вижу. В переменную сохраняются значения, и эти значения мне нужно было выгрузить в Excel.
35 Alak92
 
29.07.16
07:29
(32) И к чему эти сарказмические вопросы ? Если видишь что не верно сказал или растолковал не верно, скажи об этом, а не выуживай.
36 Горогуля
 
29.07.16
07:30
(35) скучно, развлекаюсь как могу. а выуживать прекращу, как только узнаю, что это такое. что это такое?
37 Alak92
 
29.07.16
07:33
(36) Купи Слона
38 Мимохожий Однако
 
29.07.16
07:51
ОФФ: "Новенькие такие обидчивые"©
39 Горогуля
 
29.07.16
07:54
>сарказмические
тут одно из двух. или саркастические или саркосмические
40 Alak92
 
29.07.16
08:00
(38) (39) Обижаться не на что, то что вы чешите своё самолюбие от меня не убудет.
41 Горогуля
 
29.07.16
08:02
тешим, а не чешем
42 Alak92
 
29.07.16
08:03
(41) нет, именно чешите. Не буду говорить именно где
43 Горогуля
 
29.07.16
08:05
однако, придётся повториться

— Легкоступов,… ты знаешь, какая у тебя фамилия? Легкоступов, то есть, лёгкий, можно сказать, воздушный… Ты чё написал?! Тельняшка через букву «и», шинель через букву «е», ботинки вообще!.. Ты чего, Легкоступов?! Ты слушай меня, Легкоступов. В русском языке есть слова, их там много. Когда их составляешь вместе, получается предложение, где есть сказуемое, подлежащее и прочая светотень. И всё это – великий русский язык, Легкоступов. Ты меня понял?!

— Так точно, товарищ командир!

— Так вот, у нас великий русский язык! В нём переставь местоимение, сказуемое и подлежащее, и появится интонация!: «Наша Маша горько плачет.», или «Плачет наша Маша горько». Ты понимаешь?!, это ж поэзия!, это ж былины, мамкина норка!!.. А есть вообще предложения в одно слово: «Моросит», «Вечереет», «Смеркается»… Ты чувствуешь?

— Так точно, товарищ командир!

— Ни хрена ты не чувствуешь! Когда я читаю, что ты написал, я чешусь в самых нескромных местах! Тут же член можно сломать пока до конца абзаца доберёшься ! Кто тебя учил?

— В школе.

— Покажи мне, и я разорву его, как тузик грелку.

— Я же говорю – в школе.

— А я что, за границей, что ли учился, Легкоступов?!

— Если б мне в школе так!.. доходчиво!.. Я б…

— Вольно…
(с) 72 метра
44 Alak92
 
29.07.16
08:14
(43) О, да. Люблю таких людей. Вас хлебом не корми, чтобы попытаться показать себя умнее, чем любой другой человек на форуме. Вам стоит время тратить более продуктивно, и да знаю что Вы уже скажите про мое время. Удачи
45 hhhh
 
29.07.16
08:23
(44) ну то есть ты хочешь сказать, что если ты выложил полнейший бред, за который руки надо обрубать по самые локти, то тебя за это надо здесь сильно уважать? И не малейшего сарказма?
46 Alak92
 
29.07.16
08:32
(45) а я просил об этом ? Если почитать выше, было написано что, - "Впервые пишу, неделю за кодом и мало что понимаю, прощу помощи". Сначала прочтите все пожалуйста, потом делайте выводы.
47 Горогуля
 
29.07.16
08:33
ладно, непрограммист взялся за чужую работу. но хотя б по-русски при этом можно разговаривать?
48 Alak92
 
29.07.16
08:35
(47) это не чужая работа. Всего лишь учусь, все писалось благодаря интернету.
49 Горогуля
 
29.07.16
08:36
(48) это чужая работа, ты не программист
50 Alak92
 
29.07.16
08:37
(49) За меня это никто не писал. Так или иначе.
51 Alak92
 
29.07.16
08:53
(45) По крайней мере, буду знать что криво написано. Буду учиться и уделять время этому больше. Критика, она всегда нужна. Спасибо. И тебе Горогуля, русский действительно надо лучше знать, прощу прощения.