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

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

30.03.2016, 11:25. Просмотров 4168. Ответов 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)
Similar
Эксперт
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С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
30.03.2016, 18:50 41
Лучший ответ Сообщение было отмечено vino0s как решение

Решение

Не по теме:

Цитата Сообщение от vino0s Посмотреть сообщение
Вы же читать умеете говорите, топик не читали?
Вам помочь пытаются, а вы еще и грубите...



Добавлено через 7 минут
vino0s, почему у вас в коде прописан фиксированный путь к файлу?

1C
1
    ApplicationExcel.Workbooks.Open ("E:\1C\Клиенты.xlsx");
Может такого файла нет? Или проблемы с языком текста...

Добавлено через 12 минут
vino0s, все ясно, вы пытались в ячейку Excel записать значение ссылочного типа, лучше приводить значения к примитивным типам - Строка, Число...
1C
1
2
3
4
    Для каждого Строчка из ТЧ Цикл
        ApplicationExcel.Sheets(1).Cells(i, 1).Value = Строка(Строчка.Товар);
        i=i+1;
    КонецЦикла
1
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 353
30.03.2016, 20:49  [ТС] 42
С выгрузкой ошибка так и осталась, испробовал разные варианты, не понятно. С загрузкой использовал Ваш шаблон:
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
42
43
44
&НаКлиенте
Процедура Команда2(Команда)
    
    ДиалогФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогФайла.Фильтр = "Наш файл (*.xls, *.xlsx, *.csv)|*.xls; *.xlsx; *.csv";
    ДиалогФайла.МножественныйВыбор = Ложь;
    
    ОП = Новый ОписаниеОповещения("Загрузить", ЭтаФорма, Новый Структура);
    
    ДиалогФайла.Показать(ОП);
    
КонецПроцедуры
 
&НаКлиенте
Процедура Загрузить(РезультатВыбора, СтруктураДополнительныхПараметров) Экспорт
    
    Если РезультатВыбора = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Exl = Новый ComObject("Excel.Application");     
    Попытка
        Exl.Application.Workbooks.Open(РезультатВыбора[0]);
    Исключение
        мСообщение = Новый СообщениеПользователю();
        мСообщение.Текст = "что то пошло не так ...." + символы.ПС + ОписаниеОшибки();
        мСообщение.Сообщить();
        Возврат;
    КонецПопытки;
    
    // то что хочешь сделать с файлом
    i=4;
    
    Пока Exl.Sheets(1).Cells(i, 1).Value <> "" Цикл
        Строка = Объект.ПереченьТоваров.Добавить();
        Строка.Цена = Exl.Sheets(1).Cells(i, 10).Value;
        Строка.Количество = Exl.Sheets(1).Cells(i, 9).Value;
        Строка.Сумма = Exl.Sheets(1).Cells(i, 11).Value;
        i=i+1;
        // Обработка коллекции табличной части документа
        
    КонецЦикла;
    
КонецПроцедуры
Цикл получается бесконечным, как проверить ячейку Экселя на пустоту.?
0
Nenaviju1C
43 / 43 / 6
Регистрация: 17.03.2016
Сообщений: 117
30.03.2016, 21:20 43
На js вы не кодите! Это факт!
На сайте microsoft все есть.
подсказка:
1. Метод end()
2. UsedRange
3. SpecialCells
4. Есть еще способы. На вскидку не помню

Вообще ее даже искать можно через класс UsedRange : UsedRange.Find
А еще поюзай ActiveSheet - сразу все ясно станет.

Писал по памяти, т.ч. не пинайте особо
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 353
30.03.2016, 21:28  [ТС] 44
Почему всегда надо отвечать через задний проход? Спрашиваю как проверить на пустое, предлагает использовать специальные ячейки из Excel... Если бы я хотел узнать как мне узнать сколько строк в файле, я бы так и спросил. Я спрашиваю ТОЛЬКО по 1С, про Excel мне писать НЕ НУЖНО
0
Nenaviju1C
43 / 43 / 6
Регистрация: 17.03.2016
Сообщений: 117
30.03.2016, 21:43 45
Кстати вопрос на засыпку а чему равно значение ячейки (свойство Value)?
Явно не string, хотя можно привести значение к строке - в библиотеке этот метод есть.
Кодер js не может не знать этого!

Добавлено через 11 минут
Ты спросил как проверить ячейку excel на пустоту!
Я тебе и дал ответ. В 1с, как и в других языках ты работаешь с классами объекта к которому обращаешься.
В данном случае библиотека классов microsoft.
И рулить надо ее свойствами и методами!

А через задний проход - потому что с телефона пишу.
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 353
30.03.2016, 22:00  [ТС] 46
Цитата Сообщение от Nenaviju1C Посмотреть сообщение
Кстати вопрос на засыпку а чему равно значение ячейки (свойство Value)?
Тому что записано в этой ячейке, чаще строке. Та ячейка которую проверяю - строка. Спрашиваю о 1С что то на подобие:
1C
1
Пока Пустое(Exl.Sheets(1).Cells(i, 1).Value) <> 1 Цикл
Методы и работы в js с файлами эксель мне знакомы. Но если Вы видели первый пост:
Учусь. Первый день в 1С.
То будучи умным, нормально бы отвечали на вопросы, а не приводили не к чему не нужную документацию.
- Как пройти в библиотеку?
- Пройдите 3 квартала прямо, там поверните на лево, увидите булочную, спросите Максима, он Вам расскажет.
Это наглядный пример как вы помогаете.

Добавлено через 2 минуты
*если уж смотреть пример js+delphi, то переменную я могу проверить на пустоту как в js, так и в delphi... Так почему тоже самое нельзя в 1С? или вы просто этого не знаете и потому говорите о том, что считаете похожим на ответ?

Добавлено через 3 минуты
Цитата Сообщение от Nenaviju1C Посмотреть сообщение
Ты спросил как проверить ячейку excel на пустоту!
Я спросил это в ветке 1С, а не в ветке Эксель. Все что требуется, просто изменить или исправить одну строку с условием приведенного выше кода.

Добавлено через 1 минуту
Если в 1С нельзя проверить полученное значение какой-либо переменной на Пустое, можно тоже сказать.
0
GreenkA
Модератор
Эксперт 1С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
30.03.2016, 22:14 47
vino0s, посмотрите здесь очень хорошо расписан и Экспорт, и Импорт
https://helpf.pro/faq/view/1024.html

Добавлено через 1 минуту
универсальной проверкой на заполненность значений для всех типов является метод -
ЗначениеЗаполнено(Значение).

Добавлено через 1 минуту
Цитата Сообщение от vino0s Посмотреть сообщение
С выгрузкой ошибка так и осталась
Непонятно, почему осталась. Мой пример был как раз для вашего кода выгрузки. У меня лично после преобразования Ссылки в Строку ошибка исчезла.
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 353
30.03.2016, 22:24  [ТС] 48
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
&НаКлиенте
Процедура Команда1(Команда)
    // Вставить содержимое обработчика.
    Сохранить();
КонецПроцедуры
 
&НаСервере
Процедура Сохранить()  
    ApplicationExcel= Новый COMОбъект("Excel.Application");  
    ApplicationExcel.Visible = Истина;  
    ApplicationExcel.Workbooks.Open ("E:\1C\Клиенты.xlsx");
    ТЧ=Объект.ПереченьТоваров;
    i=4;  
    
    КоличествоСтрок = ТЧ.Количество();
    Если КоличествоСтрок <> 0 Тогда
    Для каждого Строчка из ТЧ Цикл
        ApplicationExcel.Sheets(1).Cells(i, 10).Value = Строчка.Цена;
        ApplicationExcel.Sheets(1).Cells(i, 9).Value = Строчка.Количество;
        ApplicationExcel.Sheets(1).Cells(i, 11).Value = Строчка.Сумма;
ApplicationExcel.Sheets(1).Cells(i, 1).Value = Строка(Строчка.Товар);
        i=i+1;
    КонецЦикла
    КонецЕсли;
    ApplicationExcel.Application.Quit();    
КонецПроцедуры
Добавлено через 2 минуты
Отблагодарил, обозначил "лучший" всем спасибо)
Остался вопрос не из темы, проверить на пустое значение в 1с, есть способы?

Добавлено через 26 секунд
Цитата Сообщение от GreenkO Посмотреть сообщение
ЗначениеЗаполнено(Значение).
Попробую
0
GreenkA
Модератор
Эксперт 1С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
30.03.2016, 22:25 49
vino0s, только для чисел проверяйте на 0.

