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

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


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

    Возврат ДокументРезультатБП;    
КонецФункции
1 DrShad
 
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)
5 toypaul
 
гуру
22.01.21
12:21
временное хранилище в школе проходили?
6 Kassern
 
22.01.21
12:22
(0) что мешает передать двоичные данные экселя на сервер там его обработать в ТЗ. А далее это ТЗ передать в набор данных- объект в СКД? Ну или тупо параметром во временную таблицу запроса СКД, тут уж что тебе нужнее
7 DrShad
 
22.01.21
12:22
либо массив структур
8 acht
 
22.01.21
12:24
(4)
- Выбросить все свое нахер
- Передать файл xls на сервер, сделать из него таблицу значений, полжить во временное хранилище, вернуть на клиента адрес
- Положить адрес в дополнительные данные настроек компоновки
- В обработчике компоновки результата достать таблицу из хранилища, скомпоновать результат
9 acht
 
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) выдало ошибку : Переменная не определена (КомпоновщикНастроек)
13 acht
 
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')
19 acht
 
22.01.21
13:50
(18) > так?
Нет не так. Оперируй только адресом.
20 Тессеракт
 
22.01.21
14:37
(19) (17) получилось. Я адрес реквизитом сделал и через него передал. Спасибо) осталось только сформировать запрос в модуле, сравнить с тз по полному соединению и передать уже в скд) Но это уже совсем другая история))