Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 4, свеженьких 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )

> загрузка из excel ( управляемые формы) 2 страниц V   1 2 >          
Юля Подменю пользователя
сообщение 19.07.18, 13:37
Сообщение #1

Оратор
*****
Группа: Пользователи
Сообщений: 398
Из: Хмельницький
Спасибо сказали: 19 раз
Рейтинг: 13

Привіт, допоможіть будь-ласка, пишу обробку загрузка зарплати із екселя, в коді видає наступну помилку:
&НаКлиенте
Процедура Прочитать(Команда)
    
    //ПрочитатьНаСервере();
    
    
    //очищаем таблицу и удаляем колонки
    Таблица.Очистить();
    Таблица.Колонки.Очистить();
    ЭлементыФормы.Таблица.Колонки.Очистить();
    
    
    //подключаемся к эксел
    Попытка
        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)}: Поле об`єкту не виявлено (Колонки)
Таблица.Колонки.Очистить();

Petre Подменю пользователя
сообщение 19.07.18, 13:46
Сообщение #2

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2649
Из: Київ, Україна
Спасибо сказали: 738 раз
Рейтинг: 716.6

Юля @ Today, 13:37 * ,
Що каже налагоджувач?


Signature
Допрацьовую:
- "Бухгалтерія для України 2.0";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

Vofka Подменю пользователя
сообщение 19.07.18, 13:50
Сообщение #3

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13178
Из: Киев
Спасибо сказали: 4001 раз
Рейтинг: 3136.2

Переменная Таблица это что?

Юля Подменю пользователя
сообщение 19.07.18, 13:54
Сообщение #4

Оратор
*****
Группа: Пользователи
Сообщений: 398
Из: Хмельницький
Спасибо сказали: 19 раз
Рейтинг: 13

Цитата(Vofka @ 19.07.18, 14:50) *
Переменная Таблица это что?

Таблица на форме, у меня есть форма в которою я считываю из екселя данные , а дальше загружаю их в документ начисление зарплаты

Vofka Подменю пользователя
сообщение 19.07.18, 15:29
Сообщение #5

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13178
Из: Киев
Спасибо сказали: 4001 раз
Рейтинг: 3136.2

Код выше вообще какой-то странный, учитывая то, что в названии темы вы написали управляемые формы, потому что в управляемых формах нету ЭлементыФормы.

Если же не принимать во внимание странности с ЭлементыФормы в УФ и предположить, что вы добавили реквизит формы типа ТаблицаЗначений, который вывели на форму, то проблема в том, что обращаясь к своей таблице значений Таблица вы работаете не с таблицей значений, а с объектом, который её отображает в форме. А у этого объекта нету свойства Колонки, о чем вам система сообщает.

Что бы не заморачиваться - добавьте сразу все нужные колонки в реквизите формы и не создавайте их динамически.

Сообщение отредактировал Vofka - 19.07.18, 15:30

Спасибо сказали: Юля,

andr_andrey Подменю пользователя
сообщение 20.07.18, 8:26
Сообщение #6

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 500
Спасибо сказали: 119 раз
Рейтинг: 95.5

Юля @ Вчера, 14:37 * ,
Рекомендую в синтаксис-помощнике сверяться с разделом Доступность:
Цитата
Доступность:

Сервер, толстый клиент, внешнее соединение.
Возможен обмен с сервером. Сериализуется. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}. Имя типа XDTO: ValueTable


Исходя из этого описания вы не можете в управляемых формах "НаКлиенте" использовать объект "ТаблицаЗначений".


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

Спасибо сказали: Юля,

sava1 Подменю пользователя
сообщение 20.07.18, 8:57
Сообщение #7

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2186
Из: Проскуров
Спасибо сказали: 524 раз
Рейтинг: 510.9

Цитата(andr_andrey @ 20.07.18, 9:26) *
вы не можете в управляемых формах "НаКлиенте" использовать объект "ТаблицаЗначений".


эт еще почему ? добавить в реквизит формы.

Юля Подменю пользователя
сообщение 20.07.18, 9:20
Сообщение #8

Оратор
*****
Группа: Пользователи
Сообщений: 398
Из: Хмельницький
Спасибо сказали: 19 раз
Рейтинг: 13

Цитата(Vofka @ 19.07.18, 16:29) *
ЭлементыФорм

это я уже исправила на "элементы", просто переписываю с 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.ActiveWorkbook.Close();     
        Excel = 0;
    

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

sava1 Подменю пользователя
сообщение 20.07.18, 9:22
Сообщение #9

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2186
Из: Проскуров
Спасибо сказали: 524 раз
Рейтинг: 510.9

зачем читать файл на сервере? почему не на клиенте ?

Юля Подменю пользователя
сообщение 20.07.18, 9:50
Сообщение #10

Оратор
*****
Группа: Пользователи
Сообщений: 398
Из: Хмельницький
Спасибо сказали: 19 раз
Рейтинг: 13

если на клиенте,тогда пишет:
{ВнешняяОбработка.пкм_УниверсальнаяЗагрузкаИзExcel.Форма.Форма1.Форма(39,17)}: Тип не визначений (ТаблицаЗначений)
ТЗ=Новый <<?>>ТаблицаЗначений; (Перевірка: Тонкий клієнт)

а если на сервере:

ВнешняяОбработка.пкм_УниверсальнаяЗагрузкаИзExcel.Форма.Форма1.Форма(51,3)}: Процедура або функція з вказаним ім`ям не визначена (Состояние)
<<?>>Состояние("Обработка файла Microsoft Excel..."); (Перевірка: Сервер)
{ВнешняяОбработка.пкм_УниверсальнаяЗагрузкаИзExcel.Форма.Форма1.Форма(97,3)}: Процедура або функція з вказаним ім`ям не визначена (Состояние)
<<?>>Состояние("Файл "+Строка(КаталогФайла)+": Обрабатывается первый лист "+Строка(Формат(?(ФайлСтрок=0,0,((100*НС)/ФайлСтрок)),"ЧЦ=3; ЧДЦ=0"))+" %"); (Перевірка: Сервер)

sava1 Подменю пользователя
сообщение 20.07.18, 10:03
Сообщение #11

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2186
Из: Проскуров
Спасибо сказали: 524 раз
Рейтинг: 510.9

Цитата(Юля @ 20.07.18, 10:50) *
Процедура або функція з вказаним ім`ям не визначена (Состояние)

на сервере нет куда выдавать состояние. есть сообщениепользователю.
тз на клиенте добавляем в реквизиты формы и читаем в нее. на сервере ее можно достать как данные формы.

Спасибо сказали: Юля,

andr_andrey Подменю пользователя
сообщение 20.07.18, 10:09
Сообщение #12

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 500
Спасибо сказали: 119 раз
Рейтинг: 95.5

Цитата(sava1 @ 20.07.18, 9:57) *
эт еще почему ? добавить в реквизит формы.

И в результате вы получите реквизит типа "ДанныеФормыКоллекция", а не "ТаблицаЗначений". Автор темы хочет получить доступ к коллекции "Колонки", которой нет у "ДанныеФормыКоллекция".
Лучше не уводить автора в дебри.


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

Юля Подменю пользователя
сообщение 20.07.18, 10:19
Сообщение #13

Оратор
*****
Группа: Пользователи
Сообщений: 398
Из: Хмельницький
Спасибо сказали: 19 раз
Рейтинг: 13

faceoff.gif 09000000.gif

sava1 Подменю пользователя
сообщение 20.07.18, 10:49
Сообщение #14

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2186
Из: Проскуров
Спасибо сказали: 524 раз
Рейтинг: 510.9

Цитата(andr_andrey @ 20.07.18, 11:09) *
втор темы хочет получить доступ к коллекции "Колонки"