Добавлено через 24 секунды
vino0s, я так понимаю, все работает? ) У меня этот код "взлетел" без проблем.
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 353
30.03.2016, 22:36  [ТС] 50
1C
1
2
3
4
5
6
7
8
Пока ЗначениеЗаполнено(Exl.Sheets(1).Cells(i,1)) Цикл
        Строка = Объект.ПереченьТоваров.Добавить();
        Строка.Цена = Exl.Sheets(1).Cells(i, 10).Value;
        Строка.Количество = Exl.Sheets(1).Cells(i, 9).Value;
        Строка.Сумма = Exl.Sheets(1).Cells(i, 11).Value;
        i=i+1;
        // Обработка коллекции табличной части документа
    КонецЦикла;
Не выходит из цикла.

Добавлено через 4 минуты
Ну и та же проблема в обратном направлении
1C
1
Строка.Товар = Exl.Sheets(1).Cells(i, 1).Value; //Ссылочный тип. Как тут быть?
Добавлено через 4 минуты
1C
1
2
3
4
5
6
7
8
9
10
11
12
// Установить значение в строке и колонке
        Если ТипЗнч(выборка[стр.НазваниеРеквизита])=Тип("Число") Тогда
        // Установить формат для типа Число
        Лист.Cells(СтрокаЛиста, Колонка).NumberFormat = "0,00";
        Лист.Cells(СтрокаЛиста, Колонка).Value =
          Формат(выборка[стр.НазваниеРеквизита],"ЧГ=0");
        иначе
          // Для всех других типов установим формат "Текстовый"
          Лист.Cells(СтрокаЛиста, Колонка).NumberFormat = "@";
          Лист.Cells(СтрокаЛиста, Колонка).Value =
            Строка(выборка[стр.НазваниеРеквизита]);
        КонецЕсли;
Это необходимо строго! выполнять? Изменение формата ячеек.
0
GreenkA
Модератор
Эксперт 1С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
30.03.2016, 22:40 51
1C
1
2
3
4
5
6
7
8
Пока ЗначениеЗаполнено(Exl.Sheets(1).Cells(i,1)) Цикл
Строка = Объект.ПереченьТоваров.Добавить();
Строка.Цена = Exl.Sheets(1).Cells(i, 10).Value;
Строка.Количество = Exl.Sheets(1).Cells(i, 9).Value;
Строка.Сумма = Exl.Sheets(1).Cells(i, 11).Value;
i=i+1;
// Обработка коллекции табличной части документа
КонецЦикла;
Это у вас загрузка из Эксель?
По той ссылке, что я скинула выше, посмотрите проверку на ПоследнююСтроку, ПоследнийСтолбец. И в цикле делайте условие по последней строке файла Эксель.

1C
1
Строка.Товар = Exl.Sheets(1).Cells(i, 1).Value; //Ссылочный тип. Как тут быть?
Здесь надо искать в справочнике по наименованию. Вам уже выше писали, что работать с Экселем лучше на клиенте. В случае выполнения процедуры на клиенте и поиске необходимого товара надо вызвать серверную функцию:

1C
1
2
3
4
5
6
Строка.Товар = НайтиТоварНаСервере(Exl.Sheets(1).Cells(i, 1).Value);
...
&НаСервереБезКонтекста
Функция НайтиТоварНаСервере(Наименование)
 Возврат Справочники.Товары.НайтиПоНаименованию(Наименование);
КонецФункции
Добавлено через 2 минуты
vino0s, про формат ячеек - как хотите. Просто при возможном чтении файла в будущем будет меньше проблем с преобразованием типов строка/число...
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 353
30.03.2016, 22:49  [ТС] 52
Цитата Сообщение от GreenkO Посмотреть сообщение
посмотрите проверку на ПоследнююСтроку, ПоследнийСтолбец
Это у меня есть, спасибо. Просто интересно как проверить на пустое или тут нельзя?

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
42
43
44
45
46
47
48
49
50
51
52
&НаКлиенте
Процедура Команда2(Команда)
    
    ДиалогФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    ДиалогФайла.Фильтр = "Наш файл (*.xls, *.xlsx, *.csv)|*.xls; *.xlsx; *.csv";
    ДиалогФайла.МножественныйВыбор = Ложь;
    
    ОП = Новый ОписаниеОповещения("Загрузить", ЭтаФорма, Новый Структура);
    
    ДиалогФайла.Показать(ОП);
    
КонецПроцедуры
 
&НаКлиенте
Процедура Загрузить(РезультатВыбора, СтруктураДополнительныхПараметров) Экспорт
    
    Если РезультатВыбора = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    Exl = Новый ComObject("Excel.Application");     
    Попытка
        Exl.Application.Workbooks.Open(РезультатВыбора[0]);
    Исключение
        мСообщение = Новый СообщениеПользователю();
        мСообщение.Текст = "что то пошло не так ...." + символы.ПС + ОписаниеОшибки();
        мСообщение.Сообщить();
        Возврат;
    КонецПопытки;
    
    // то что хочешь сделать с файлом
    i=4;
    ВсегоСтрок = Exl.Sheets(1).Cells(1,1).SpecialCells(11).Row;
    Пока i <= ВсегоСтрок Цикл
    //Пока ЗначениеЗаполнено(Exl.Sheets(1).Cells(i,1)) Цикл
        Строка = Объект.ПереченьТоваров.Добавить();
        Строка.Цена = Exl.Sheets(1).Cells(i, 10).Value;
        Строка.Количество = Exl.Sheets(1).Cells(i, 9).Value;
        Строка.Сумма = Exl.Sheets(1).Cells(i, 11).Value;
        Строка.Товар = НайтиТоварНаСервере(Exl.Sheets(1).Cells(i, 1).Value);
 
        i=i+1;
        // Обработка коллекции табличной части документа
    КонецЦикла;
    
    Exl.Application.Quit();
КонецПроцедуры
 
&НаСервереБезКонтекста
Функция НайтиТоварНаСервере(Наименование)
 Возврат Справочники.Товары.НайтиПоНаименованию(Наименование);
КонецФункции
Все работает! Спасибо! Ждите меня завтра) С новыми вопросами)
Весь ответ на изначальный вопрос мог быть написан так во втором посте:
Добавьте приведение типа в этой строке:
1C
1
ApplicationExcel.Sheets(1).Cells(i, 1).Value = Строка(Строчка.Товар);
Но тогда бы я не узнал многого другого нового и интересного)

Добавлено через 3 минуты
1C
1
2
&НаКлиенте
Процедура Загрузить(РезультатВыбора, СтруктураДополнительныхПараметров) Экспорт
Можете пояснить что тут происходит?
0
GreenkA
Модератор
Эксперт 1С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
30.03.2016, 22:54 53
Цитата Сообщение от vino0s Посмотреть сообщение
Можете пояснить что тут происходит?
в смысле что? вы написали код и не поняли? Загрузка из Экселя.
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 353
30.03.2016, 22:58  [ТС] 54
Скажите где скачать УПП 1.3 ?
Я вот нашел: <Ссылка удалена> но что качать? ) Кто-нибудь знает?
 Комментарий модератора 
Нарушение правил форума: п.5.7:
Запрещено создание и распространение вредоносного ПО, вирусов, кряков и взлома лицензионного софта, а также публикация ссылок для их скачивания.
0
GreenkA
Модератор
Эксперт 1С
2990 / 1911 / 520
Регистрация: 25.06.2009
Сообщений: 6,781
30.03.2016, 23:00 55
vino0s, типовые конфигурации 1С - платные!
0
vino0s
9 / 9 / 8
Регистрация: 26.03.2014
Сообщений: 353
30.03.2016, 23:08  [ТС] 56
GreenkO, Хех, ок) Бухгалтерия и прочее все платное?

Добавлено через 4 минуты
Цитата Сообщение от vino0s Посмотреть сообщение
&НаКлиенте
Процедура Загрузить(РезультатВыбора, СтруктураДополнительныхПараметров) Экспорт
СтруктураДополнительныхПараметров - какие могут быть параметры?
Экспорт - что вообще делает?
0
Jackshi
59 / 59 / 6
Регистрация: 16.01.2013
Сообщений: 155
31.03.2016, 12:26 57
СтруктураДополнительныхПараметров - какие дополнительные параметры передашь, такие и будут.
Экспорт - нужен для ОписанияОповещения, без него он не найдет эту процедуру.
0
Nenaviju1C
43 / 43 / 6
Регистрация: 17.03.2016
Сообщений: 117
31.03.2016, 14:26 58
Цитата Сообщение от vino0s Посмотреть сообщение
СтруктураДополнительныхПараметров - какие могут быть параметры?
Экспорт - что вообще делает?
Может ты все-таки букварь по 1С откроешь в коем то веке?
Клиент-серверную архитектуру и асинхронные вызовы разжевывать тебе ни кто не будет.

Цитата Сообщение от vino0s Посмотреть сообщение
Хех, ок) Бухгалтерия и прочее все платное?
Нет, все за спасибо работают, в т.ч. фирма 1С.
1
31.03.2016, 14:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2016, 14:26

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

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

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


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

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

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