Имя: Пароль:
1C
1С v8
Управляемое приложение. Создание номенклатуры
,
0 DrLivsey
 
12.12.11
16:20
Есть периодическая задача по созданию существенных (более 20 тыс) новых номенклатурных позиций.

В архитектуре "Обычное приложение" всё грузится шустро.
В архитектуре "Управляемое приложение" после создания некоего количества элементов наблюдаются усиливающиеся тормоза.

Порядок создания
1. функция с директивой "на клиенте" собирает структуру со всем параметрами для создания.
2. вызывается функцию с директивой "на сервере", которая из модуля объекта обработки вызывает функцию с директивой "на сервере", которая собственно уже и создает элемент.

Всё это вызывается для каждой строки считываемого файла.
Или надо переделать что файл считывается в некую структуру и отправляется "на сервер" и уже там всё создается?
1 Defender aka LINN
 
12.12.11
16:23
"Всё это вызывается для каждой строки считываемого файла." - расстрелять.
Передай файл на сервер и делай там с ним что хочешь.
2 fyn
 
12.12.11
16:37
(1) наверное такое решение было принято для отображения текущего состояния процесса , но в целом согласен - расстрелять
3 DrLivsey
 
12.12.11
16:42
Процесс смотреть не нужно.
Файл Excel, считывается через COMОбъект("ADODB.CONNECTION")

Поподробнее про передачу на сервер можно? То, что построчно надо переделать согласен, предполагал так и поступить, интересен способ передачи.
4 Defender aka LINN
 
12.12.11
16:42
(2) Проживут без отображения, ничего страшного :)
5 Amra
 
12.12.11
16:44
(3) Массив масиввов например)
6 fyn
 
12.12.11
16:44
(3) если на сервере есть офис, то и парсите его на сервере )
7 Defender aka LINN
 
12.12.11
16:44
(3) Сейчас будет ВНЕЗАПНО:

&НаКлиенте
Процедура ВыполнитьЧтоТоТам()
   ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
   НекаяСервернаяПроцедура(ДвоичныеДанные);
КонецПроцедуры
8 DrLivsey
 
12.12.11
16:46
(6) и (7) На сервере офиса нет и не будет, ибо он там не нужен.

Так что придется передавать массив (или структуру) из структур.
9 Defender aka LINN
 
12.12.11
16:47
(8) Можно ТЗ заполнить, например.
10 DrLivsey
 
12.12.11
16:49
Таблица значений не выйдет
Доступность:
Сервер, толстый клиент, внешнее соединение.
11 fyn
 
12.12.11
16:52
(8) в веб-клиенте тоже не факт, что всегда будет офис
12 Gisborn
 
12.12.11
16:58
Прочитай в COMSafeArray и его передай на сервер:

Область = ЛистЭксель.Range(ЛистЭксель.Cells(НомерПервойСтроки,НомерПервойКолонки), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
Данные = Область.Value.Выгрузить();
13 Defender aka LINN
 
12.12.11
17:11
(10) Зато ТаблицаФормы есть
14 DrLivsey
 
12.12.11
18:02
Всем спасибо.
Переписал с отправкой на сервер результатов считывания всего файла и разбора этих результатов уже на сервере.  Всё заработало шустро.
15 zavsom
 
12.12.11
18:28
у меня вопрос: написал для СРМ обработку загрузки из эксель файла контрагентов, деаю все то же самое для конфы УТ 11.0.6.9 - не  запускается - ЧЯДНТ ? стал переписывать под управляемое приложение - ругется на всем вот пример:

Перем ЗнЯч1,ЗнЯч2,ЗнЯч3,ЗнЯч4, ЗнЯч5,ЗнЯч6;


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


Процедура ИмяНачалоВыбора(Элемент, СтандартнаяОбработка)
    ВыборФайла(Элемент);
КонецПроцедуры

Процедура КнопкаВыполнитьНажатие(Кнопка)
   
    Товар       = Справочники.Номенклатура;
    ЕдИзм       = Справочники.ЕдиницыИзмерения;
   
   
   
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(фИмяФайлаИсточника);
        Состояние("Обработка файла Microsoft Excel...");
        ExcelЛист = Excel.Sheets(1);
    Исключение
        Сообщить("Ошибка. Возможно неверно указан номер листа книги Excel.");
    КонецПопытки;
   
    НазвЭл="";
    Производитель="";
    ПроизводительНомер="";
    Комментарии="";
    Комментарии2="";
    Комментарии3="";
   
    СчетчикЗагрузки=0;
    Кол_воСтрок=конТЧ-начТЧ+1;
    Для инд1=1 По Кол_воСтрок Цикл
       
       
        ЗнЯч1=СокрЛП(Строка(ExcelЛист.Cells(начТЧ+инд1-1,П1).Value));
        Если ЗначениеЗаполнено(ЗнЯч1)=1 Тогда
            НазвЭл=ЗнЯч1;
        КонецЕсли;    
       
        ЗнЯч2=СокрЛП(Строка(ExcelЛист.Cells(начТЧ+инд1-1,П2).Value));
        Если ЗначениеЗаполнено(ЗнЯч2)=1 Тогда
            Производитель=ЗнЯч2;
        КонецЕсли;
       
       
        ЗнЯч3=СокрЛП(Строка(ExcelЛист.Cells(начТЧ+инд1-1,П3).Value));
        Если ЗначениеЗаполнено(ЗнЯч3)=1 Тогда
            ПроизводительНомер=ЗнЯч3;
        КонецЕсли;    
       
       
        ЗнЯч4=СокрЛП(Строка(ExcelЛист.Cells(начТЧ+инд1-1,П4).Value));
        Если ЗначениеЗаполнено(ЗнЯч4)=1 Тогда
            Комментарии=ЗнЯч4;
        КонецЕсли;
       
        ЗнЯч5=СокрЛП(Строка(ExcelЛист.Cells(начТЧ+инд1-1,П5).Value));
        Если ЗначениеЗаполнено(ЗнЯч5)=1 Тогда
            Комментарии2=ЗнЯч5;
        КонецЕсли;
       
        ЗнЯч6=СокрЛП(Строка(ExcelЛист.Cells(начТЧ+инд1-1,П6).Value));
        Если ЗначениеЗаполнено(ЗнЯч6)=1 Тогда
            Комментарии3=ЗнЯч6;
        КонецЕсли;
       
       
        НайденнаяСсылка = Товар.НайтиПоНаименованию(НазвЭл);
        Если НайденнаяСсылка = Товар.ПустаяСсылка() Тогда
            Сообщить("Товара с таким наименованием """ + НазвЭл + """ еще нет, будет создан");
           
            НовыйОбъект = Товар.СоздатьЭлемент();
            НовыйОбъект.Наименование       = НазвЭл;
           
            //*** запишем единицу измерения
            НайденнаяСсылка1 = ЕдИзм.НайтиПоНаименованию("шт");
            Если НайденнаяСсылка1 = ЕдИзм.ПустаяСсылка() Тогда
                Сообщить("Такой единицы - шт -  нет ");
            Иначе
                НовыйОбъект.ЕдиницаИзмерения=НайденнаяСсылка1.Ссылка;
               
               
            КонецЕсли;
            НовыйОбъект.Записать();
           
        Иначе
            Сообщить("Товар такой есть в базе уже! "+НазвЭл);
        КонецЕсли;
       
       
       
        состояние(инд1);
        СчетчикЗагрузки=СчетчикЗагрузки+1;
       
       
       
       
       
       
        НазвЭл="";
        Производитель="";
        ПроизводительНомер="";
        Комментарии="";
        Комментарии2="";
        Комментарии3="";
       
       
    КонецЦикла;
   
   
   
   
   
   
    Excel.WorkBooks.Close();
    Excel = 0;
   
   
КонецПроцедуры
16 zavsom
 
12.12.11
18:31
а вот тот же пример под управляемые формы:

 Перем ЗнЯч1,ЗнЯч2,ЗнЯч3,ЗнЯч4, ЗнЯч5,ЗнЯч6;

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

&НаКлиенте
Процедура Команда1(Команда)
   // Вставить содержимое обработчика.
   //Сообщить("Нажали кнопку");
   Предупреждение(" Нажали на кнопку ");
   
   Товар       = Справочники.Номенклатура;
   ЕдИзм       = Справочники.ЕдиницыИзмерения;
   
   
   
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(фИмяФайлаИсточника);
        Состояние("Обработка файла Microsoft Excel...");
        ExcelЛист = Excel.Sheets(1);
    Исключение
        Сообщить("Ошибка. Возможно неверно указан номер листа книги Excel.");
    КонецПопытки;
   
    НазвЭл="";
    Производитель="";
    ПроизводительНомер="";
    Комментарии="";
    Комментарии2="";
    Комментарии3="";
   
    СчетчикЗагрузки=0;
    Кол_воСтрок=конТЧ-начТЧ+1;
    Для инд1=1 По Кол_воСтрок Цикл
       
       
        ЗнЯч1=СокрЛП(Строка(ExcelЛист.Cells(начТЧ+инд1-1,П1).Value));
        Если ЗначениеЗаполнено(ЗнЯч1)=1 Тогда
            НазвЭл=ЗнЯч1;
        КонецЕсли;    
       
        ЗнЯч2=СокрЛП(Строка(ExcelЛист.Cells(начТЧ+инд1-1,П2).Value));
        Если ЗначениеЗаполнено(ЗнЯч2)=1 Тогда
            Производитель=ЗнЯч2;
        КонецЕсли;
       
       
        ЗнЯч3=СокрЛП(Строка(ExcelЛист.Cells(начТЧ+инд1-1,П3).Value));
        Если ЗначениеЗаполнено(ЗнЯч3)=1 Тогда
            ПроизводительНомер=ЗнЯч3;
        КонецЕсли;    
       
       
        ЗнЯч4=СокрЛП(Строка(ExcelЛист.Cells(начТЧ+инд1-1,П4).Value));
        Если ЗначениеЗаполнено(ЗнЯч4)=1 Тогда
            Комментарии=ЗнЯч4;
        КонецЕсли;
       
        ЗнЯч5=СокрЛП(Строка(ExcelЛист.Cells(начТЧ+инд1-1,П5).Value));
        Если ЗначениеЗаполнено(ЗнЯч5)=1 Тогда
            Комментарии2=ЗнЯч5;
        КонецЕсли;
       
        ЗнЯч6=СокрЛП(Строка(ExcelЛист.Cells(начТЧ+инд1-1,П6).Value));
        Если ЗначениеЗаполнено(ЗнЯч6)=1 Тогда
            Комментарии3=ЗнЯч6;
        КонецЕсли;
       
       
        НайденнаяСсылка = Товар.НайтиПоНаименованию(НазвЭл);
        Если НайденнаяСсылка = Товар.ПустаяСсылка() Тогда
           Сообщить("Товара с таким наименованием """ + НазвЭл + """ еще нет, будет создан");
           
           НовыйОбъект = Товар.СоздатьЭлемент();
           НовыйОбъект.Наименование       = НазвЭл;
           
           //*** запишем единицу измерения
           НайденнаяСсылка1 = ЕдИзм.НайтиПоНаименованию("шт");
           Если НайденнаяСсылка1 = ЕдИзм.ПустаяСсылка() Тогда
                Сообщить("Такой единицы - шт -  нет ");
           Иначе
                НовыйОбъект.ЕдиницаИзмерения=НайденнаяСсылка1.Ссылка;
               
               
           КонецЕсли;
           НовыйОбъект.Записать();
           
        Иначе
           Сообщить("Товар такой есть в базе уже! "+НазвЭл);
        КонецЕсли;
       
       
       
        состояние(инд1);
        СчетчикЗагрузки=СчетчикЗагрузки+1;
       
       
       
       
       
       
        НазвЭл="";
        Производитель="";
        ПроизводительНомер="";
        Комментарии="";
        Комментарии2="";
        Комментарии3="";
       
       
    КонецЦикла;
   
   
   
   
   
   
    Excel.WorkBooks.Close();
    Excel = 0;

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

&НаКлиенте
Процедура фИмяФайлаИсточникаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
   // Вставить содержимое обработчика.
    ВыборФайла(Элемент);
КонецПроцедуры


а вот какие ошибки пишет сразу же при синтаксис контроле:

{Форма.Форма.Форма(30,16)}: Переменная не определена (Справочники)
   Товар       = <<?>>Справочники.Номенклатура; (Проверка: Тонкий клиент)
{Форма.Форма.Форма(31,16)}: Переменная не определена (Справочники)
   ЕдИзм       = <<?>>Справочники.ЕдиницыИзмерения; (Проверка: Тонкий клиент)

тут я вообще приуныл - ниче не понимаю...
17 zavsom
 
13.12.11
11:04
гз
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.