Вы лично встречали вариант, когда надо при чтении из екселя что-то "лепить" с колонками ? Ну кроме универсальных обработок ?
Автору на 99% достаточно "жесткой" тз. А весь этот код вооще скопипастен.

andr_andrey Подменю пользователя
сообщение 20.07.18, 11:22
Сообщение #15

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 500
Спасибо сказали: 119 раз
Рейтинг: 95.5

sava1 @ Сегодня, 11:49 * ,
Я вижу вопрос автора и пытаюсь объяснить почему ошибка, может он захочет взять книгу по управляемым интерфейсам и познать Истину.


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

Спасибо сказали: Юля,

Юля Подменю пользователя
сообщение 24.07.18, 12:54
Сообщение #16

Оратор
*****
Группа: Пользователи
Сообщений: 398
Из: Хмельницький
Спасибо сказали: 19 раз
Рейтинг: 13

Решила как-то так:

&НаСервере
Процедура ПрочитатьНаСервере()
    
    ТЗ=Новый ТаблицаЗначений;    
    
    //очищаем таблицу и удаляем колонки
    //Таблица.Очистить();
    //Таблица.Колонки.Очистить();
    //Элементы.Таблица.Колонки.Очистить();
    
    
    //подключаемся к эксел
    Попытка
        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;
    

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

&НаКлиенте
Процедура Прочитать()
    // Вставити вміст обробника.
     ПрочитатьНаСервере();
КонецПроцедуры


Сообщение отредактировал Vofka - 24.07.18, 13:51

Petre Подменю пользователя
сообщение 24.07.18, 13:10
Сообщение #17

Живет на форуме
Иконка группы
Группа: Местный
Сообщений: 2649
Из: Київ, Україна
Спасибо сказали: 738 раз
Рейтинг: 716.6

Юля @ Today, 12:54 * ,
Прикольно. На клиенте выбирается файл / каталог, а на сервере он читается? Серьезно?


Signature
Допрацьовую:
- "Бухгалтерія для України 2.0";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія".

Юля Подменю пользователя
сообщение 24.07.18, 13:46
Сообщение #18

Оратор
*****
Группа: Пользователи
Сообщений: 398
Из: Хмельницький
Спасибо сказали: 19 раз
Рейтинг: 13

Petre @ Сегодня, 14:10 * ,
Да)))

Vofka Подменю пользователя
сообщение 24.07.18, 13:55
Сообщение #19

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13178
Из: Киев
Спасибо сказали: 4001 раз
Рейтинг: 3136.2

Юля, перевожу сообщение от Petre: как только вы попробуете запустить обработку в клиент-серверном варианте, когда клиент и сервер это разные компьютеры, то работать она у вас перестанет.

demon14 Подменю пользователя
сообщение 28.11.19, 17:48
Сообщение #20

Общительный
**
Группа: Пользователи
Сообщений: 10
Из: Київ
Спасибо сказали: 0 раз
Рейтинг: 0

В контексте этой темы есть вопрос, дабы не плодить темы спрошу тут.

Загрузка из эксель,

1) читаю в массив ( Sheet.UsedRange.Value.Выгрузить() ) несколько файлов (на тесте 10 файлов, ~10 000 строк в каждом * 30 колонок).
2) прочитанные данные каждого файла добавляю в общий массив.
3) общий массив отправляю на сервер, там все разбираю - создаю/обновляю объекты.

Все выполняется не быстро (минуты), переписал через ДлительныеОперации.ВыполнитьВФоне, но запуск выполняется дольше чем серверные процедуры.

По итогу замера производительности, передача данных с клиента на сервер больше 50% времени (и это один комп, между разными или веб еще ж хуже будет...).

Вопрос, как правильно в таком случае поступить? Как быстрее всего будет передать данные на сервер, уже прочитанные, по каждому файлу отдельно или все сразу как у меня?

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


2 страниц V   1 2 >
Тема закрыта Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 14.12.19, 7:01
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!