Имя: Пароль:
1C
1С v8
Вопрос по основам управляемых форм...
, ,
0 ultrannge89
 
30.03.15
14:37
В общем гружу большой объем данных из exel
На обычном я делал так: Ну понятно, диалог выбора файла, выбор листа, потом данные формируются, и выводится большая тз в которой пользователь что-то делает, нажимает далее, и я обрабатываю и пишу например несколько документов.
А как быть с управляемыми?
Мне кажется все эти управляемые дают только то что, клиент и сервер будет обмениваться постоянно... А там файлик метров на 20...
1 ultrannge89
 
30.03.15
14:38
Так же из тз выводить в табличную часть?
2 ultrannge89
 
30.03.15
14:39
Просто, основная проблема в том что я бывает по 4 часа трачу, переделываю снова и снова, а потом оказывается что выход был ваще прост...)
3 ДенисЧ
 
30.03.15
14:40
ПРидётся гонять.
4 Desna
 
30.03.15
14:40
на клиенте все в тз загружаешь
5 ultrannge89
 
30.03.15
14:42
А через параметр запроса получить ТЧ тоже можно?
6 DrShad
 
30.03.15
14:45
(4) а на клиенте не существует ТЗ
7 Desna
 
30.03.15
14:45
+4 сорри, у меня не в тз, а в массив. и массив уже на сервере парсишь.
8 Desna
 
30.03.15
14:47
(6) да
9 KSN
 
30.03.15
14:48
Я обычно для этого массив структур использую. Заполняю на клиенте и гоню его на сервер для дальнейшей обработки.
10 ultrannge89
 
30.03.15
14:49
(9), извращенство какое то, видимо я совсем отстал от жизни, со своими обычными...
11 ultrannge89
 
30.03.15
14:50
Видимо придется в цикле для каждой строки таблицы значений, передавать структуру на клиента
12 DrShad
 
30.03.15
14:51
(11) нафига? на сервере и заполняй свою ТЗ
13 KSN
 
30.03.15
14:52
(11) Так зачем в цикле то??? Массивом все структуры за раз.
14 Desna
 
30.03.15
14:53
что откуда передать непонятно
15 ultrannge89
 
30.03.15
14:54
(13), Можешь кусок кода привести, а то как то не понимаю, кажется сложно будет создавать такой массив, а потом его на клиенте разбивать...
16 DrShad
 
30.03.15
14:55
(14) да что же тут непонятного? на клиенте читаем файл, передаем его на сервант, там преобразуем в ТЗ и выкидываем на форму - все просто
17 D_E_S_131
 
30.03.15
14:55
(13) Все надо проделывать на сервере, прекратите распространять "гомосню".
(14) Передаешь файл на сервер, там обрабатываешь и заполняешь ТЗ. Если надо что-то изменить ДО загрузки, то отображаешь ТЗ на форме.
18 ultrannge89
 
30.03.15
14:56
У меня функция чтения из exel серверная
19 D_E_S_131
 
30.03.15
14:56
+ (17) Изменения на форме передаешь обратно на сервер в ТЗ и уже окончательно создаешь документы (или что там у тебя).
20 Desna
 
30.03.15
14:57
(17) айяай как некрасиво читать файл на сервере, зачем понимаешь клиент тогда?
21 DrShad
 
30.03.15
14:58
(20) ну так ежели на серванте установлен офис :)))
22 DrShad
 
30.03.15
14:59
+(21) то это уже вовсе и не сервант, а почти что клиент
23 ultrannge89
 
30.03.15
15:01
&НаСервере
Функция ЗагрузитьМетодом_MSADODB(Знач ФайлEXCEL, Знач ИмяЛиста, Знач СтрокаЗаголовка = 1, НачСтрока = 0, КонСтрока = 0, КолвоСтрокExcel,
    Знач ПодключениеADODB = "MicrosoftJetOLEDB40") Экспорт
    Перем СonnectionString, ADODBConnection, ADODBRecordset, ТекстЗапроса;
    Перем КолвоКолонокExcel, Поле, Колонка, ИмяКолонки;
    Перем НоваяСтрока, НомерСтроки;
    Перем ТаблицаРезультат;
    
    Если ПодключениеADODB = "MicrosoftACEOLEDB12" Тогда
        СonnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;""";
    Иначе
        СonnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= "  + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""";
    КонецЕсли;
    
    Попытка
        ADODBConnection = Новый COMОбъект("ADODB.Connection");
        ADODBConnection.ConnectionString =  СonnectionString;
        ADODBConnection.Open();
        ADODBConnection.CursorLocation = 3;    // По-умолчанию 2.
    Исключение
        Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
        Возврат Новый ТаблицаЗначений;    // В случае ошибки возвращаем пустую таблицу значений.
    КонецПопытки;
    
    ТекстЗапроса = "SELECT * FROM [" + ИмяЛиста + "$]";
    
    Попытка
        ADODBRecordset = Новый COMОбъект("ADODB.Recordset");
        ADODBRecordset.Open(ТекстЗапроса, ADODBConnection);
        
        Если (ADODBRecordset.EOF ИЛИ ADODBRecordset.BOF) Тогда
            КолвоСтрокExcel = 0;
            Сообщить(НСтр("ru = '" + ИмяЛиста + ": не содержит данных.'"), СтатусСообщения.Внимание);
            ADODBRecordset.Close();
            ADODBConnection.Close();
            ADODBRecordset   = Неопределено;
            ADODBConnection = Неопределено;
            
            Возврат Новый ТаблицаЗначений;    // В случае ошибки возвращаем пустую таблицу значений.
        КонецЕсли;
        
        ADODBRecordset.AbsolutePage     = 1;
        ADODBRecordset.AbsolutePosition = 1;
    Исключение
        Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
        Возврат Новый ТаблицаЗначений;    // В случае ошибки возвращаем пустую таблицу значений.
    КонецПопытки;
    
    КолвоСтрокExcel = ADODBRecordset.RecordCount + 1;    // (+1) - учет Строки-Заголовока, которая "съедается".
    
    КолвоКолонокExcel = 8;
    
    Если КолвоСтрокExcel <= 2 Тогда
        КолвоСтрокExcel = 0;
        Сообщить(НСтр("ru = '" + ИмяЛиста + ": не содержит данных.'"), СтатусСообщения.Внимание);
        ADODBRecordset.Close();
        ADODBConnection.Close();
        ADODBRecordset   = Неопределено;
        ADODBConnection = Неопределено;
        
        Возврат Новый ТаблицаЗначений;    // В случае ошибки возвращаем пустую таблицу значений.
    КонецЕсли;
    
    ТаблицаРезультат = Новый ТаблицаЗначений;
    ТаблицаРезультат.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"), "№", 4);
    ТаблицаРезультат.Колонки.Добавить("Сопоставлено", Новый ОписаниеТипов("Булево"), "Сопоставлено", 1);
    Для ит = 1 ПО КолвоКолонокExcel Цикл
        
        Поле = ADODBRecordset.Fields.Item(ит - 1);
        ИмяКолонки = "К_" + ит;
        Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки, , СокрЛП(СтрЗаменить(Поле.Name, "#", ".")));
        
    КонецЦикла;
    
    НоваяСтрока = ТаблицаРезультат.Добавить();
    НоваяСтрока.НомерСтроки = 1;
    Для ит = 1 ПО КолвоКолонокExcel Цикл
        
        ИмяКолонки = "К_" + ит;
        Колонка = ТаблицаРезультат.Колонки.Найти(ИмяКолонки);
        НоваяСтрока[ИмяКолонки] = Колонка.Заголовок;
        
    КонецЦикла;
    
    
    НомерСтроки = 1;
    Пока ADODBRecordset.EOF() = 0 Цикл
        
        НомерСтроки = НомерСтроки + 1;
        
        Если НомерСтроки < НачСтрока Тогда    
            ADODBRecordset.MoveNext();            
            Продолжить;
        КонецЕсли;
        
        Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда                Прервать;
        КонецЕсли;
        
        НоваяСтрока = ТаблицаРезультат.Добавить();
        НоваяСтрока.НомерСтроки = НомерСтроки;
        
        Для ит = 1 ПО КолвоКолонокExcel Цикл
            
            Поле = ADODBRecordset.Fields.Item(ит - 1);
            
            Если Поле.ActualSize = 0 Тогда        
                Продолжить;
            КонецЕсли;
            
            ЗначениеЯчейки = Поле.Value;      
            
            ИмяКолонки = "К_" + ит;
            НоваяСтрока[ИмяКолонки] = ЗначениеЯчейки;
            
            ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина;
            ДлинаСтроки      = СтрДлина(СокрЛП(ЗначениеЯчейки));
            ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки);
            
        КонецЦикла;
        
        ADODBRecordset.MoveNext();  
        
    КонецЦикла;
    
    ADODBRecordset.Close();
    ADODBConnection.Close();
    ADODBRecordset   = Неопределено;
    ADODBConnection = Неопределено;
    
    Возврат ТаблицаРезультат;
    
КонецФункции
24 Krabobor
 
30.03.15
15:03
(0)
1. читаешь файл на клиенте (именно на клиенте, а не на сервере)
2. парсишь файл на сервере. делаешь то что тебе надо.
3. заполняешь реквизит формы с типом ТаблицаЗначений для действий юзера(проставление галочек, удаление лишнего).
4. по кнопке "создать документы" на сервере выгребаешь все из реквизитов формы и вертишь их как хочешь на сервере.
25 ultrannge89
 
30.03.15
15:04
(24), ок буду переделывать
26 D_E_S_131
 
30.03.15
15:05
(20) А кто-то запрещает это делать? Особенно если на клиенте только браузер с возможностью выбора файла.
27 ultrannge89
 
30.03.15
15:09
Просто не факт что на клиенте есть драйвер ado, а на сервер я поставил...
28 D_E_S_131
 
30.03.15
16:13
(27) Я этим "мастерам управляемых форм" тоже самое пытаюсь объяснить. Но они не слушают и топовой код тоже игнорят...