Проблема с формированием табличного документа из файла ексель

1. user1345957 21.04.20 04:33 Сейчас в теме
Функция в которой 1с указывает на проблемный код на скриншоте с выделенным участком проблемного кода.

Сперва я выбираю файл экселя (xls, xlsx)и загружаю из него данные,а 1с формирует файл xlsx. Затем я читаю сформированный файл в табличный документ на сервере, а потом хочу показать табличный документ.

Я не понял, что я не так делаю. Помогите кто в этом опытнее.
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. burgomister 59 21.04.20 05:06 Сейчас в теме
1. Хорошо бы выкладывать код текстом.
2.
ТабДок = ПрочитатьТабличныйДокумент(АдресВХранилище)
Функция ПрочитатьТабличныйДокумент(АдресВХранилище)
user1345957; +1 Ответить
5. user1345957 21.04.20 12:02 Сейчас в теме
3. newbas 534 21.04.20 10:22 Сейчас в теме
Сталкивался с такой ситуацией - оказалось, что дело в расширении, которое указываете при создании временного файла.
Если файл xls, а вы создаете временный xlsx - и наоборот, будет ошибка.

&НаКлиенте
Процедура ПрочитатьФайл(Команда=Неопределено, Параметры=Неопределено) Экспорт
	Если ПустаяСтрока(ИмяФайла) ТОгда
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не указан файл!");
		Возврат;
 	ИначеЕсли Команда = КодВозвратаДиалога.Нет Тогда
             Возврат;
        КонецЕсли;		
	
	Состояние("Идет загрузка данных...");
	
	Файл = Новый Файл(ИмяФайла);
	Расширение = Файл.Расширение;
	Файл	= Неопределено;
	
	ДопПарам 	= Новый Структура("ИмяФайла, Расширение", ИмяФайла, Расширение);
	Оповещение 	= Новый ОписаниеОповещения("ВыполнитьЗагрузкуКлиент", ЭтаФорма, ДопПарам);
	НачатьПомещениеФайла(Оповещение, , ИмяФайла, Ложь, УникальныйИдентификатор); 
КонецПроцедуры	

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

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

Показать
user1345957; +1 Ответить
4. user1345957 21.04.20 11:10 Сейчас в теме
(3) Спасибо, что отозвались. Значит если я создаю xls, то и должен создаваться временный xls, а если создаю xlsx, то должен будет создаться временный xlsx ?
6. newbas 534 21.04.20 12:23 Сейчас в теме
7. user1345957 21.04.20 13:46 Сейчас в теме
(6)извините я не понял как именно вы мне предлагаете решить проблему+добавилась новая проблема, которая не даёт мне сделать отладку. Я проверил в настройках, но tcp/ip включена.

Это полный код программы в котором ошибка есть (выделена)
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок     			   = "Выберите файл: ";
	Диалог.Фильтр 		 			   = "Ексль(*.xls;*.xlsx)|*.xls;*.xlsx";
	Диалог.ИндексФильтра 			   = 0;
	Диалог.ПредварительныйПросмотр     = Ложь;
	Диалог.ПроверятьСуществованиеФайла = Истина;
	Диалог.МножественныйВыбор          = Ложь; 
	Диалог.ПолноеИмяФайла              = ПутьКФайлу;
	
	Если Диалог.Выбрать() Тогда
		ПутьКФайлу = Диалог.ПолноеИмяФайла;
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьИзЕксель(Команда)
		Если ПутьКФайлу = "" Тогда
		
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст  = "Укажите файл загрузки";
		Сообщение.Поле   = "Объект.ПутьКФайлу";
		Сообщение.Сообщить();
		
		Возврат;
		
	КонецЕсли;
	
	Соединение = ПоключитьсяКExcel(ПутьКФайлу);
	
		//в массив структур
	Если ВариантЗагрузки = "МассивСтруктур" Тогда  
		
		Лист = Соединение["Листы"][0]; // берем нужные нам листы: можем перебирать все их в цикле, либо указывать определенные.
		
		ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
		ВсегоСтрок   = Лист.Cells(1,1).SpecialCells(11).Row;
		
		МассивДанных = Новый Массив;
		
		Для Сч = 1 по ВсегоСтрок Цикл
			
			Строка = Новый Структура;
			
			Для Сч2 = 1 по ВсегоКолонок Цикл
				
				Строка.Вставить("Колонка" + Строка(Сч2), Лист.Cells(Сч, Сч2).Value);
				
			КонецЦикла;
			
			МассивДанных.Добавить(Строка);
		КонецЦикла;
			
		//в двумерный массив
	ИначеЕсли ВариантЗагрузки = "ДвумерныйМассив" Тогда
		
		Лист = Соединение["Листы"][0];
		
		ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
		ВсегоСтрок   = Лист.Cells(1,1).SpecialCells(11).Row;
		
		Область = Лист.Range(Лист.Cells(1,1), Лист.Cells(ВсегоСтрок,ВсегоКолонок));
		Данные  = Область.Value.Выгрузить();
			
	КонецЕсли;
	
	Если Соединение = Неопределено Тогда
		
		Возврат;
		
	КонецЕсли;
	
	ОтключатьсяОтExcel(Соединение);
КонецПроцедуры

&НаКлиенте
Процедура ОтключатьсяОтExcel(Соответстие)
	
	Попытка
		
		Соответстие["Соединение"].DisplayAlerts = 0;
		Соответстие["ExcelФайл"].Close();
		
		Соответстие["Соединение"].DisplayAlerts = 1;
		Соответстие["Соединение"].Quit();
		
		Соответстие["Соединение"] = Неопределено;		
		
	Исключение
		
		Сообщить("Не удалось отключиться от Excel - "+ОписаниеОшибки());
		
	КонецПопытки;
	
КонецПроцедуры
 
&НаКлиенте
функция ПоключитьсяКExcel(п_Файл) 
	
	ПараметрыЕксель = Новый Соответствие;
	
	Попытка 
		
		Excel = Новый COMОбъект("Excel.Application");
		ПараметрыЕксель.Вставить("Соединение", Excel);
		
		Листы = Новый Массив;
		
		ExcelФайл = Excel.WorkBooks.Open (п_Файл);
		ПараметрыЕксель.Вставить("ExcelФайл", ExcelФайл);
		
		Для Сч = 1 По ExcelФайл.Sheets.Count Цикл
			Листы.Добавить(ExcelФайл.Sheets(Сч));
		КонецЦикла;
		
		ПараметрыЕксель.Вставить("Листы", Листы);
		
		фРезультат = ПараметрыЕксель;
		
	Исключение
		
		Сообщить("Ошибка создания обьекта Microsoft Excel" + ОписаниеОшибки());
		
		фРезультат = Неопределено;
 
	КонецПопытки;
	
	Возврат фРезультат;
	
КонецФункции

&НаКлиенте
Процедура ПоказатьТабличныйДокумент(Команда)
	ДвоичДанные = Новый ДвоичныеДанные(ПутьКФайлу);
	АдресВХранилище = ПоместитьВоВременноеХранилище(ДвоичДанные);
	
	ТабдДок = ПрочитатьТабличныйДокумент(АдресВХранилище);
КонецПроцедуры

&НаСервере
Функция ПрочитатьТабличныйДокумент(АдресВХранилище)
	
	Файл = ПолучитьИмяВременногоФайла("xlsx");
	лДвоичДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
	
	лДвоичДанные.Записать(Файл);
	
	
	ТабДок = Новый ТабличныйДокумент;
	
	Попытка
		
		ТабДок.Прочитать(Файл, СпособЧтенияЗначенийТабличногоДокумента.Значение);
		
	Исключение
		
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = ОписаниеОшибки();
		Сообщение.Сообщить();
		
	КонецПопытки;
	
	Возврат ТабДок; 
	
КонецФункции

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

Функция ПреобразоватьТабличныйДокументВТаблицуЗначений()
	
	ПоследняяСтрока = ТабДок.ВысотаТаблицы;
	ПоследняяКолонка = ТабДок.ШиринаТаблицы;
	
	ОбластьЯчеек = ТабДок.Область(1, 1, ПоследняяСтрока, ПоследняяКолонка);
	
	ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);  
	ПостроительОтчета = Новый ПостроительОтчета; 
	ПостроительОтчета.ИсточникДанных = ИсточникДанных;
	ПостроительОтчета.Выполнить();
	
	ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
	
КонецФункции
Показать
8. user1345957 21.04.20 16:14 Сейчас в теме
(6) Подскажите пожалуйста как мне разделить обработку с временным файлом, чтобы если я загружаю xls, то формируется только временный xls, а если я загружаю xlsx, то формируется только временный xlsx.
Мне достаточно объявить отдельную функцию "ПрочитатьТабличныйДокумент" или просто как-то изменить имеющуюся функцию "ПрочитатьТабличныйДокумент" ?

&НаСервере
Функция ПрочитатьТабличныйДокумент(АдресВХранилище)
	
	Файл = ПолучитьИмяВременногоФайла("xlsx");
	лДвоичДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
	
	лДвоичДанные.Записать(Файл);
	
	
	ТабДок = Новый ТабличныйДокумент;
	
	Попытка
		
		ТабДок.Прочитать(Файл, СпособЧтенияЗначенийТабличногоДокумента.Значение);
		
	Исключение
		
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = ОписаниеОшибки();
		Сообщение.Сообщить();
		
	КонецПопытки;
	
	Возврат ТабДок; 
	
КонецФункции
Показать
15. user1345957 22.04.20 00:19 Сейчас в теме
(6) я пытаюсь разобрать ваш код но мне выходят оишбки:

{ОбщаяФорма.Форма.Форма(57,5)}: Переменная не определена (Таблица)
    <<?>>Таблица.Очистить(); (Проверка: Сервер)
{ОбщаяФорма.Форма.Форма(58,5)}: Переменная не определена (Таблица)
    <<?>>Таблица.Прочитать(ИмяФайлаСервер, СпособЧтенияЗначенийТабличногоДокумента.Текст); (Проверка: Сервер)
{ОбщаяФорма.Форма.Форма(25,9)}: Переменная не определена (ОбщегоНазначенияКлиентСервер)
        <<?>>ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не указан файл!"); (Проверка: Тонкий клиент)
{ОбщаяФорма.Форма.Форма(45,9)}: Переменная не определена (ОбщегоНазначенияКлиентСервер)
        <<?>>ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Файл не обнаружен!"); (Проверка: Тонкий клиент)


Скажите пожалуйста, чем у вас является
Таблица,
СпособЧтенияЗначенийТабличногоДокумент
и
ОбщегоНазначенияКлиентСервер.
9. user1345957 21.04.20 16:27 Сейчас в теме
(3)
&НаКлиенте
Процедура ВыполнитьЗагрузкуКлиент(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда // Если ошибка
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Файл не обнаружен!");
Возврат;
КонецЕсли;
ПрочитатьФайлНаСервере(Адрес, ДополнительныеПараметры);
КонецПроцедуры


Уточните пожалуйста: 1) чем являются ОбщегоНазначенияКлиентСервер и Таблица ?
2) процедуры ПрочитатьФайл и ВыполнитьЗагрузкуКлиент поместить в общий модуль или глобальный? Так как я вижу рядом с ними слово Экспорт
14. user1345957 22.04.20 00:05 Сейчас в теме
(3)
Процедура ПрочитатьФайл(Команда=Неопределено, Параметры=Неопределено) Экспорт


