Форум программистов, компьютерный форум, киберфорум
Наши страницы
1С: Собственные программы
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.90/30: Рейтинг темы: голосов - 30, средняя оценка - 4.90
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 360
1

Загрузка и выгрузка табличной части документа в Excel

30.03.2016, 11:25. Просмотров 5546. Ответов 57
Метки нет (Все метки)

Учусь.

Есть Документ в котором Табличные Части -> ПереченьТоваров с Реквизитами Товар Цена Количество Сумма.
Создано 2 документа.
Открываю один из них.
На форме добавлена кнопка Выгрузить в файл.
Модуль:
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
&НаКлиенте
Процедура Команда1(Команда)
    // Вставить содержимое обработчика.
    Передача();
КонецПроцедуры
 
&НаСервереБезКонтекста  
Процедура Передача()  
    ApplicationExcel= Новый COMОбъект("Excel.Application");  
    ApplicationExcel.Visible = Истина;  
    ApplicationExcel.Workbooks.Open ("E:\1Cлиенты.xlsx");
    Док=Документы.Оприходование;
    i=2;  
    //Сообщить( Док.ТекущийДокумент());
 
    
    КоличетсвоСтрок = ЭтотОбъект.ПереченьТоваров.Количество();
    Если КоличествоСтрок <> 0 Тогда
    Для каждого Строчка из ЭтотОбъект.ПереченьТоваров Цикл
        ApplicationExcel.Sheets(1).Cells(i, 1).Value=Строчка.Товар;
ApplicationExcel.Sheets(1).Cells(i, 2).Value=Строчка.Количество;
        i=i+1;
    КонецЦикла
    КонецЕсли
        
        //Пока Выборка.ПолучитьСтроку() > 0 Цикл    
        //ApplicationExcel.Sheets(1).Cells(i, 1).Value=Выборка.Товар; //тут пишет что нет такого реквизита
        
        //i=i+1;
    //КонецЦикла;
КонецПроцедуры
Не получается. В последней попытке, приведенной, я даже не могу открыть документ. {Переменная ЭтотДокумент не определена}. Подскажите, помогите, первый день в 1С8.3, прошу с кодом пояснением. Либо как обратиться к полям/реквизитам открытого пользователем документа. В закомментированном коде есть другая реализация, ошибку также указал.
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2016, 11:25
Ответы с готовыми решениями:

Значение строки табличной части получить в табличной части другого документа
Есть документ ПриходнаяНакладная (товар приходит от поставщика по его цене), с табличной частью...

Автоматическое заполнение табличной части документа из табличной части другого
Добрый день. Совсем недавно начал изучать 1С и пока не могу найти решения собственной задачи)...

Программное заполнение табличной части документа из табличной части справочника
Доброго! Ситуация, поставившая меня в тупик. Имеем 1с 8.2 УФ Имеем справочник &quot;Работ&quot; Имеем...

Из одного документа получить данные табличной части другого документа
Добрый день. Сразу оговорюсь 1С только начал изучать, поэтому просьба помидорами не закидывать. ...

Как из одного документа перенести значение из табличной части в реквизит другого документа?
Только начинаю осваивать 1С, учебная задача. Есть два документа &quot;Индивидуальный заказ&quot; и...

57
GreenkA
Форумчанин
Эксперт 1С
3004 / 1928 / 520
Регистрация: 25.06.2009
Сообщений: 6,817
30.03.2016, 11:34 2
vino0s, когда вы прописываете "БезКонтекста" - у вас больше нет возможности в этой процедуре/функции обращаться к реквизитам формы, объекта. Т.е. пропишите выполнение просто &НаСервере.
И вместо ЭтотОбъект - обращайтесь через Объект.
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 360
30.03.2016, 12:24  [ТС] 3
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
&НаСервере
Процедура Передача()  
    ApplicationExcel= Новый COMОбъект("Excel.Application");  
    ApplicationExcel.Visible = Истина;  
    ApplicationExcel.Workbooks.Open ("E:\1Cлиенты.xlsx");
    Док=Документы.Оприходование;
    ТЧ=Док.ПереченьТоваров;
    i=2;  
    
    КоличетсвоСтрок = ТЧ.Количество(); //КоличествоСтрок Опечатка  исправил КоличетсвоСтрок на КоличествоСтрок
    Если КоличествоСтрок <> 0 Тогда
    Для каждого Строчка из Объект.ПереченьТоваров Цикл
        ApplicationExcel.Sheets(1).Cells(i, 1).Value=Строчка.Товар;
ApplicationExcel.Sheets(1).Cells(i, 2).Value=Строчка.Цена;
        i=i+1;
    КонецЦикла
    КонецЕсли
        
        //Пока Выборка.ПолучитьСтроку() > 0 Цикл    
        //ApplicationExcel.Sheets(1).Cells(i, 1).Value=Выборка.Товар;
        
        //i=i+1;
    //КонецЦикла;
КонецПроцедуры
{{Документ.Оприходование.Форма.ФормаДокумента.Форма(32,7)}: Переменная не определена (КоличествоСтрок)
} {Поле объекта не обнаружено ПереченьТоваров}
0
Dethmontt
Модератор
Эксперт 1С
2741 / 2498 / 443
Регистрация: 10.03.2011
Сообщений: 9,104
Записей в блоге: 1
Завершенные тесты: 1
30.03.2016, 12:30 4
vino0s, начать с букваря!!!

КоличетсвоСтрок <> КоличествоСтрок
0
30.03.2016, 12:30
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 360
30.03.2016, 12:33  [ТС] 5
Цитата Сообщение от Dethmontt Посмотреть сообщение
КоличетсвоСтрок <> КоличествоСтрок
Я исправил, в комменте указал что исправил. Теперь ошибка {Поле объекта не обнаружено ПереченьТоваров}
Вернулся в "исходную позицию" после разных попыток.
1C
1
2
3
4
5
//Пока Выборка.ПолучитьСтроку() > 0 Цикл    
        //ApplicationExcel.Sheets(1).Cells(i, 1).Value=Выборка.Товар;
        
        //i=i+1;
    //КонецЦикла;
тут была та же ошибка.
0
Dethmontt
Модератор
Эксперт 1С
2741 / 2498 / 443
Регистрация: 10.03.2011
Сообщений: 9,104
Записей в блоге: 1
Завершенные тесты: 1
30.03.2016, 12:39 6
Цитата Сообщение от vino0s Посмотреть сообщение
Объект.ПереченьТоваров
Значит у переменной "Объект" нет свойства "ПереченьТоваров"
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 360
30.03.2016, 13:55  [ТС] 7
Цитата Сообщение от Dethmontt Посмотреть сообщение
Значит у переменной "Объект" нет свойства "ПереченьТоваров"
Исправил на
1C
1
Для каждого Строчка из ТЧ Цикл
Та же ошибка, "почему" вопрос, а не что значит.

Добавлено через 1 час 8 минут
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
&НаКлиенте
Процедура Команда1(Команда)
    // Вставить содержимое обработчика.
    Передача();
КонецПроцедуры
 
&НаСервере
Процедура Передача()  
    ApplicationExcel= Новый COMОбъект("Excel.Application");  
    ApplicationExcel.Visible = Истина;  
    ApplicationExcel.Workbooks.Open ("E:\1Cлиенты.xlsx");
    Док=Документы.Оприходование;
    ТЧ=Док.ПереченьТоваров;
    i=2;  
    
    КоличествоСтрок = ТЧ.Количество();
    Сообщить (ТЧ);
    Если КоличествоСтрок <> 0 Тогда
    Для каждого Строчка из ТЧ Цикл
        ApplicationExcel.Sheets(1).Cells(i, 1).Value=Строчка.Товар;
        i=i+1;
    КонецЦикла
    КонецЕсли
        
        //Пока Выборка.ПолучитьСтроку() > 0 Цикл    
        //ApplicationExcel.Sheets(1).Cells(i, 1).Value=Выборка.Товар;
        
        //i=i+1;
    //КонецЦикла;
КонецПроцедуры
Есть Документ в котором Табличные Части -> ПереченьТоваров с Реквизитами Товар Цена Количество Сумма.
Ошибка: {Поле объекта не обнаружено ПереченьТоваров}
Подскажите как обратиться к реквизитам
0
Nenaviju1C
44 / 44 / 6
Регистрация: 17.03.2016
Сообщений: 122
30.03.2016, 14:47 8
1C
1
2
3
[quote="vino0s;8955020"]
[B]Док=Документы.Оприходование;[/B]
[B]ТЧ=Док.ПереченьТоваров;[/B][/quote]
Что такое "Док"? (см. библию 1С или синтаксис помощник) - ответ: "Док" - это результат выборки документов "Оприходование".

Цитата Сообщение от vino0s Посмотреть сообщение
Сообщить (ТЧ);
О чем ты собрался сообщать!?
Судя по коду "ТЧ" - это у тебя универсальная коллекция (ссылка на табличную часть документа "Оприходование").
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 360
30.03.2016, 14:54  [ТС] 9
Цитата Сообщение от Nenaviju1C Посмотреть сообщение
О чем ты собрался сообщать!?
Я просто хочу понять что происходит в этих переменных и почему поле объекта не обнаружено.

Добавлено через 34 секунды
Цитата Сообщение от Nenaviju1C Посмотреть сообщение
Что такое "Док"?
Это переменная
0
Nenaviju1C
44 / 44 / 6
Регистрация: 17.03.2016
Сообщений: 122
30.03.2016, 14:56 10
Цитата Сообщение от vino0s Посмотреть сообщение
Я просто хочу понять что происходит в этих переменных и почему поле объекта не обнаружено.
Сообщить тебе вернет тип значения.

А по доку понял как? ) Посмотрел синтаксис?
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 360
30.03.2016, 14:57  [ТС] 11
Я пишу исходя из логики "других" языков программирования. Задаю переменную Док в которой ХОЧУ! хранить активный(тот что сейчас открыт) документ. Затем создаю новую переменную в которой ХОЧУ! хранить табличную часть этого документа. Дальше прохожу по всем строкам табличной части этого документа и перебиваю данные в эксель. Но что то идет не так.
0
Nenaviju1C
44 / 44 / 6
Регистрация: 17.03.2016
Сообщений: 122
30.03.2016, 15:04 12
Цитата Сообщение от vino0s Посмотреть сообщение
Это переменная
Это тип значения "ДокументВыборка.Оприходование" !
Открой синтаксис!

Добавлено через 6 минут
Цитата Сообщение от vino0s Посмотреть сообщение
Я пишу исходя из логики "других" языков программирования
В любом другом языке тебе сначала (как собственно и тут) необходимо создать объект как экземпляр класса!

Цитата Сообщение от vino0s Посмотреть сообщение
Затем создаю новую переменную в которой ХОЧУ! хранить табличную часть этого документа
Ты будешь хранить ссылку на табличную часть объекта (в данном случае).
Цитата Сообщение от vino0s Посмотреть сообщение
Но что то идет не так
Систаксис открой

Пы.Сы.: так каких других языках?
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 360
30.03.2016, 15:19  [ТС] 13
Цитата Сообщение от Nenaviju1C Посмотреть сообщение
так каких других языках
js к примеру.
Еще раз ПРОШУ подсказать КАК Обратиться к РЕКВИЗИТАМ: К примеру вывести его в Сообщить. Про синтаксис - о чем вообще??? Я первый день изучаю 1С, ссылку или статью. Что не верного в объявлении "переменной"/константы/МестаХраненияЧегоЛибоЧтобыПотомВоспользоваться док?
0
GreenkA
Форумчанин
Эксперт 1С
3004 / 1928 / 520
Регистрация: 25.06.2009
Сообщений: 6,817
30.03.2016, 15:50 14
vino0s,
1C
1
2
3
4
5
6
7
8
9
10
11
    ТЧ = Объект.ПереченьТоваров;//я вам писала выше про Объект
    i=2;  
    
    КоличествоСтрок = ТЧ.Количество();
    
    Если КоличествоСтрок <> 0 Тогда
    Для каждого Строчка из ТЧ Цикл
        ApplicationExcel.Sheets(1).Cells(i, 1).Value=Строчка.Товар;
        i=i+1;
    КонецЦикла
    КонецЕсли
0
Nenaviju1C
44 / 44 / 6
Регистрация: 17.03.2016
Сообщений: 122
30.03.2016, 15:58 15
Кстати, ссори, что то я ступил ...
"Докмуенты.Оприходование" - это ты менеджеру обращаешься.
Т.е. Если для выборки документов:
1C
1
2
3
4
5
Док = Докмуенты.Оприходование;
Док.Выбрать();
Пока Док.Следующий() Цикл
       ТЧ = Док[ИдентификаторТабличнойЧасти];
КонецЦикла;
Если к конкретной ссылке:
1C
1
ТЧ = СсылкаНаДокументОприходование[ИдентификаторТабличнойЧасти];
Добавлено через 4 минуты
Выборку надо от менеджера производить
1C
1
НашаВыборка = Докмуенты.Оприходование.Выбрать();
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 360
30.03.2016, 16:32  [ТС] 16
GreenkO,
{Произошла исключительная ситуация 0x800a03ec}
Nenaviju1C
Ваша подсказка мне ни о чем не говорит, где я тут обращаюсь к реквизиту из табличной части???
Цитата Сообщение от Nenaviju1C Посмотреть сообщение
Док = Докмуенты.Оприходование;
Выборка=Док.Выбрать();
так я пробовал, после обращаюсь к реквизитам так:
1C
1
Выборка.ПереченьТоваров.Товар //ошибка что то про объект ПереченьТоваров
или так
1C
1
Выборка.Товар //ошибка что то про объект Товар
Добавлено через 2 минуты
Цитата Сообщение от Nenaviju1C Посмотреть сообщение
[ИдентификаторТабличнойЧасти];
И что с квадратными скобками происходит? Обращение к элементу массива/списка/группы? По номеру/названию/или как?
0
GreenkA
Форумчанин
Эксперт 1С
3004 / 1928 / 520
Регистрация: 25.06.2009
Сообщений: 6,817
30.03.2016, 16:36 17
vino0s, выложите вашу конфигурацию, что там за ошибка будем смотреть
0
Dethmontt
Модератор
Эксперт 1С
2741 / 2498 / 443
Регистрация: 10.03.2011
Сообщений: 9,104
Записей в блоге: 1
Завершенные тесты: 1
30.03.2016, 16:42 18
Цитата Сообщение от vino0s Посмотреть сообщение
Я пишу исходя из логики "других" языков программирования. Задаю переменную Док в которой ХОЧУ! хранить активный(тот что сейчас открыт) документ. Затем создаю новую переменную в которой ХОЧУ! хранить табличную часть этого документа.
Какого конкретно документа? Если у тебя их 1000? Где ты программе показал какого конкретно документа табличную часть в данный момент обрабатываешь?

Добавлено через 1 минуту
vino0s, какой контекст? Что за модуль?

От контекста зависит какие переменные уже есть в памяти а каких нет!
0
Nenaviju1C
44 / 44 / 6
Регистрация: 17.03.2016
Сообщений: 122
30.03.2016, 16:48 19
Небольшое отступление:
На сервере, в реальности, файла не будет - его туда сначала необходимо передать.
Цитата Сообщение от vino0s Посмотреть сообщение
Выборка.ПереченьТоваров.Товар
Не так, а так
1C
1
Выборка.ПереченьТоваров[ИдексСтроки].Товар
или так
1C
1
2
3
4
КоллекцияТЧ = Выборка.ПереченьТоваров;
Для Каждого СтрокаКоллекции Из КоллекцияТЧ Цикл
     //СтрокаКоллекции.Товар
