Привіт, допоможіть будь-ласка, пишу обробку загрузка зарплати із екселя, в коді видає наступну помилку:
&НаКлиенте
Процедура Прочитать(Команда)
//ПрочитатьНаСервере();
//очищаем таблицу и удаляем колонки
Таблица.Очистить();
Таблица.Колонки.Очистить();
ЭлементыФормы.Таблица.Колонки.Очистить();
//подключаемся к эксел
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(КаталогФайла);
Состояние("Обработка файла Microsoft Excel...");
Исключение
Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
//Открываем необходимый лист
Excel.Sheets(1).Select(); // лист 1, по умолчанию
Исключение
//Закрываем Excel
Excel.ActiveWorkbook.Close();
Excel = 0;
Сообщить("Файл "+Строка(КаталогФайла)+" не соответствует необходимому формату! Первый лист не найден!");
//ОтменитьТранзакцию();
Возврат;
КонецПопытки;
//Получим количество строк и колонок.
//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
Если Версия = "8" тогда
ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;
Конецесли;
//считываем первую строку и генерируем колонки
Сч = 1;
Пока ЗначениеЗаполнено(Excel.Cells(1, Сч).Text) Цикл
ИмяКолонки = Excel.Cells(1, Сч).Text;
ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ",""); // убираем из имени колонок пробелы
Таблица.Колонки.Добавить(ИмяБезПробелов,,ИмяКолонки);
НоваяКолонка = ЭлементыФормы.Таблица.Колонки.Добавить(ИмяБезПробелов, ИмяКолонки);
НоваяКолонка.Данные = ИмяБезПробелов;
Сч = Сч + 1;
КонецЦикла;
Для НС = 2 по ФайлСтрок Цикл // НС указываем с какой строки начинать обработку
Состояние("Файл "+Строка(КаталогФайла)+": Обрабатывается первый лист "+Строка(Формат(?(ФайлСтрок=0,0,((100*НС)/ФайлСтрок)),"ЧЦ=3; ЧДЦ=0"))+" %");
ОбработкаПрерыванияПользователя(); //указав данный оператор, цикл можно прервать в любой момент нажатие ctrl+break
НоваяСтрока = Таблица.Добавить();
Для НомерКолонки = 1 по Таблица.Колонки.Количество() Цикл
//заполняем строку значениями
ТекущееЗначение = Excel.Cells(НС, НомерКолонки).Text;
ИмяКолонки = Таблица.Колонки[НомерКолонки-1].Имя;
НоваяСтрока[ИмяКолонки] = ТекущееЗначение;
КонецЦикла;
КонецЦикла;
Excel.ActiveWorkbook.Close();
Excel = 0;
КонецПроцедуры
Переменная Таблица это что?
Код выше вообще какой-то странный, учитывая то, что в названии темы вы написали управляемые формы, потому что в управляемых формах нету ЭлементыФормы.
Если же не принимать во внимание странности с ЭлементыФормы в УФ и предположить, что вы добавили реквизит формы типа ТаблицаЗначений, который вывели на форму, то проблема в том, что обращаясь к своей таблице значений Таблица вы работаете не с таблицей значений, а с объектом, который её отображает в форме. А у этого объекта нету свойства Колонки, о чем вам система сообщает.
Что бы не заморачиваться - добавьте сразу все нужные колонки в реквизите формы и не создавайте их динамически.
Юля @ Вчера, 14:37
,
Рекомендую в синтаксис-помощнике сверяться с разделом Доступность:
&НаСервере
Процедура Прочитать(Команда)
//ПрочитатьНаСервере();
ТЗ=Новый ТаблицаЗначений;
//очищаем таблицу и удаляем колонки
Таблица.Очистить();
Таблица.Колонки.Очистить();
Элементы.Таблица.Колонки.Очистить();
//подключаемся к эксел
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(КаталогФайла);
Состояние("Обработка файла Microsoft Excel...");
Исключение
Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
//Открываем необходимый лист
Excel.Sheets(1).Select(); // лист 1, по умолчанию
Исключение
//Закрываем Excel
Excel.ActiveWorkbook.Close();
Excel = 0;
Сообщить("Файл "+Строка(КаталогФайла)+" не соответствует необходимому формату! Первый лист не найден!");
//ОтменитьТранзакцию();
Возврат;
КонецПопытки;
//Получим количество строк и колонок.
//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
Если Версия = "8" тогда
ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;
Конецесли;
//считываем первую строку и генерируем колонки
Сч = 1;
Пока ЗначениеЗаполнено(Excel.Cells(1, Сч).Text) Цикл
ИмяКолонки = Excel.Cells(1, Сч).Text;
ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ",""); // убираем из имени колонок пробелы
//Таблица.Колонки.Добавить(ИмяБезПробелов,,ИмяКолонки);
НоваяКолонка = ТЗ.Колонки.Добавить(ИмяБезПробелов, ИмяКолонки);
НоваяКолонка.Данные = ИмяБезПробелов;
Сч = Сч + 1;
КонецЦикла;
Для НС = 2 по ФайлСтрок Цикл // НС указываем с какой строки начинать обработку
Состояние("Файл "+Строка(КаталогФайла)+": Обрабатывается первый лист "+Строка(Формат(?(ФайлСтрок=0,0,((100*НС)/ФайлСтрок)),"ЧЦ=3; ЧДЦ=0"))+" %");
//ОбработкаПрерыванияПользователя(); //указав данный оператор, цикл можно прервать в любой момент нажатие ctrl+break
НоваяСтрока = ТЗ.Добавить();
Для НомерКолонки = 1 по Таблица.Колонки.Количество() Цикл
//заполняем строку значениями
ТекущееЗначение = Excel.Cells(НС, НомерКолонки).Text;
ИмяКолонки = ТЗ.Колонки[НомерКолонки-1].Имя;
НоваяСтрока[ИмяКолонки] = ТекущееЗначение;
КонецЦикла;
КонецЦикла;
Объект.Таблица.Очистить();
Объект.Таблица.Загрузить(ТЗ);
Excel.ActiveWorkbook.Close();
Excel = 0;
КонецПроцедуры
зачем читать файл на сервере? почему не на клиенте ?
если на клиенте,тогда пишет:
{ВнешняяОбработка.пкм_УниверсальнаяЗагрузкаИзExcel.Форма.Форма1.Форма(39,17)}: Тип не визначений (ТаблицаЗначений)
ТЗ=Новый <<?>>ТаблицаЗначений; (Перевірка: Тонкий клієнт)
а если на сервере:
ВнешняяОбработка.пкм_УниверсальнаяЗагрузкаИзExcel.Форма.Форма1.Форма(51,3)}: Процедура або функція з вказаним ім`ям не визначена (Состояние)
<<?>>Состояние("Обработка файла Microsoft Excel..."); (Перевірка: Сервер)
{ВнешняяОбработка.пкм_УниверсальнаяЗагрузкаИзExcel.Форма.Форма1.Форма(97,3)}: Процедура або функція з вказаним ім`ям не визначена (Состояние)
<<?>>Состояние("Файл "+Строка(КаталогФайла)+": Обрабатывается первый лист "+Строка(Формат(?(ФайлСтрок=0,0,((100*НС)/ФайлСтрок)),"ЧЦ=3; ЧДЦ=0"))+" %"); (Перевірка: Сервер)
sava1 @ Сегодня, 11:49
,
Я вижу вопрос автора и пытаюсь объяснить почему ошибка, может он захочет взять книгу по управляемым интерфейсам и познать Истину.
Решила как-то так:
&НаСервере
Процедура ПрочитатьНаСервере()
ТЗ=Новый ТаблицаЗначений;
//очищаем таблицу и удаляем колонки
//Таблица.Очистить();
//Таблица.Колонки.Очистить();
//Элементы.Таблица.Колонки.Очистить();
//подключаемся к эксел
Попытка
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(КаталогФайла);
Сообщить("Обработка файла Microsoft Excel...");
Исключение
Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!");
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Попытка
//Открываем необходимый лист
Excel.Sheets(1).Select(); // лист 1, по умолчанию
Исключение
//Закрываем Excel
Excel.ActiveWorkbook.Close();
Excel = 0;
Сообщить("Файл "+Строка(КаталогФайла)+" не соответствует необходимому формату! Первый лист не найден!");
//ОтменитьТранзакцию();
Возврат;
КонецПопытки;
//Получим количество строк и колонок.
//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
Если Версия = "8" тогда
ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column;
Конецесли;
//считываем первую строку и генерируем колонки
Сч = 1;
Пока ЗначениеЗаполнено(Excel.Cells(1, Сч).Text) Цикл
ИмяКолонки = Excel.Cells(1, Сч).Text;
ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ",""); // убираем из имени колонок пробелы
//Сообщить(""+ИмяБезПробелов);
//Таблица.Колонки.Добавить(ИмяБезПробелов,,ИмяКолонки);
ТЗ.Колонки.Добавить(ИмяБезПробелов);
//НоваяКолонка = Элементы.Таблица.Колонки.Добавить(ИмяБезПробелов, ИмяКолонки);
//НоваяКолонка.Данные = ИмяБезПробелов;
Сч = Сч + 1;
КонецЦикла;
Для НС = 2 по ФайлСтрок Цикл // НС указываем с какой строки начинать обработку
Сообщить("Файл "+Строка(КаталогФайла)+": Обрабатывается первый лист "+Строка(Формат(?(ФайлСтрок=0,0,((100*НС)/ФайлСтрок)),"ЧЦ=3; ЧДЦ=0"))+" %");
//ОбработкаПрерыванияПользователя(); //указав данный оператор, цикл можно прервать в любой момент нажатие ctrl+break
НоваяСтрока = ТЗ.Добавить();
Для НомерКолонки = 1 по ТЗ.Колонки.Количество() Цикл
//заполняем строку значениями
ТекущееЗначение = Excel.Cells(НС, НомерКолонки).Text;
ИмяКолонки = ТЗ.Колонки[НомерКолонки-1].Имя;
НоваяСтрока[ИмяКолонки] = ТекущееЗначение;
КонецЦикла;
КонецЦикла;
Объект.Таблица.Очистить();
Объект.Таблица.Загрузить(ТЗ);
Excel.ActiveWorkbook.Close();
Excel = 0;
КонецПроцедуры
&НаКлиенте
Процедура Прочитать()
// Вставити вміст обробника.
ПрочитатьНаСервере();
КонецПроцедуры
Юля @ Today, 12:54
,
Прикольно. На клиенте выбирается файл / каталог, а на сервере он читается? Серьезно?
Юля, перевожу сообщение от Petre: как только вы попробуете запустить обработку в клиент-серверном варианте, когда клиент и сервер это разные компьютеры, то работать она у вас перестанет.
В контексте этой темы есть вопрос, дабы не плодить темы спрошу тут.
Загрузка из эксель,
1) читаю в массив ( Sheet.UsedRange.Value.Выгрузить() ) несколько файлов (на тесте 10 файлов, ~10 000 строк в каждом * 30 колонок).
2) прочитанные данные каждого файла добавляю в общий массив.
3) общий массив отправляю на сервер, там все разбираю - создаю/обновляю объекты.
Все выполняется не быстро (минуты), переписал через ДлительныеОперации.ВыполнитьВФоне, но запуск выполняется дольше чем серверные процедуры.
По итогу замера производительности, передача данных с клиента на сервер больше 50% времени (и это один комп, между разными или веб еще ж хуже будет...).
Вопрос, как правильно в таком случае поступить? Как быстрее всего будет передать данные на сервер, уже прочитанные, по каждому файлу отдельно или все сразу как у меня?
! | https://pro1c.org.ua/index.php?act=announce&id=2: п.6 |
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua