Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
11 мая 2024, 01:06

загрузка из файла excel в обработку

Автор maxxi, 13 фев 2023, 08:58

0 Пользователей и 1 гость просматривают эту тему.

maxxi

Здравствуйте, дорогие форумчаны!!!

Скажите пожалуйста, как импортировать данные из excel в внешнюю обработку.

в файле 2 столбца: название товара и количество, всего 5600 строк.

Надо будет добавить еще один столбец в обработку и загрузить из excel.

Код обработки:



Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |   СУММА(ЕСТЬNULL(ПродажиОбороты.КолОборот, 0)) КАК ПрошлыйГод,
        |   СРЕДНЕЕ(ЕСТЬNULL(ОстаткиОстатки.КолОстаток, 0)) КАК Остаток,
        |   Товарлар.Ссылка КАК Товар,
        |   ПродажиОбороты.КолОборот КАК КолОборот
        |ИЗ
        |   Справочник.Товары КАК Товары
        |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&НачПериодГод, &КонПериодГод, Период, Склад = &Склад) КАК ПродажиОбороты
        |       ПО Товарлар.Ссылка = ПродажиОбороты.Товар
        |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки(&КонПериод, Склад = &Склад) КАК ОстаткиОстатки
        |       ПО Товарлар.Ссылка = ОстаткиОстатки.Товар
        |
        |СГРУППИРОВАТЬ ПО
        |   Товарлар.Ссылка,
        |   ПродажиОбороты.КолОборот";
   
    Запрос.УстановитьПараметр("КонПериодГод", (КонПериод-(60*60*24*365)));
    Запрос.УстановитьПараметр("НачПериодГод", (НачПериод-(60*60*24*365)));
    Запрос.УстановитьПараметр("Склад", Склад);
    Запрос.УстановитьПараметр("КонПериод", КонПериод);
   
    РезультатЗапроса = Запрос.Выполнить();
   
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Реквизит1.Очистить();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Если (ВыборкаДетальныеЗаписи.Остаток = 0 или ВыборкаДетальныеЗаписи.ПрошлыйГод = 0 )или
        ВыборкаДетальныеЗаписи.ПрошлыйГод < 0 тогда
            Продолжить;
        КонецЕсли;
        Товар = Реквизит1.Добавить();
        Товар.Товар = ВыборкаДетальныеЗаписи.Товар;
        Товар.ПрошлыйГод = ВыборкаДетальныеЗаписи.ПрошлыйГод;
        Товар.Остаток = ВыборкаДетальныеЗаписи.Остаток;
        Товар.ВсегоПродано = ВыборкаДетальныеЗаписи.КолОборот; 
        Товар.МожетПродацся = (ВыборкаДетальныеЗаписи.ПрошлыйГод+
                                         (ВыборкаДетальныеЗаписи.ПрошлыйГод*Рост/100));
        Нужно = (ВыборкаДетальныеЗаписи.ПрошлыйГод+(ВыборкаДетальныеЗаписи.ПрошлыйГод*Рост/100))-
                                          ВыборкаДетальныеЗаписи.Остаток;
        Товар.Нужно = ?(Нужно > 0, Нужно, 0);
        Товар.НаСколькоХватить  = Цел(?(Товар.МожетПродацся > 0, Товар.Остаток/Товар.МожетПродацся,
                                            0));
КонецЦикла;

Спасибо всем большое.

maxxi

Вот вид файла:

alexandr_ll

maxxi, Непонятно, как ваш запрос может быть связан сзагрузкой из excel

Максим75

да вагон в инете как загружать из екселя.
гугл отменили уже?

Максим75

maxxi, короче говоря, кидаю как у меня клиенты из екселя грузятся.
под себя переделаете, там делов на 5 минут.

&НаКлиенте
Процедура ПрочитатьФайл_XLS()

//есть несколько вараинтов чтения из Екселя
//здесь реализовано чтение через объект ТабличныйДокумент
//у ТабличногоДокумента метод Прочитать доступен долько на сервере
//поэтому вызываем процедуру чтения на сервере
Объект.ДанныеФайла.Очистить();

//1. на стороне клиента сначала получаем двоичные данные файла
ДанныеФайла = Новый ДвоичныеДанные(Объект.ПутьКФайлу);
//2. полученные данные помещаем во временное хранилище
АдресДанных = ПоместитьВоВременноеХранилище(ДанныеФайла);
//3. Адрес данных передаем как параметр при вызове серверной процедуры
ПрочитатьФайл_XLS_НаСервере(АдресДанных);

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

&НаСервере
Процедура ПрочитатьФайл_XLS_НаСервере(Адрес)

ТабДок = Новый ТабличныйДокумент;

//4. На стороне сервера нужно получить данные по указанному пути
Данные = ПолучитьИзВременногоХранилища(Адрес);
//5. Данные запишем во временный файл уже на сервере (физически в файловую систему сервера)
//вначале получим временный файл
ПутьКФайлуНаСервере = ПолучитьИмяВременногоФайла("xls");
//потом сохраним данные из временного хранилища в этот временный файл
Данные.Записать(ПутьКФайлуНаСервере);
попытка
// ТабДок.Прочитать(Объект.ПутьКФайлу,СпособЧтенияЗначенийТабличногоДокумента.Значение);
//в файловом варианте работы платформы это сработает
//в клиент-серверном варианте нет, поскольку на сервере может не будет доступен каталог, где лежит файл физически
//необходимо передавать данные с клиента на сервер
//для клиент-серверной работы будем использовать механизм временного хранилища
ТабДок.Прочитать(ПутьКФайлуНаСервере,СпособЧтенияЗначенийТабличногоДокумента.Значение);//вот так!!!
исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст="Не удалось прочитать файл по причине: "+ОписаниеОшибки();
Сообщение.Сообщить();
возврат;
конецПопытки;

//количество строк в табличном документе, оно же кол-во строк в файле Ексель
//через свойство табличного документа ВысотаТаблицы
КолвоСтрок = ТабДок.ВысотаТаблицы;
//Сообщить("Кол-во строк "+КолвоСтрок);
//ну и в цикле обходим строки
Для НомерСтроки = 2 по КолвоСтрок цикл

НоваяСтрока = Объект.ДанныеФайла.Добавить();
НоваяСтрока.Наименование = ТабДок.ПолучитьОбласть("R"+Формат(НомерСтроки,"ЧГ=0")+"C1").ТекущаяОбласть.Текст;
НоваяСтрока.ПолноеНаименование = ТабДок.ПолучитьОбласть("R"+Формат(НомерСтроки,"ЧГ=0")+"C2").ТекущаяОбласть.Текст;
НоваяСтрока.ОКПО = ТабДок.ПолучитьОбласть("R"+Формат(НомерСтроки,"ЧГ=0")+"C3").ТекущаяОбласть.Текст;

КонецЦикла;


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

walesshor


maxxi

Спасибо всем за ответы, я забыл написать, что надо импортировать данные из excel только в одну колонку, не касаясь других колонок, потому что они заполняются через запрос.
В файле 2 колонки: Товары и Нормативный день.
Колонка "Товары" уже заполнена через запрос.
Мне нужно пройтись по файлу, если Название Товара в колонке и в файле совпадают записать в колонку "нормативный день" цифру из файла.

Максим75

maxxi, как читать ексель показали примеры.
пройдитесь по файлу, в нужной ячейке екселя получаете товар, ищите его потом в таблице на форме, нашли - заполняете колонку нормативный день цифрой из файла.
никто здесь за Вас обработку писать не будет.
можем готовое решение просмотреть, если чего-то не работает, подправить, но не писать вместо Вас.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск