Имя: Пароль:
1C
1С v8
Загрузка из Excel
0 Масянька
 
03.08.23
11:42
День добрый!
Загрузка из файла Excel.
Не выходит каменный цветок...

&НаКлиенте
Процедура Загрузить(Команда)
    
    Если (НЕ ПроверкаКаталога()) Тогда
        Возврат;
    КонецЕсли;
    
    КолВоСтрок = ФайлВПорядке();
    Если (КолВоСтрок > 0) Тогда
        Файл             = Новый Файл(Объект.КаталогСФайлом);
Сообщить("! - " + Файл + " / " + Объект.КаталогСФайлом);        
        ДвоичныеДанные     = Новый ДвоичныеДанные(Объект.КаталогСФайлом);
        
        ЗагрузитьДанные(ДвоичныеДанные, Файл.Расширение);
    КонецЕсли;
    
    ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Загрузка окончена.");
    
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьДанные(ДвоичныеДанные, Расширение)
    
    ФайлEXCELНаСервере = ПолучитьИмяВременногоФайла(Расширение);

    ДвоичныеДанные.Записать(ФайлEXCELНаСервере);
    
    ТабличныйДокумент = Новый ТабличныйДокумент;
    
    ТабличныйДокумент.Прочитать(ФайлEXCELНаСервере, СпособЧтенияЗначенийТабличногоДокумента.Текст);
    
    УдалитьФайлы(ФайлEXCELНаСервере);
    //вывод в таблицу значений
    
    ПЗ = Новый ПостроительЗапроса;
    
    ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
    
    ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
    
    ПЗ.ЗаполнитьНастройки();
    
    ПЗ.Выполнить();
    
    ТаблицаЗначений = ПЗ.Результат.Выгрузить();    
    
    Объект.СписокДанных.Загрузить(ТаблицаЗначений);
    //СоздатьСамДокумент(ДатаДохода, МассивДанных);  
    
КонецПроцедуры

В табличном документе на форме появляются пустые строки с номерами. Номеров всего 689, а в файле строк 43.
Что не так?
Спасибо.
1 Масянька
 
03.08.23
11:43
Сообщалка выводит:
! - Файл / D:\1С\_Рабочие базы\ЗУП\СоцПрограмма\Список Голубая бездна.xlsx
2 Ногаминебить
 
03.08.23
11:48
А ексель нормальный, без извращений? Табличка и ничего лишнего? Я б еще имена столбцов в первой строке задал как Т1,Т2,Т3...
3 Одинист
 
03.08.23
11:50
1. Табличный документ попробовать Показать/ таблицу значений вывести через «Сообщить».
2. Прочитать данные по строкам/ячейкам.
4 Масянька
 
03.08.23
11:51
5 Масянька
 
03.08.23
11:51
(3) 1. Что показать? Табдок на форме.
2. Как?
6 Одинист
 
03.08.23
12:00
(5) 1. Вот этот ТабличныйДокумент = Новый ТабличныйДокумент

2. Примерно так:

ТабДок = Новый ТабличныйДокумент;
    ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Текст);
    
    мВысотаТабличногоДокумента = ТабДок.ВысотаТаблицы;
    
    // Обход строк табличного документа и заполнение таблицы значений
    Для Строка = 2 По мВысотаТабличногоДокумента Цикл
        НоваяСтр = ТЗизТабДока.Добавить();
        НоваяСтр.Наименование = ПолучитьСодержаниеЯчейки(ТабДок, Строка, 1);
        НоваяСтр.Код = ПолучитьСодержаниеЯчейки(ТабДок, Строка, 2);
    КонецЦикла;


Функция ПолучитьСодержаниеЯчейки(пТабличныйДокумент, Строка, Колонка)    
    Если Колонка = 0 Тогда
        Возврат "";
    КонецЕсли;    
    мСодержание = пТабличныйДокумент.Область("R" + Формат(Строка,"ЧГ=") + "C" + Формат(Колонка,"ЧГ=")).Текст;    
    Возврат СокрЛП(мСодержание);
КонецФункции
7 Гипервизор
 
03.08.23
12:00
(5) ТабличныйДокумент.Показать(), да и отладка есть.
И посмотреть, может что-то криво прочиталось. Отсюда и дальше думать, что можно подкрутить.
8 Масянька
 
