Пытаюсь загрузить Эксель в массив, но вторая процедура не выводится в отладчик

1. user1069796 05.02.19 11:07 Сейчас в теме
Здравствуйте.

Подскажите пожалуйста, в чём моя ошибка при написании этой процедуры.

&НаКлиенте
Процедура ПолеДляВыбораФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок = "Выберите excel - файл";
	Диалог.ПолноеИмяФайла = "c:\";
	Диалог.Фильтр = "Таблицы (*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx";
	
	Если Диалог.Выбрать() Тогда
		ПолеДляВыбораФайла = Диалог.ПолноеИмяФайла;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура Загрузить(Команда, ПолеДляВыбораФайла)
	
	Если ПустаяСтрока(ПолеДляВыбораФайла) Тогда
		Сообщить("Для запуска обработки необходимо предварительно выбрать файл Microsoft Excel.");
		Возврат;
	КонецЕсли;

	КнигаExcel = ПолучитьCOMОбъект(ПолеДляВыбораФайла);  //Получить книгу из файла EXCEL
	ExcelЛист = КнигаExcel.Sheets(1);	

	xlCellTypeLastCell = 11;	
	ExcelПоследняяСтрока = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;
	ExcelПоследняяКолонка = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Column;

	МАдресов  = Новый Массив;

	Для НомСтроки = 2 По ExcelПоследняяСтрока  Цикл     // НомСтроки=2 - номер колонки
		
		Номер =   ExcelЛист.Cells(НомСтроки,2).Value;   // (НомСтроки,2) - номер колонки и номер строки 
		
		МАдресов.Добавить(Номер);
		
	КонецЦикла;	

	КнигаExcel=КнигаExcel.Application.Quit();

	Сообщить("Загрузка завершена!");	
	
КонецПроцедуры
Показать
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Alexei_Siva 187 05.02.19 11:12 Сейчас в теме
Приходят на ум два возможных объяснения:
1. Серверная процедура не вызывается (в выложенной клиентской её действительно нет)
2. не включена отладка на сервере (поэтому отладчик в серверную процедуру не заходит)
3. user1069796 05.02.19 11:19 Сейчас в теме
(2) Да спасибо, прям перед вашим сообщением разобрался и заработало:

&НаКлиенте
Процедура Загрузить(Команда);
	
	 ЗагрузитьФайл(ПолеДляВыбораФайла); /////// Добавил для кнопки отдельную процедуру и вызов серверной ///// 
                                                                                /// процедуры по этой кнопке
	
КонецПроцедуры

&НаСервере
Процедура ЗагрузитьФайл(ПолеДляВыбораФайла)
	
	Если ПустаяСтрока(ПолеДляВыбораФайла) Тогда
		Сообщить("Для запуска обработки необходимо предварительно выбрать файл Microsoft Excel.");
		Возврат;
	КонецЕсли;

	КнигаExcel = ПолучитьCOMОбъект(ПолеДляВыбораФайла);  //Получить книгу из файла EXCEL
	ExcelЛист = КнигаExcel.Sheets(1);	

	xlCellTypeLastCell = 11;	
	ExcelПоследняяСтрока = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;
	ExcelПоследняяКолонка = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Column;

	МАдресов  = Новый Массив;

	Для НомСтроки = 2 По ExcelПоследняяСтрока  Цикл     // НомСтроки=2 - номер колонки
		
		Номер =   ExcelЛист.Cells(НомСтроки,2).Value;   // (НомСтроки,2) - номер колонки и номер строки 
		
		МАдресов.Добавить(Номер);
		
	КонецЦикла;	

	КнигаExcel=КнигаExcel.Application.Quit();

	Сообщить("Загрузка завершена!");	
	
КонецПроцедуры
Показать
4. user1069796 05.02.19 11:23 Сейчас в теме
Не подскажете как сделать что бы в массив добавлялись бы две колонки, 2-ая и 3-я ???

Для НомСтроки = 2 По ExcelПоследняяСтрока  Цикл     // НомСтроки=2 - номер колонки
        
        Номер =   ExcelЛист.Cells(НомСтроки,2).Value;   // (НомСтроки,2) - номер колонки и номер строки 
        
        МАдресов.Добавить(Номер);
        
    КонецЦикла; 


Как это прописать?
5. SedovSU@mail.ru 298 05.02.19 11:31 Сейчас в теме
(4) Ну у вас тогда в массиве будет три записи для колонки 1, 2, 3

Номер1 =   ExcelЛист.Cells(НомСтроки,2).Value;
Номер2 =   ExcelЛист.Cells(НомСтроки,3).Value;
Номер3 =   ExcelЛист.Cells(НомСтроки,4).Value;
        
МАдресов.Добавить(Номер1);
МАдресов.Добавить(Номер2);
МАдресов.Добавить(Номер3);


Лучше добавляете не само значение а структуру из значений

Для НомСтроки = 2 По ExcelПоследняяСтрока Цикл // НомСтроки=2 - номер колонки

Структура = Новый Структура();        
Номер1 =   ExcelЛист.Cells(НомСтроки,2).Value;
Номер2 =   ExcelЛист.Cells(НомСтроки,3).Value;
Номер3 =   ExcelЛист.Cells(НомСтроки,4).Value;

Структура.Вставить("Номер1", Номер1);
Структура.Вставить("Номер2", Номер2);
Структура.Вставить("Номер3", Номер3);
       
МАдресов.Добавить(Структура);
        
КонецЦикла;
Показать
6. user1088693 05.02.19 11:37 Сейчас в теме
(4) Вам нужно еще создать один массив, и в него добавить тот массив, то есть примерно так:

МассивКолонок = Новый Массив;

МассивНомеров = Новый Массив;
МассивНомеров.Добавить("№1");
МассивНомеров.Добавить("№2");
МассивНомеров.Добавить("№3");
...

МассивЧегоТо = Новый Массив;
МассивЧегоТо .Добавить("№1");
МассивЧегоТо .Добавить("№2");
МассивЧегоТо .Добавить("№3");

МассивКолонок.Добавить(МассивНомеров);
МассивКолонок.Добавить(МассивЧегоТо);
Показать

И потом можете обращайться к этим колонкам массива.
7. zarankony 306 05.02.19 13:18 Сейчас в теме
Забудьте про com объект, читайте файл штатными средствами ТабличныйДокумент.Прочитать();

&НаКлиенте
Процедура ФайлНачалоВыбора(Команда)
	Режим = РежимДиалогаВыбораФайла.Открытие;
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
	Фильтр = "Табличный документ(*.xls;*.xlsx;*.ods;*.mxl)|*.xls;*.xlsx;*.ods;*.mxl";
	ДиалогОткрытияФайла.Фильтр = Фильтр;
	ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	ДиалогОткрытияФайла.Заголовок = "Выберите файлы";
	Если ДиалогОткрытияФайла.Выбрать() Тогда
    МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
    Для Каждого ИмяФайла Из МассивФайлов Цикл
        Файл = ИмяФайла;
		
	КонецЦикла;
	ПрочитатьФайл(Файл);
	Иначе
    	//Предупреждение(НСтр("ru = 'Файл(ы) не выбран!'; en = 'File(s) not selected!'"));
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьФайл(Файл)
	
	МассивЗаголовков=Новый Массив;
	
	ДвоичныеДанные = Новый ДвоичныеДанные(Файл);
	МассивИмениФайла = СтрРазделить(Файл,ПолучитьРазделительПути());
	КонечноеИмяФайла = МассивИмениФайла[МассивИмениФайла.Количество()-1];
	Хранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
	ПрочитатьФайлНаСервере(Хранилище,КонечноеИмяФайла);

КонецПроцедуры

&НаСервере
Процедура Хранилище (Хранилище,КонечноеИмяФайла)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Хранилище);
	ИмяФайлаНаСервере = КаталогВременныхФайлов()+ПолучитьРазделительПути()+КонечноеИмяФайла;
	ДвоичныеДанные.Записать(ИмяФайлаНаСервере);
	Таблица = ФайлExcelВТаблицуЗначений(ИмяФайлаНаСервере);
КонецПроцедуры;

