Проблема с формированием табличного документа из файла ексель
Функция в которой 1с указывает на проблемный код на скриншоте с выделенным участком проблемного кода.
Сперва я выбираю файл экселя (xls, xlsx)и загружаю из него данные,а 1с формирует файл xlsx. Затем я читаю сформированный файл в табличный документ на сервере, а потом хочу показать табличный документ.
Я не понял, что я не так делаю. Помогите кто в этом опытнее.
Сперва я выбираю файл экселя (xls, xlsx)и загружаю из него данные,а 1с формирует файл xlsx. Затем я читаю сформированный файл в табличный документ на сервере, а потом хочу показать табличный документ.
Я не понял, что я не так делаю. Помогите кто в этом опытнее.
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Сталкивался с такой ситуацией - оказалось, что дело в расширении, которое указываете при создании временного файла.
Если файл xls, а вы создаете временный xlsx - и наоборот, будет ошибка.
Если файл xls, а вы создаете временный xlsx - и наоборот, будет ошибка.
&НаКлиенте
Процедура ПрочитатьФайл(Команда=Неопределено, Параметры=Неопределено) Экспорт
Если ПустаяСтрока(ИмяФайла) ТОгда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не указан файл!");
Возврат;
ИначеЕсли Команда = КодВозвратаДиалога.Нет Тогда
Возврат;
КонецЕсли;
Состояние("Идет загрузка данных...");
Файл = Новый Файл(ИмяФайла);
Расширение = Файл.Расширение;
Файл = Неопределено;
ДопПарам = Новый Структура("ИмяФайла, Расширение", ИмяФайла, Расширение);
Оповещение = Новый ОписаниеОповещения("ВыполнитьЗагрузкуКлиент", ЭтаФорма, ДопПарам);
НачатьПомещениеФайла(Оповещение, , ИмяФайла, Ложь, УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьЗагрузкуКлиент(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда // Если ошибка
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Файл не обнаружен!");
Возврат;
КонецЕсли;
ПрочитатьФайлНаСервере(Адрес, ДополнительныеПараметры);
КонецПроцедуры
&НаСервере
Процедура ПрочитатьФайлНаСервере(Адрес = Неопределено, ДополнительныеПараметры)
ФайлВременногоХранилища = ПолучитьИзВременногоХранилища(Адрес);
ИмяФайлаСервер = ПолучитьИмяВременногоФайла(ДополнительныеПараметры.Расширение);
ФайлВременногоХранилища.Записать(ИмяФайлаСервер);
УдалитьИзВременногоХранилища(Адрес);
Таблица.Очистить();
Таблица.Прочитать(ИмяФайлаСервер, СпособЧтенияЗначенийТабличногоДокумента.Текст);
КонецПроцедуры
Показать
(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, ПоследняяСтрока, ПоследняяКолонка);
ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();
ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
КонецФункции
Показать
(6) Подскажите пожалуйста как мне разделить обработку с временным файлом, чтобы если я загружаю xls, то формируется только временный xls, а если я загружаю xlsx, то формируется только временный xlsx.
Мне достаточно объявить отдельную функцию "ПрочитатьТабличныйДокумент" или просто как-то изменить имеющуюся функцию "ПрочитатьТабличныйДокумент" ?
Мне достаточно объявить отдельную функцию "ПрочитатьТабличныйДокумент" или просто как-то изменить имеющуюся функцию "ПрочитатьТабличныйДокумент" ?
&НаСервере
Функция ПрочитатьТабличныйДокумент(АдресВХранилище)
Файл = ПолучитьИмяВременногоФайла("xlsx");
лДвоичДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
лДвоичДанные.Записать(Файл);
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(Файл, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
КонецПопытки;
Возврат ТабДок;
КонецФункции
Показать
(6) я пытаюсь разобрать ваш код но мне выходят оишбки:
Скажите пожалуйста, чем у вас является и
{ОбщаяФорма.Форма.Форма(57,5)}: Переменная не определена (Таблица)
<<?>>Таблица.Очистить(); (Проверка: Сервер)
{ОбщаяФорма.Форма.Форма(58,5)}: Переменная не определена (Таблица)
<<?>>Таблица.Прочитать(ИмяФайлаСервер, СпособЧтенияЗначенийТабличногоДокумента.Текст); (Проверка: Сервер)
{ОбщаяФорма.Форма.Форма(25,9)}: Переменная не определена (ОбщегоНазначенияКлиентСервер)
<<?>>ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не указан файл!"); (Проверка: Тонкий клиент)
{ОбщаяФорма.Форма.Форма(45,9)}: Переменная не определена (ОбщегоНазначенияКлиентСервер)
<<?>>ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Файл не обнаружен!"); (Проверка: Тонкий клиент)
Скажите пожалуйста, чем у вас является
Таблица,
СпособЧтенияЗначенийТабличногоДокумент
ОбщегоНазначенияКлиентСервер.
(3)
Уточните пожалуйста: 1) чем являются ОбщегоНазначенияКлиентСервер и Таблица ?
2) процедуры ПрочитатьФайл и ВыполнитьЗагрузкуКлиент поместить в общий модуль или глобальный? Так как я вижу рядом с ними слово Экспорт
&НаКлиенте
Процедура ВыполнитьЗагрузкуКлиент(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда // Если ошибка
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Файл не обнаружен!");
Возврат;
КонецЕсли;
ПрочитатьФайлНаСервере(Адрес, ДополнительныеПараметры);
КонецПроцедуры
Процедура ВыполнитьЗагрузкуКлиент(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда // Если ошибка
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Файл не обнаружен!");
Возврат;
КонецЕсли;
ПрочитатьФайлНаСервере(Адрес, ДополнительныеПараметры);
КонецПроцедуры
Уточните пожалуйста: 1) чем являются ОбщегоНазначенияКлиентСервер и Таблица ?
2) процедуры ПрочитатьФайл и ВыполнитьЗагрузкуКлиент поместить в общий модуль или глобальный? Так как я вижу рядом с ними слово Экспорт
(3)
{ОбщаяФорма.Форма.Форма(25,9)}: Переменная не определена (ОбщегоНазначенияКлиентСервер)
<<?>>ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не указан файл!"); (Проверка: Тонкий клиент)
Процедура ПрочитатьФайл(Команда=Неопределено, Параметры=Неопределено) Экспорт
{ОбщаяФорма.Форма.Форма(25,9)}: Переменная не определена (ОбщегоНазначенияКлиентСервер)
<<?>>ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не указан файл!"); (Проверка: Тонкий клиент)
(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)
Эта функция используется здесь:
А мне нужно чтобы при загрузке файла формата xls получался временный файл xls, а если xlsx то временный xlsx. Я хочу чтобы ведь возможно было читать и выводить в табличный документ формата и xls и xlsx
ПолучитьИмяВременногоФайла
Эта функция используется здесь:
&НаСервере
Функция ПрочитатьТабличныйДокумент(АдресВХранилище)
Файл = ПолучитьИмяВременногоФайла("xlsx");
лДвоичДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
лДвоичДанные.Записать(Файл);
ТабДок = Новый ТабличныйДокумент;
Попытка
ТабДок.Прочитать(Файл, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ОписаниеОшибки();
Сообщение.Сообщить();
КонецПопытки;
Возврат ТабДок;
КонецФункции
ПоказатьА мне нужно чтобы при загрузке файла формата xls получался временный файл xls, а если xlsx то временный xlsx. Я хочу чтобы ведь возможно было читать и выводить в табличный документ формата и xls и xlsx
(13)
Может так будет более понятно
&НаКлиенте
Процедура ПрочитатьФайл(Команда)
Если ПустаяСтрока(ИмяФайла) Тогда
Сообщить("Не указан файл!");
Возврат;
КонецЕсли;
Состояние("Идет загрузка данных...");
// Определяем расширение выбранного файла
Файл = Новый Файл(ИмяФайла);
Расширение = Файл.Расширение;
Файл = Неопределено;
ДопПарам = Новый Структура("ИмяФайла, Расширение", ИмяФайла, Расширение); // Создаем структуру с параметрами (Имя файла и расширение)
Оповещение = Новый ОписаниеОповещения("ВыполнитьЗагрузкуКлиент", ЭтаФорма, ДопПарам);
НачатьПомещениеФайла(Оповещение, , ИмяФайла, Ложь, УникальныйИдентификатор); // Вызываем передачу файла на сервер
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьЗагрузкуКлиент(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Не Результат Тогда // Если происходит ошибка передачи файла
Сообщить("Файл не обнаружен!");
Возврат;
КонецЕсли;
ПрочитатьФайлНаСервере(Адрес, ДополнительныеПараметры); // Вызываем серверный метод загрузки файла
КонецПроцедуры
&НаСервере
Процедура ПрочитатьФайлНаСервере(Адрес = Неопределено, ДополнительныеПараметры)
ФайлВременногоХранилища = ПолучитьИзВременногоХранилища(Адрес);
ИмяФайлаСервер = ПолучитьИмяВременногоФайла(ДополнительныеПараметры.Расширение); // Получаем имя временного файла с расширением, полученным из параметров
ФайлВременногоХранилища.Записать(ИмяФайлаСервер); // Записываем его на диск
УдалитьИзВременногоХранилища(Адрес); // Очищаем хранилище
Таблица.Очистить(); // очищаем табличный документ
Таблица.Прочитать(ИмяФайлаСервер, СпособЧтенияЗначенийТабличногоДокумента.Текст); // загружаем данные из временного файла
КонецПроцедуры
ПоказатьМожет так будет более понятно
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот