Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Загрузить эксель файл в СКД

Загрузить эксель файл в СКД
Я
   Тессеракт
 
22.01.21 - 12:06
Добрый всем день!
Нашел аналогичную тему Сопоставить два эксель файла , вот только там тема сис... ну то есть, в общем, тема не раскрыта!
То, что эксельник надо прочитать, потом как объект передать в скд я понимаю. Но чтение эксельника происходит на клиенте с передачей на сервер, а в скд сгенерированную ТЗ можно подгрузить только из модуля объекта.
Это значит, что получить эксельник я с модуля объекта не могу, значит мне надо либо
1) загрузить ТЗ из модуля формы в СКД
2) передать ТЗ из модуля формы в модуль объекта. Как я понимаю, РеквизитФормыВЗначение - он может только подцепить процедуру из модуля объекта.

Я кнопку на форме отчета добавил для загрузки эксельника. Т.е по логике- загружаем эксельник, он читается в реквизит формы ТЗ, потом жмем сформировать и ТЗ из формы надо как то перенести.


Эксельник вот так получаю:
&НаКлиенте
Процедура ПодгрузитьБП(Команда,ТаблицаДанныхБП)
    БП666(ТаблицаДанныхБП);        
КонецПроцедуры
&НаКлиенте
Процедура БП666(ТаблицаДанныхБП)  //эксельник от ИР
    Режим = РежимДиалогаВыбораФайла.Открытие;
    Диалог = Новый ДиалогВыбораФайла(Режим);
    ИмяФайла = Диалог.ПолноеИмяФайла;
    Фильтр = "Файл Эксель(*.xlsx)|*.xlsx";                
    Диалог.Фильтр = Фильтр;
    Диалог.МножественныйВыбор = Ложь;
    Диалог.Заголовок = "Выберите файл выгрузки из БП";
    Если Диалог.Выбрать() Тогда
        ИмяФайла = Диалог.ПолноеИмяФайла;  
    КонецЕсли;
    Файл = Новый Файл(ИмяФайла);
    Если НЕ Файл.Существует() Тогда
        Возврат;
    КонецЕсли;
    ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
    ДокументРезультат = EXCELВТаблицуЗначенийБП666(ДвоичныеДанные, Файл.Расширение);
    //ДокументРезультат.Показать();
КонецПроцедуры
&НаСервере
Функция EXCELВТаблицуЗначенийБП666(ДвоичныеДанные, Расширение)    
    ФайлEXCELНаСервере = ПолучитьИмяВременногоФайла(Расширение);
    ДвоичныеДанные.Записать(ФайлEXCELНаСервере);    
    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.Прочитать(ФайлEXCELНаСервере);
    УдалитьФайлы(ФайлEXCELНаСервере);
    ОбластьТаблицы = ТабличныйДокумент.Область(4, 2, ТабличныйДокумент.ВысотаТаблицы, ТабличныйДокумент.ШиринаТаблицы);    
    ПостроительЗапроса = Новый ПостроительЗапроса;
    ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьТаблицы);  
    ПостроительЗапроса.Выполнить();
    ТаблицаДанныхБП = ПостроительЗапроса.Результат.Выгрузить();
    ХХХ.Очистить();
    Для каждого стр из ТаблицаДанныхБП Цикл
        Если НЕ ЗначениеЗаполнено(стр.НоменБП) Тогда
            Прервать;    //Продолжить;
        КонецЕсли;
        НовСтрока = ХХХ.Добавить();
        ЗаполнитьЗначенияСвойств(НовСтрока,стр);
        Если ЗначениеЗаполнено(стр.СумОбКтБп) Тогда
            Если ТипЗнч(стр.СумОбКтБп) = Тип("Число") Тогда
                НовСтрока.СумОбКтБп = стр.СумОбКтБп;
            ИначеЕсли ТипЗнч(стр.СумОбКтБп) = Тип("Строка") Тогда
                Попытка
                    НовСтрока.СумОбКтБп = Число(стр.СумОбКтБп);
                Исключение
                КонецПопытки;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    ТаблХХХ = ХХХ.Выгрузить();
    
    Возврат  ТаблицаЗначенийВТабличныйДокументБП666(ТаблицаДанныхБП);
КонецФункции
&НаСервереБезКонтекста
Функция ТаблицаЗначенийВТабличныйДокументБП666(ТаблицаДанныхБП)    
    ПостроительОтчета = Новый ПостроительОтчета;
    ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблицаДанныхБП);
    ДокументРезультатБП = Новый ТабличныйДокумент;
    Построительотчета.Вывести(ДокументРезультатБП);

    Возврат ДокументРезультатБП;    
КонецФункции
   DrShad
 
1 - 22.01.21 - 12:12
продолжайте наблюдения и держите нас в курсе
   ДенисЧ
 
2 - 22.01.21 - 12:12
Вступление есть.
Где развитие? Где кульминация? Где катарсис, наконец?
   Тессеракт
 
3 - 22.01.21 - 12:18
блин. (1) (2) мужики, не глумитесь) по запаре вопрос то не задал даже)
   Тессеракт
 
4 - 22.01.21 - 12:19
а по теме: как мне полученную ТЗ передать в СКД? (1) (2)
   toypaul
 
5 - 22.01.21 - 12:21
временное хранилище в школе проходили?
   Kassern
 
6 - 22.01.21 - 12:22
(0) что мешает передать двоичные данные экселя на сервер там его обработать в ТЗ. А далее это ТЗ передать в набор данных- объект в СКД? Ну или тупо параметром во временную таблицу запроса СКД, тут уж что тебе нужнее
   DrShad
 
7 - 22.01.21 - 12:22
либо массив структур
   acht
 
8 - 22.01.21 - 12:24
(4)
- Выбросить все свое нахер
- Передать файл xls на сервер, сделать из него таблицу значений, полжить во временное хранилище, вернуть на клиента адрес
- Положить адрес в дополнительные данные настроек компоновки
- В обработчике компоновки результата достать таблицу из хранилища, скомпоновать результат
   acht
 
9 - 22.01.21 - 12:33
Или даже вообще за один вызов. Сразу передать на сервер файл, текущие схему и настройки компоновки, там скомпоновать, вернуть обратно табличный документ.
Ну с расшифровкой возможно проблемы будут...
   Тессеракт
 
10 - 22.01.21 - 12:36
(8) подскажите пожалуйста "Положить адрес в дополнительные данные настроек компоновки" каким образом?
   Вафель
 
11 - 22.01.21 - 12:41
КомпоновщикНастроек.ДополнительныеСвойства.Вставить("Адрес", Адрес)

   Тессеракт
 
12 - 22.01.21 - 12:50
(11) (8) в модуле формы на сервере положил во временное хранилище.
На клиенте, после вызова сервера, достал из хранилища, по заветам (11) выдало ошибку : Переменная не определена (КомпоновщикНастроек)
   acht
 
13 - 22.01.21 - 12:55
(12) Это свойство основого реквизита формы
   Вафель
 
14 - 22.01.21 - 12:55
форма отчета?
   Тессеракт
 
15 - 22.01.21 - 12:56
(14) да
   Тессеракт
 
16 - 22.01.21 - 12:57
(14) ЭтотОбъект.Отчет.КомпоновщикНастроек.ДополнительныеСвойства.Вставить("Адрес", АдресХранилища); вот так может?
   Вафель
 
17 - 22.01.21 - 13:19
нужно не на клиенте, в модуле отчёта При Компоновке Результата
   Тессеракт
 
18 - 22.01.21 - 13:30
(17) я в модуле формы наСервере помещаю ТЗ:
    ТаблицаДанныхБП = ПостроительЗапроса.Результат.Выгрузить();  //тз

    АдресХранилища = ПоместитьВоВременноеХранилище(ТаблицаДанныхБП,ЭтаФорма.УникальныйИдентификатор);

далее наКлиенте получаю:
    ПротоколПереноса = ПолучитьИзВременногоХранилища(АдресХранилища);
Потом в модуле объекта передаю в СКД:
        КомпоновщикНастроек.ДополнительныеСвойства.Вставить("Адрес", ПротоколПереноса);
так?

Выдает ошибку на клиенте
{ВнешнийОтчет.СверкаУТиБПпоСебестоимостиПродаж.Форма.ФормаОтчета.Форма(25)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)
    ПротоколПереноса = ПолучитьИзВременногоХранилища(АдресХранилища);
по причине:
Несоответствие типов (параметр номер '1')
   acht
 
19 - 22.01.21 - 13:50
(18) > так?
Нет не так. Оперируй только адресом.
   Тессеракт
 
20 - 22.01.21 - 14:37
(19) (17) получилось. Я адрес реквизитом сделал и через него передал. Спасибо) осталось только сформировать запрос в модуле, сравнить с тз по полному соединению и передать уже в скд) Но это уже совсем другая история))

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.