// Парсит Excel и возвращает таблицу значений из него
//
// Параметры:
//  Файл  - строка - имя файла на сервере, из которого будет идти чтение               
//  НомерЛиста  - число - номер читаемого листа, 0 - читаем все листы
//  КолУровнейШапки - число - для сложных шапок, содержащих 2 и более уровней              
//
// Возвращаемое значение:
//   ТаблицаЗначений   - Таблица с данными из файла Excel
//
Функция ФайлExcelВТаблицуЗначений(Файл,НомерЛиста=0,КолУровнейШапки=0,ЧитатьКакТекст=Ложь) Экспорт
	
	ТабДок = Новый ТабличныйДокумент;
	ТабДок.Прочитать(Файл,?(ЧитатьКакТекст,СпособЧтенияЗначенийТабличногоДокумента.Текст,СпособЧтенияЗначенийТабличногоДокумента.Значение));
	
	ЧитаемаяОбласть = ТабДок.Область();
	Если НомерЛиста>0 Тогда
		
		ТабОбластей = Новый ТаблицаЗначений;
		ТабОбластей.Колонки.Добавить("Верх");
		ТабОбластей.Колонки.Добавить("Область");
		
		Для Каждого Область Из ТабДок.Области Цикл
			Строка = ТабОбластей.Добавить();
			Строка.Область = Область;
			Строка.Верх = Область.Верх;
		КонецЦикла;
		
		ТабОбластей.Сортировать("Верх");
		Область = ТабОбластей[НомерЛиста-1].Область;
	КонецЕсли;
	
	Если КолУровнейШапки > 1 Тогда
		Область = СвернутьСложнуюШапку(ТабДок,КолУровнейШапки,Область);
	КонецЕсли;
	
	ПЗ = Новый ПостроительЗапроса;
	
	ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(Область);
	
	ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
	
	ПЗ.ЗаполнитьНастройки();
	
	ПЗ.Выполнить();
	
	Возврат ПЗ.Результат.Выгрузить();
	

КонецФункции // ФайлExcelВТаблицуЗначений()


// Для парсинга табличных документов: сворачивает шапку для построителя запросов до 1 уровня
//
// Параметры:
//  Область  - ТабличныйДокумент,ОбластьТабличногоДокумента - <описание параметра>
//  КолУровней  - Число - Исходное количество уровней начиная с 2. Передавать меньше 2 не имеет смысла.
//        
// Возвращаемое значение:
//   ОбластьТабличногоДокумента   - Область с обрезанной до 1 строки шапкой.
Функция СвернутьСложнуюШапку(ТабДок,КолУровней,Область=Неопределено) Экспорт
	Если Область=Неопределено Тогда
		Область = ТабДок.Область();
	КонецЕсли;
	МассивЗаголовков = Новый Массив;	
	МаксКолонок = ТабДок.ПолучитьРазмерОбластиДанныхПоГоризонтали();
	ПерваяСтрока = Область.Верх;
	Для Сч = 1 По КолУровней Цикл
		ПредЗначение = "";
		Для Кол = 1 По МаксКолонок Цикл
			Текст = ТабДок.Область("R"+Строка(ПерваяСтрока+Сч-1)+"C"+Кол).Текст;
			
			Если Сч = 1 Тогда
				МассивЗаголовков.Добавить(Новый Массив);
				Если ЗначениеЗаполнено(Текст) Тогда
					МассивЗаголовков[Кол-1].Добавить(Текст);
					ПредЗначение = Текст;
				Иначе
					МассивЗаголовков[Кол-1].Добавить(ПредЗначение);
				КонецЕсли;
			Иначе
				ИменаЗаголовка = МассивЗаголовков[Кол-1];
				РодительОтличается = Ложь;
				Если Кол >1 Тогда
					Для Инд = 0 по Сч-2 Цикл
						Если ИменаЗаголовка[Инд] <> МассивЗаголовков[Кол-2][Инд] Тогда
							РодительОтличается = Истина;
							Прервать;
						КонецЕсли;
					КонецЦикла;
				КонецЕсли;
				Если ЗначениеЗаполнено(Текст) Тогда
					ИменаЗаголовка.Добавить(Текст);
				Иначе
					Если ЗначениеЗаполнено(ПредЗначение) И НЕ РодительОтличается Тогда 
						ИменаЗаголовка.Добавить(ПредЗначение);
					КонецЕсли;
				КонецЕсли;
				ПредЗначение = Текст;
			КонецЕсли;
			
		КонецЦикла;
	КонецЦикла;
	Для Кол = 1 По МаксКолонок Цикл
		ТабДок.Область("R"+Строка(ПерваяСтрока+КолУровней-1)+"C"+Кол).Текст = СтрСоединить(МассивЗаголовков[Кол-1],"_");
		
	КонецЦикла;
	НоваяОбласть = ТабДок.Область("R"+Строка(ПерваяСтрока+КолУровней-1)+":R"+Область.Низ);
	Возврат НоваяОбласть;
КонецФункции // СвернутьСложнуюШапку()
Показать


Это мой метод, надеюсь нигде не опечатался при переносе.
8. f_fobos 08.02.19 09:40 Сейчас в теме
(7) + за подход. Но это не всегда оправдано, например, при решении задачи импорта "на 1 раз".
9. zarankony 306 08.02.19 10:22 Сейчас в теме
(8) код универсален и годится как фабрика импортов "на 1 раз"
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот