Имя: Пароль:
1C
1С v8
Работа с Эксель. Прочитать Эксель и загрузить в таблицу значений
,
0 BenDiget
 
14.12.22
12:06
Всем привет. Нашел потрясающий метод, как прочитать Эксель без всяких там переборов и прочего это великолепно:
Код:

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

&НаСервере
Процедура ЗагрузитьИзФайлаНаСервере2022()
Табл.Очистить();
ТаблДок.Очистить();

ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(СокрЛП(Файлик), СпособЧтенияЗначенийТабличногоДокумента.Значение);
ОбластьЯчеек = ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);

ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек);
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();

ТабЗначений = ПостроительОтчета.Результат.Выгрузить();
КонецПроцедуры
1 sirbure
 
14.12.22
12:07
Так, и? Делитесь радостью?
2 Dmitry1c
 
14.12.22
12:08
(0) возьми с полки пирожок, их там два, твой тот что посередине
3 1Сергей
 
14.12.22
12:09
[:|||||||||||||||||:]
4 Kassern
 
14.12.22
12:10
(3) Да ладно вам, может кто и не знал.
5 ass1c
 
14.12.22
12:10
(0) осталось еще найти НачатьПомещениеФайловНаСервер и ПараметрыДиалогаПомещенияФайлов
6 kubik_live
 
14.12.22
12:16
(0) А если 100 листов в таблице и надо прочитать 56-й, как будешь?
7 kubik_live
 
14.12.22
12:16
В книге
8 timurhv
 
14.12.22
12:18
(0) а если сервер в кукуево находится?
9 FirstLine Support
 
14.12.22
12:19
теперь осталось ТабЗначений тоже куда-нито загрузить, без переборов
10 Новый1сник2
 
14.12.22
12:21
(0) а названия колонок как определяются ?
11 timurhv
 
14.12.22
12:22
12 FirstLine Support
 
14.12.22
12:24
(10) скармливаешь ТЗ ИИ, он возвращает название колонок и назначение документа
13 Garykom
 
гуру
14.12.22
12:25
(0)
1. Скажи а что будешь делать если имена/заголовки колонок не в первой строке а в 10?

2. Скажи а что будешь делать если имена/заголовки колонок поменяют в файлике новом?
14 Garykom
 
гуру
14.12.22
12:26
(13)+
3. см (6)
15 Гипервизор
 
14.12.22
12:26
(0) Странный выбор кода, которым с нами поделились.
К сути потрясающего метода процедура начала выбора файла не относится.
Зато передачу с клиента на сервер не рассмотрели.
16 Kassern
 
14.12.22
12:30
(14) (6) Вот налетели как коршуны))
ТС просто описал вариант, когда нужна ТЗ и документ в определенном формате (шапка в нужном месте). например дальше это дело пихается в внешний источник данных и соединяется в СКД с другими таблицами. В этом случае почему бы и нет.
Во всех остальных случаях вы можете по старинке обойти строки ТД и выбрать нужные.
17 Kassern
 
14.12.22
12:31
(15) я думаю, что можно было вообще вырезать передачу файла, а ТС делился именно "ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьЯчеек); "
А так да, лучше бы поместил во временное хранилище ДД файла, а потом на сервере бы их прочитал
18 Garykom
 
гуру
14.12.22
12:34
(17) дада а на сервере из дд через поток прямо в табдок ;)
без сохранения во временный файл да?
19 Garykom
 
гуру
14.12.22
12:34
(18)+ иногда недоделки в 1С просто смешные
20 Kassern
 
14.12.22
12:35
(18) эх если бы, может в новых релизах завезут, а пока через временный файл приходится
21 BenDiget
 
14.12.22
12:44
(1) Можно и так сказать, вдруг кто по запросу в яндексе найдет. потому что мне только перебором строк все время попадались решения. Это дико
22 BenDiget
 
14.12.22
12:45
(6) если бы да ка бы - выросли во рту грибы. Знаете такое? Со слов если, можно даже и не начинать что-то делать
23 Garykom
 
гуру
14.12.22
12:56
(21) эээ
ты думаешь внутри "Новый ПостроительОтчета" нет перебора строк?
24 Kassern
 
14.12.22
12:58
(23) его хотя бы не нужно описывать)
25 Garykom
 
гуру
14.12.22
13:01
(24) А потом хренак и все падает
Потому что файлик ёкселя слегка кривоватый и последнюю строку определил как  1 048 576
26 vicof
 
14.12.22
14:17
(22) Но ты же делаешь. Мог бы и не начинать делать и не создавать глупых тем.

"Если ДиалогОткрытияФайла.Выбрать() Тогда
        
    Файлик = ДиалогОткрытияФайла.ПолноеИмяФайла;
        
Иначе
    Файлик = "";
КонецЕсли;"
27 mikecool
 
14.12.22
14:32
как хорошо, что автору доставляет столько удовольствия новый метод...
я тоже недавно обнаружил какой-то, доселе мною не используемый, но это не доставило мне столько рабости
28 Timon1405
 
14.12.22
14:36
(0) код хорошо решает задачу "подкинуть из экселя данные в запрос и сравнить с данными базы".
в консоли запросов ИР есть код перед выполнением запроса, более того, здесь же можно прочитанную ТЗ обойти и привести типы/еще как-то обработать их. читаем в ТЗ, подкидываем тз параметром. итого с околонулевым усилием у нас в запросе есть ТЗ, которую можно крутить дальше.
29 vicof
 
14.12.22
14:38
(27) просто ты стар
30 Kassern
 
14.12.22
14:38
(25) Ну упало и упало. Поднимем, отряхнем и снова в продакшен)
Вы с тем же успехом можете получить последнюю строку как 1 048 576 и в цикле это дело обходить до посинения.
Вообще, когда речь идет про внешние источники данных, то прилететь может что угодно и положить приложение, если заранее не позаботиться.
31 MishaD
 
14.12.22
15:27
Только этим методом и гружу в эксель
32 Garykom
 
гуру
14.12.22
15:27
(30) При обходе в цикле можно юзеру полоску прогресса показывать
И сделать прерывание

А повисший ПостроительОтчета только вместе с сеансом убивать, да еще и на сервере тоже
33 Garykom
 
гуру
14.12.22
15:29
Имхо в продакшен через ПостроительОтчета можно только когда форматы файлов (шаблоны) надежные и не меняются
А лучше когда не любой юзер а только опытный пользует

Если там может быть что угодно и грузить кто угодно то нафик-нафик, лучше циклами
34 Kassern
 
14.12.22
15:30
(32) Можно сделать ограничение на стороне кластера и тогда так же прервется выполнение и выйдет ошибка юзверу
35 tesei
 
15.12.22
08:47
Я работаю с текстовиками csv: открываются нативно в экселе, легко прочитать, записать, загрузить в таблицу значений / выгрузить. Эксель аппликейшн не нужен.
36 BenDiget
 
15.12.22
12:43
(27) :))) Ты прав, это и правда доставило мне радость) До сих пор рад)
37 BenDiget
 
19.12.22
11:36
(30) Привет. Посмотри пожалуйста эту мою тему, там вроде все просто, но я что-то не понимаю. Нужен просто пример. Задача.ОсновнойОбъектАдресации ERP 1С
38 arsenfn
 
23.04.23
08:47
Использовал это метод для чтения файла, но обнаружалась проблема. Меняются местами колонки. Например, в файле первая колонка "Производитель", вторая "Артикул". При выгрузке из построителя в таблицу значение колнки меняются местами. Еще один глюк с одним файлом. Считывается только одна колонка из нескольких существующих. Может кто знает в чем причина?
39 TormozIT
 
гуру
23.04.23
09:29
(38) Может платформу обновить?
40 АгентБезопасной Нацио
 
23.04.23
16:02
(27) ты разучился радоваться.
"Господи, как скучно мы живем! В нас пропал дух авантюризма! Мы перестали лазить в окна к любимым женщинам… Мы перестали делать большие хорошие глупости…) Эхх… какая гадость… какая гадость эта ваша заливная рыба!"©
А вот ТС - не разучился. у него впереди столько радостей - например, когда узнает, что 2*2=4
41 Dmitry77
 
23.04.23
16:46
(0) если в названии колонки есть точка например, или если 2 колонки с одинаковыми названиями? как этот метод отработает?
42 Eugeneer
 
23.04.23
19:14
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(СокрЛП(Файлик), СпособЧтенияЗначенийТабличногоДокумента.Значение);


Встроенное 1С половину файлов не читает. Так что бесполезная вещь. Что то конечно загрузит. Но большинство экселей валит ошибки.
43 TormozIT
 
гуру
24.04.23
08:29
(42) Можно пример такого файла?
44 2S
 
24.04.23
08:38
(42) окажется файл/лист запаролен
45 СвинТуз
 
24.04.23
09:41
Функция ПрочитатьТабличныйДокумент(ТабличныйДокументИсточник)

КоличествоСтолбцов = ТабличныйДокументИсточник.ШиринаТаблицы;
Если КоличествоСтолбцов = 0 Тогда
  Возврат Новый ТаблицаЗначений;
КонецЕсли;
ТабличныйДокумент = Новый ТабличныйДокумент;
Для НомерСтолбца = 1 По КоличествоСтолбцов Цикл
  ТабличныйДокумент.Область(1, НомерСтолбца, 1, НомерСтолбца).Текст = "Номер_" + Формат(НомерСтолбца,"ЧГ=0");
КонецЦикла;
ТабличныйДокумент.Вывести(ТабличныйДокументИсточник);
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличныйДокумент.Область());
Построитель.Выполнить();
ТаблицаЗначенийРезультат = Построитель.Результат.Выгрузить();
Возврат ТаблицаЗначенийРезультат;

КонецФункции

https://infostart.ru/video/w1549856/