КонецЦикла;
Если обращаемся из объекта (коллекция является табличной частью объекта)
1C
1
2
3
Для Каждого СтрокаКоллекции из Объект[Коллекция] Цикл
     // СтрокаКоллекции.Товар
КонецЦикла
Если обращаемся из объекта (коллекция является реквизитом)
1C
1
2
3
Для Каждого СтрокаКоллекции из ИдентификаторКоллекции Цикл
     // СтрокаКоллекции.Товар
КонецЦикла
Почитай еще клиент-серверную архитектуру - здесь есть особенности, а именно не все объекты можно сериализовать и данные моменты необходимо обходить.

Если "&НаСервере" - повторяем все как для объекта так и для реквизита
Если "&НаСервереБезКонтекста" - табличную часть необходимо сериализовать - как вариант через временное хранилище
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 360
30.03.2016, 16:58  [ТС] 20
Документ Оприходование:
Данные:
Реквизиты: Фирмы, Филиалы
Табличные части: ПереченьТоваров [Товар, Цена, Количество, Сумма]
Форма: Добавлена одна команда - Команда1
Добавлена одна Кнопка (для этой команды)
Модуль:
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
&НаКлиенте
Процедура ПереченьТоваровКоличествоПриИзменении(Элемент)
    СтрТабЧасти=Элементы.ПереченьТоваров.ТекущиеДанные;
    СтрТабЧасти.Сумма=СтрТабЧасти.Цена*СтрТабЧасти.Количество;
КонецПроцедуры
 
&НаКлиенте
Процедура ПереченьТоваровЦенаПриИзменении(Элемент)
    СтрТабЧасти=Элементы.ПереченьТоваров.ТекущиеДанные;
    СтрТабЧасти.Сумма=СтрТабЧасти.Цена*СтрТабЧасти.Количество;
КонецПроцедуры
 
&НаКлиенте
Процедура Команда1(Команда)
    // Вставить содержимое обработчика.
    Передача();
КонецПроцедуры
 
&НаСервере
Процедура Передача()  
    ApplicationExcel= Новый COMОбъект("Excel.Application");  
    ApplicationExcel.Visible = Истина;  
    ApplicationExcel.Workbooks.Open ("E:\1Cлиенты.xlsx");
    ТЧ=Объект.ПереченьТоваров;
    i=2;  
    
    КоличествоСтрок = ТЧ.Количество();
    //Сообщить (КоличествоСтрок);
    Если КоличествоСтрок <> 0 Тогда
    Для каждого Строчка из ТЧ Цикл
        ApplicationExcel.Sheets(1).Cells(i, 1).Value=Строчка.Товар;
        i=i+1;
    КонецЦикла
    КонецЕсли
        
        //Пока Выборка.ПолучитьСтроку() > 0 Цикл    
        //ApplicationExcel.Sheets(1).Cells(i, 1).Value=Выборка.Товар;
        
        //i=i+1;
    //КонецЦикла;
КонецПроцедуры
Сейчас ошибка {Произошла исключительная ситуация 0x800a03ec}
0
30.03.2016, 16:58
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2016, 16:58

Автоматическое заполнение табличной части документа при изменении реквизита этого документа
Здравствуйте. Делаю свою конфу на 1с 8.3.5. Добавил справочник &quot;Сотрудники&quot; и подчиненный ему...

Выгрузка табличной части в таблицу значений
Ситуация такая,в документе имеется табличная часть Подписки (см. скрин), в ней есть колонка...

Ошибка в табличной части документа
Приветствую Вас многоуважаемые форумчане:drink: После долгого отсутствия мне наконец-то дали...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.