03.08.23
12:10
(6)
    ТабличныйДокумент = Новый ТабличныйДокумент;
    
    ТабличныйДокумент.Прочитать(ФайлEXCELНаСервере, СпособЧтенияЗначенийТабличногоДокумента.Текст);

    
    
    
    мВысотаТабличногоДокумента = ТабличныйДокумент.ВысотаТаблицы;
    
    ТЗизТабДока = Новый ТаблицаЗначений;
    ТЗизТабДока.Колонки.Вставить("Сотрудник");
    ТЗизТабДока.Колонки.Вставить("Результат");
    
    // Обход строк табличного документа и заполнение таблицы значений
    Для Строка = 2 По мВысотаТабличногоДокумента Цикл
        НоваяСтр = ТЗизТабДока.Добавить();
        НоваяСтр.Сотрудник = ПолучитьСодержаниеЯчейки(ТабличныйДокумент, Строка, 1);
        НоваяСтр.Результат = ПолучитьСодержаниеЯчейки(ТабличныйДокумент, Строка, 2);
    КонецЦикла;


Несоответствие типов (параметр номер '1')
{ВнешняяОбработка.ЗагрузкаДоходовВНатуральнойФорме.Форма.Форма.Форма(155)}:ТЗизТабДока.Колонки.Вставить("Сотрудник");
{ВнешняяОбработка.ЗагрузкаДоходовВНатуральнойФорме.Форма.Форма.Форма(131)}:ЗагрузитьДанные(ДвоичныеДанные, Файл.Расширение);

по причине:
Несоответствие типов (параметр номер '1')
9 Гипервизор
 
03.08.23
12:12
(8) Почитайте в СП про метод Вставить(). Сначала идёт индекс колонки.
10 Масянька
 
03.08.23
12:17
(9) Как скажете, господин 🙂

    мВысотаТабличногоДокумента = ТабличныйДокумент.ВысотаТаблицы;
    
    ТЗизТабДока = Новый ТаблицаЗначений;
    ТЗизТабДока.Колонки.Вставить(1,"Сотрудник");
    ТЗизТабДока.Колонки.Вставить(2, "Результат");
    
    // Обход строк табличного документа и заполнение таблицы значений
    Для Строка = 2 По мВысотаТабличногоДокумента Цикл
        НоваяСтр = ТЗизТабДока.Добавить();
        НоваяСтр.Сотрудник = ПолучитьСодержаниеЯчейки(ТабличныйДокумент, Строка, 1);
        НоваяСтр.Результат = ПолучитьСодержаниеЯчейки(ТабличныйДокумент, Строка, 2);
сообщить("3 - " + НоваяСтр.Сотрудник + " / " + НоваяСтр.Результат);        
    КонецЦикла;
    

Сообщалка выводит значения (то, что в файле) всех строк, а потом еще кучу пустых.
На форме (в табличном документе) без изменений - пусто.
11 Гипервизор
 
03.08.23
12:21
(10) Отсюда не видно, что и куда вы загружаете. Состав и типы совпадают у Объект.СписокДанных и ТЗизТабДока?
12 Масянька
 
03.08.23
12:26
(11) Вроде, да.
    мВысотаТабличногоДокумента = ТабличныйДокумент.ВысотаТаблицы;
    
    ТЗизТабДока = Новый ТаблицаЗначений;
    ТЗизТабДока.Колонки.Вставить(1,"Код");
    ТЗизТабДока.Колонки.Вставить(2,"Сотрудник");
    ТЗизТабДока.Колонки.Вставить(3, "Результат");
    
    // Обход строк табличного документа и заполнение таблицы значений
    Для Строка = 2 По мВысотаТабличногоДокумента Цикл
        НоваяСтр = ТЗизТабДока.Добавить();
        НоваяСтр.Код = ПолучитьСодержаниеЯчейки(ТабличныйДокумент, Строка, 1);
        НоваяСтр.Сотрудник = ПолучитьСодержаниеЯчейки(ТабличныйДокумент, Строка, 2);
        НоваяСтр.Результат = ПолучитьСодержаниеЯчейки(ТабличныйДокумент, Строка, 3);
сообщить("3 - " + НоваяСтр.Сотрудник + " / " + НоваяСтр.Результат);        
    КонецЦикла;

https://postimg.cc/XXjRk1Gz
Первые две - строка, третья - число
13 Гипервизор
 