{ОбщаяФорма.Форма.Форма(25,9)}: Переменная не определена (ОбщегоНазначенияКлиентСервер)
<<?>>ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не указан файл!"); (Проверка: Тонкий клиент)
10. newbas 534 21.04.20 17:06 Сейчас в теме
Вам нужно перед загрузкой определить расширение и передавать его в качестве параметра, чтобы в функции ПолучитьИмяВременногоФайла() в качесте параметра устанавливать нужное расширение
user1345957; +1 Ответить
12. user1345957 21.04.20 19:50 Сейчас в теме
(10 Я вас правильно понял ? Добавил на форму параметр РасширениеФайлаЭкселя, чтобы в параметре определялись расширения xls и xlsx.

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок     			   = "Выберите файл: ";
	Диалог.Фильтр 		 			   = "Ексль(*.xls;*.xlsx)|*.xls;*.xlsx";
	Диалог.ИндексФильтра 			   = 0;
	Диалог.ПредварительныйПросмотр     = Ложь;
	Диалог.ПроверятьСуществованиеФайла = Истина;
	Диалог.МножественныйВыбор          = Ложь; 
	Диалог.ПолноеИмяФайла              = ПутьКФайлу;
	
	Если Диалог.Выбрать() Тогда
		ПутьКФайлу = Диалог.ПолноеИмяФайла;
	КонецЕсли;
	
	Параметры = Новый Структура("РасширениеФайлаЭкселя", ЗначениеРасширениеФайлаЭкселя);

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	    Если Параметры.Свойство("РасширениеФайлаЭкселя") Тогда
        // здесь код обработки параметра
    КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьИзЕксель(Команда)
		Если ПутьКФайлу = "" Тогда
		
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст  = "Укажите файл загрузки";
		Сообщение.Поле   = "Объект.ПутьКФайлу";
		Сообщение.Сообщить();
		
		Возврат;
		
	КонецЕсли;
	
	Соединение = ПоключитьсяКExcel(ПутьКФайлу);
	
		//в массив структур
	Если ВариантЗагрузки = "МассивСтруктур" Тогда  
		
		Лист = Соединение["Листы"][0]; // берем нужные нам листы: можем перебирать все их в цикле, либо указывать определенные.
		
		ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
		ВсегоСтрок   = Лист.Cells(1,1).SpecialCells(11).Row;
		
		МассивДанных = Новый Массив;
		
		Для Сч = 1 по ВсегоСтрок Цикл
			
			Строка = Новый Структура;
			
			Для Сч2 = 1 по ВсегоКолонок Цикл
				
				Строка.Вставить("Колонка" + Строка(Сч2), Лист.Cells(Сч, Сч2).Value);
				
			КонецЦикла;
			
			МассивДанных.Добавить(Строка);
		КонецЦикла;
			
		//в двумерный массив
	ИначеЕсли ВариантЗагрузки = "ДвумерныйМассив" Тогда
		
		Лист = Соединение["Листы"][0];
		
		ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
		ВсегоСтрок   = Лист.Cells(1,1).SpecialCells(11).Row;
		
		Область = Лист.Range(Лист.Cells(1,1), Лист.Cells(ВсегоСтрок,ВсегоКолонок));
		Данные  = Область.Value.Выгрузить();
			
	КонецЕсли;
	
	Если Соединение = Неопределено Тогда
		
		Возврат;
		
	КонецЕсли;
	
	ОтключатьсяОтExcel(Соединение);
КонецПроцедуры
Показать
11. resonance 82 21.04.20 17:52 Сейчас в теме
Использовать функцию ПолучитьИмяВременногоФайла()
user1345957; +1 Ответить
13. user1345957 21.04.20 21:58 Сейчас в теме
(11)
ПолучитьИмяВременногоФайла

Эта функция используется здесь:

&НаСервере
Функция ПрочитатьТабличныйДокумент(АдресВХранилище)
	
	Файл = ПолучитьИмяВременногоФайла("xlsx");
	лДвоичДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
	
	лДвоичДанные.Записать(Файл);
	
	
	ТабДок = Новый ТабличныйДокумент;
	
	Попытка
		
		ТабДок.Прочитать(Файл, СпособЧтенияЗначенийТабличногоДокумента.Значение);
		
	Исключение
		
		Сообщение = Новый СообщениеПользователю;
		Сообщение.Текст = ОписаниеОшибки();
		Сообщение.Сообщить();
		
	КонецПопытки;
	
	Возврат ТабДок; 
	
КонецФункции
Показать


А мне нужно чтобы при загрузке файла формата xls получался временный файл xls, а если xlsx то временный xlsx. Я хочу чтобы ведь возможно было читать и выводить в табличный документ формата и xls и xlsx
16. newbas 534 22.04.20 08:29 Сейчас в теме
(13)

&НаКлиенте
Процедура ПрочитатьФайл(Команда) 
    Если ПустаяСтрока(ИмяФайла) Тогда
        Сообщить("Не указан файл!");
        Возврат;
    КонецЕсли;        
    
    Состояние("Идет загрузка данных...");
    
   // Определяем расширение выбранного файла
    Файл = Новый Файл(ИмяФайла);
    Расширение = Файл.Расширение;
    Файл    = Неопределено;
    
    ДопПарам     = Новый Структура("ИмяФайла, Расширение", ИмяФайла, Расширение);  // Создаем структуру с параметрами (Имя файла и расширение)
    Оповещение     = Новый ОписаниеОповещения("ВыполнитьЗагрузкуКлиент", ЭтаФорма, ДопПарам);
    НачатьПомещениеФайла(Оповещение, , ИмяФайла, Ложь, УникальныйИдентификатор);   // Вызываем передачу файла на сервер
КонецПроцедуры    

&НаКлиенте
Процедура ВыполнитьЗагрузкуКлиент(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт 
    Если Не Результат Тогда    // Если происходит ошибка передачи файла
        Сообщить("Файл не обнаружен!");
        Возврат; 
    КонецЕсли; 
    ПрочитатьФайлНаСервере(Адрес, ДополнительныеПараметры);    // Вызываем серверный метод загрузки файла
КонецПроцедуры    

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

Показать


Может так будет более понятно
user1345957; +1 Ответить
Оставьте свое сообщение

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