Привіт, допоможіть будь-ласка, пишу обробку загрузка зарплати із екселя, в коді видає наступну помилку:
&НаКлиенте Процедура Прочитать(Команда)
//ПрочитатьНаСервере();
//очищаем таблицу и удаляем колонки Таблица.Очистить(); Таблица.Колонки.Очистить(); ЭлементыФормы.Таблица.Колонки.Очистить();
//подключаемся к эксел Попытка 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;
КонецПроцедуры
err^ {ВнешняяОбработка.пкм_УниверсальнаяЗагрузкаИзExcel.Форма.Форма1.Форма(42)}: Поле об`єкту не виявлено (Колонки) Таблица.Колонки.Очистить();
Группа: Основатель
Сообщений: 13983
Из: Киев
Спасибо сказали: 4553 раз
Рейтинг: 3682.7
Код выше вообще какой-то странный, учитывая то, что в названии темы вы написали управляемые формы, потому что в управляемых формах нету ЭлементыФормы.
Если же не принимать во внимание странности с ЭлементыФормы в УФ и предположить, что вы добавили реквизит формы типа ТаблицаЗначений, который вывели на форму, то проблема в том, что обращаясь к своей таблице значений Таблица вы работаете не с таблицей значений, а с объектом, который её отображает в форме. А у этого объекта нету свойства Колонки, о чем вам система сообщает.
Что бы не заморачиваться - добавьте сразу все нужные колонки в реквизите формы и не создавайте их динамически.
Группа: Местный
Сообщений: 631
Спасибо сказали: 168 раз
Рейтинг: 133.4
Юля @ Вчера, 14:37
, Рекомендую в синтаксис-помощнике сверяться с разделом Доступность:
Цитата
Доступность:
Сервер, толстый клиент, внешнее соединение. Возможен обмен с сервером. Сериализуется. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}. Имя типа XDTO: ValueTable
Исходя из этого описания вы не можете в управляемых формах "НаКлиенте" использовать объект "ТаблицаЗначений".
#define private public enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day
это я уже исправила на "элементы", просто переписываю с 1.2 на 2.0 (2.0 только учу)
а если сделать через виртуальную таблицу, а потом передавать в таблицу данные? как то так:
&НаСервере
Процедура Прочитать(Команда)
//ПрочитатьНаСервере(); ТЗ=Новый ТаблицаЗначений;
//очищаем таблицу и удаляем колонки Таблица.Очистить(); Таблица.Колонки.Очистить(); Элементы.Таблица.Колонки.Очистить();
//подключаемся к эксел Попытка 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.Форма.Форма1.Форма(39,17)}: Тип не визначений (ТаблицаЗначений) ТЗ=Новый <<?>>ТаблицаЗначений; (Перевірка: Тонкий клієнт)
а если на сервере:
ВнешняяОбработка.пкм_УниверсальнаяЗагрузкаИзExcel.Форма.Форма1.Форма(51,3)}: Процедура або функція з вказаним ім`ям не визначена (Состояние) <<?>>Состояние("Обработка файла Microsoft Excel..."); (Перевірка: Сервер) {ВнешняяОбработка.пкм_УниверсальнаяЗагрузкаИзExcel.Форма.Форма1.Форма(97,3)}: Процедура або функція з вказаним ім`ям не визначена (Состояние) <<?>>Состояние("Файл "+Строка(КаталогФайла)+": Обрабатывается первый лист "+Строка(Формат(?(ФайлСтрок=0,0,((100*НС)/ФайлСтрок)),"ЧЦ=3; ЧДЦ=0"))+" %"); (Перевірка: Сервер)
Процедура або функція з вказаним ім`ям не визначена (Состояние)
на сервере нет куда выдавать состояние. есть сообщениепользователю. тз на клиенте добавляем в реквизиты формы и читаем в нее. на сервере ее можно достать как данные формы.
Группа: Местный
Сообщений: 631
Спасибо сказали: 168 раз
Рейтинг: 133.4
Цитата(sava1 @ 20.07.18, 9:57)
эт еще почему ? добавить в реквизит формы.
И в результате вы получите реквизит типа "ДанныеФормыКоллекция", а не "ТаблицаЗначений". Автор темы хочет получить доступ к коллекции "Колонки", которой нет у "ДанныеФормыКоллекция". Лучше не уводить автора в дебри.
#define private public enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day
втор темы хочет получить доступ к коллекции "Колонки"
Вы лично встречали вариант, когда надо при чтении из екселя что-то "лепить" с колонками ? Ну кроме универсальных обработок ? Автору на 99% достаточно "жесткой" тз. А весь этот код вооще скопипастен.
Группа: Местный
Сообщений: 631
Спасибо сказали: 168 раз
Рейтинг: 133.4
sava1 @ Сегодня, 11:49
, Я вижу вопрос автора и пытаюсь объяснить почему ошибка, может он захочет взять книгу по управляемым интерфейсам и познать Истину.
#define private public enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day
//очищаем таблицу и удаляем колонки //Таблица.Очистить(); //Таблица.Колонки.Очистить(); //Элементы.Таблица.Колонки.Очистить();
//подключаемся к эксел Попытка 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].Имя; НоваяСтрока[ИмяКолонки] = ТекущееЗначение; КонецЦикла;
Группа: Основатель
Сообщений: 13983
Из: Киев
Спасибо сказали: 4553 раз
Рейтинг: 3682.7
Юля, перевожу сообщение от Petre: как только вы попробуете запустить обработку в клиент-серверном варианте, когда клиент и сервер это разные компьютеры, то работать она у вас перестанет.
Группа: Пользователи
Сообщений: 10
Из: Київ
Спасибо сказали: 0 раз
Рейтинг: 0
В контексте этой темы есть вопрос, дабы не плодить темы спрошу тут.
Загрузка из эксель,
1) читаю в массив ( Sheet.UsedRange.Value.Выгрузить() ) несколько файлов (на тесте 10 файлов, ~10 000 строк в каждом * 30 колонок). 2) прочитанные данные каждого файла добавляю в общий массив. 3) общий массив отправляю на сервер, там все разбираю - создаю/обновляю объекты.
Все выполняется не быстро (минуты), переписал через ДлительныеОперации.ВыполнитьВФоне, но запуск выполняется дольше чем серверные процедуры.
По итогу замера производительности, передача данных с клиента на сервер больше 50% времени (и это один комп, между разными или веб еще ж хуже будет...).
Вопрос, как правильно в таком случае поступить? Как быстрее всего будет передать данные на сервер, уже прочитанные, по каждому файлу отдельно или все сразу как у меня?
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!