03.08.23
12:35
(12) А у вас в ТЗ какого типа колонки? Судя по ПолучитьСодержаниеЯчейки, всегда возвращается строковое значение.
14 Ногаминебить
 
03.08.23
13:30
(4) Я не это имел в виду. Картинку содержимого екселя (ну хотя бы верхушку).
И выше уже писали - под отладкой смотреть надо.
15 Масянька
 
03.08.23
13:45
(13)
    мВысотаТабличногоДокумента = ТабличныйДокумент.ВысотаТаблицы;
    
    ТЗизТабДока = Новый ТаблицаЗначений;
    ТЗизТабДока.Колонки.Вставить(1,"Код", Новый ОписаниеТипов("Строка"));
    ТЗизТабДока.Колонки.Вставить(2,"Сотрудник", Новый ОписаниеТипов("Строка"));
    ТЗизТабДока.Колонки.Вставить(3, "Результат", Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(15, 2)));
    
    // Обход строк табличного документа и заполнение таблицы значений
    Для Строка = 2 По мВысотаТабличногоДокумента Цикл
        НоваяСтр = ТЗизТабДока.Добавить();
        НоваяСтр.Код = ПолучитьСодержаниеЯчейки(ТабличныйДокумент, Строка, 1);
        НоваяСтр.Сотрудник = ПолучитьСодержаниеЯчейки(ТабличныйДокумент, Строка, 2);
        НоваяСтр.Результат = ПолучитьСодержаниеЯчейки(ТабличныйДокумент, Строка, 6);
сообщить("3 - " + НоваяСтр.Сотрудник + " / " + НоваяСтр.Результат + " / " + ТипЗнч(НоваяСтр.Сотрудник) + " / " + ТипЗнч(НоваяСтр.Результат));        
    КонецЦикла;

В сообщалке (типы) - строка, число.
16 Масянька
 
03.08.23
13:46
(14) Отладка у меня не работает (внешняя обработка).
Верхушка - https://postimg.cc/0zzSHXCf
17 arsik
 
03.08.23
13:47
(15) Да хватит уже мучать ТЗ. Просто выведи на форму этот табличный документ и посмотри в чем косяк.
18 arsik
 
03.08.23
13:48
(17) Ну или просто сохрани в файл и открой.
19 Гипервизор
 
03.08.23
13:49
(16) А в чём проблема с отладкой внешней обработки?
20 Масянька
 
03.08.23
13:56
(18)     ТабличныйДокумент.Прочитать(ФайлEXCELНаСервере, СпособЧтенияЗначенийТабличногоДокумента.Текст);
    
    ТабличныйДокумент.Записать("D:\1.mxl");

Нету файла.
21 Масянька
 
03.08.23
13:56
(19) Не знаю. Не работает и всё.
22 Гипервизор
 
03.08.23
14:08
(20) Так код на сервере выполняется, там и ищите.
(21) Отладка на сервере включена?
23 Ногаминебить
 
03.08.23
14:14
(16) Это самая верхняя строка? После нее сразу начинаются данные? Лист только один? Убрать фильтры, подвалы и прочее, переименовать все колонки на гарантированно уникальные названия.
24 Масянька
 
03.08.23
14:17
(22) Нашла 🙂
В файле mxl есть данные (как в Excel).
Где отладку посмотреть?
25 arsik
 
03.08.23
14:44
(24) Значит у тебя проблема в процедуре ПолучитьСодержаниеЯчейки()
26 Масянька
 
03.08.23
14:47
(23) Лист один. Убрала фильтр, удалила строки после данных = на форме всего 42 строки (как в Excel), но пустые.
Где инфа? 😣😣😣😣😣😣😣😣😣😣😣😣
27 Масянька
 
03.08.23
14:49
+ (26) В файле mxl - копия Excel.
28 Масянька
 
03.08.23
14:58
Мужики!
Спасибо!
Всё получилось!

PS Правда, простейшая операция (загрузка из Excel) превратилась (легким движением руки)....
Кстати, можно рекомендовать, как задачу на собеседовании.
29 Гипервизор
 
03.08.23
15:11
(28) Ни в коем случае не пишите подробности о проблеме. )
30 arsik
 
03.08.23
15:14
+(25) Блин только сейчас заметил. Содержание - ??? СодержаниеЯчейки - ???
Однаэс?
31 Масянька
 
03.08.23
15:39
(29) Я не делала табличный документ, а сразу в ТЗ и по ТЗ заполнять док-т.