|
Загрузка из Excel в документ | ☑ | ||
---|---|---|---|---|
0
Ramis333
11.08.17
✎
10:18
|
добрый день. нужно создать обработку по загрузке данных из Exel в табличную часть документа (номенклатура, склад, количество).
файл открывается. как дальше сделать привязку строки и колонки Exel и 1с &НаКлиенте Процедура ИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогВыбора.Заголовок = "Выберите файл"; Если ДиалогВыбора.Выбрать() Тогда ИмяФайла = ДиалогВыбора.ПолноеИмяФайла; КонецЕсли; Объект.ИмяФайла=ИмяФайла; КонецПроцедуры &НаКлиенте Процедура Загрузить(Команда) ИмяФайла=Объект.ИмяФайла; ЗагрузитьДанные(ИмяФайла); КонецПроцедуры Функция ЗагрузитьДанные(ИмяФайла)//Номер листа в книге Excel для получения данных НомерЛиста = 1; //Пытаемся подключиться к Excel Попытка Excel = новый COMОбъект("Excel.Application"); Исключение Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel."); Возврат Ложь; КонецПопытки; //Подключились удачно, открываем файл Excel.Workbooks.Open(ИмяФайла); //Открываем необходимый лист Excel.Sheets(НомерЛиста).select(); //Получим количество строк и колонок. //В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1); Если Версия = "8" тогда ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count; ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13); Иначе ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row; ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column; Конецесли; Остатки = Документы.ВводНачальныхОстатков.СоздатьДокумент(); Остатки.Дата = ТекущаяДата(); Для а = 9 по ФайлСтрок Цикл НоваяСтрока = Остатки.Товары.Добавить(); НоваяСтрока.Номенклатура = Excel.Cells( ,2).Value; НоваяСтрока.Склад = Excel.Cells( ,2).Value; НоваяСтрока.Количество = Excel.Cells( ,2).Value; КонецЦикла; Остатки.Записать(РежимЗаписиДокумента.Запись); //Закрываем Excel Excel.ActiveWorkbook.Close(); КонецФункции |
|||
1
mehfk
11.08.17
✎
10:22
|
(0) Нажми кнопку "Я" справа от заголовка темы.
|
|||
2
Wirtuozzz
11.08.17
✎
10:38
|
(1) Вот бы еще "Г" была справа. Типа хочешь ищи в яндексе, хочешь в гугле. Разнообразие и удоство.
|
|||
3
AsadRoman
11.08.17
✎
10:42
|
(0) В значениях ячеек 1С-ссылки на номенклатуру и склад?
|
|||
4
AsadRoman
11.08.17
✎
10:44
|
(0) А что на клиенте можно создать объект и заполнить его?
|
|||
5
h-sp
11.08.17
✎
10:46
|
(4) так он на сервере создает
|
|||
6
Wirtuozzz
11.08.17
✎
10:46
|
(4) он на сервере заполняет. Он просто не указал директиву &НаСервере, но это не суть
|
|||
7
AsadRoman
11.08.17
✎
10:49
|
(5) (6) Второй вопрос подсказали. остался первый. Может он сам чуть-чуть подумает?
|
|||
8
Chameleon1980
11.08.17
✎
10:51
|
может я чего не понял, но может тут нужную колонку и строку?
Excel.Cells( ,2).Value; |
|||
9
Бубр
11.08.17
✎
10:54
|
НоваяСтрока.Номенклатура = Excel.Cells(a,2).Value;
|
|||
10
Бубр
11.08.17
✎
10:55
|
НоваяСтрока.Номенклатура тип строка
|
|||
11
Wirtuozzz
11.08.17
✎
10:56
|
Тип. А что такое тип? и почему тип строка?
|
|||
12
Бубр
11.08.17
✎
11:00
|
или так
СтрокаДляПоиска =Excel.Cells(a,2).Value; ТоЧтоНашли = Справочники.Номенклатура.НайтиПоНаименованию(СтрокаДляПоиска); Если ТоЧтоНашли = Неопределено Тогда Сообщить("Поиск номенклатуры с наименованием :"+СтрокаДляПоиска+" закончился неудачей!"); Иначе НоваяСтрока.Номенклатура = ТоЧтоНашли.Ссылка; КонецЕсли; |
|||
13
Бубр
11.08.17
✎
11:01
|
(11) потому что из Экселя тебе придет тип строка
|
|||
14
Wirtuozzz
11.08.17
✎
11:04
|
(13) Фантастика. И даже число будет с типом строка?
|
|||
15
Wirtuozzz
11.08.17
✎
11:04
|
Или я сейчас начал биржу вопросов ТС рушить?
|
|||
16
Бубр
11.08.17
✎
11:12
|
(14) зависит от типа данных колонки в экселе
СтрокаДляПоиска =СокрЛП(Excel.Cells(a,2).Value);- так будет точно строка |
|||
17
Сильф
11.08.17
✎
11:12
|
(0) На последних релизах платформы можно так не извращаться, а считать лист Экселя в табличный документ и разбирать уже его. Примерно так:
&НаКлиенте Процедура ЗагрузитьИзЭксель(Команда) Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытияФайла.ПолноеИмяФайла = ""; Текст = "ru = ""Табличный документ""; en = ""Spreadsheet document"""; Фильтр = НСтр(Текст)+"(*.mxl; *.xls; *.xlsx; *.ods)|*.mxl; *.xls; *.xlsx; *.ods"; ДиалогОткрытияФайла.Фильтр = Фильтр; ДиалогОткрытияФайла.МножественныйВыбор = Ложь; ДиалогОткрытияФайла.Заголовок = "Выберите файл"; Если ДиалогОткрытияФайла.Выбрать() Тогда ВыбранныйФайл = ДиалогОткрытияФайла.ПолноеИмяФайла; АдресВременногоХранилища = ""; ПоместитьФайл(АдресВременногоХранилища, ВыбранныйФайл, , Ложь, ЭтаФорма.УникальныйИдентификатор); Ф = Новый Файл(ДиалогОткрытияФайла.ПолноеИмяФайла); РасширениеСтрока = Сред(Ф.Расширение, 2); ЗагрузитьИзЭксельНаСервере(АдресВременногоХранилища, РасширениеСтрока); КонецЕсли; КонецПроцедуры &НаСервере Процедура ЗагрузитьИзЭксельНаСервере(АдресВременногоХранилища, Расширение) ТабДок = Новый ТабличныйДокумент; ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища); ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение); ДвоичныеДанные.Записать(ИмяВременногоФайла); ТабДок.Прочитать(ИмяВременногоФайла); //<---- читаем из экселя сразу в табдок РазобратьТабличныйДокумент(ТабДок); //<---- и всё, работаем в данной процедуре со стандартным табличным документом, через "Область" и т.д.; файл эксель отпустили Попытка УдалитьФайлы(ИмяВременногоФайла); Исключение КонецПопытки; КонецПроцедуры |
|||
18
Chameleon1980
11.08.17
✎
11:13
|
если использовать value - придет или текс или число (может быть). Т.е. дословно - значение.
а text всегда придет текст. но 1с тебе просто так по тексту твоему номенклатуру не вернет. поэтому или НайтиПоНайменованию или Запрос |
|||
19
Wirtuozzz
11.08.17
✎
11:15
|
(16) Она и так будет строка. Число из екселя не вернется.
|
|||
20
Wirtuozzz
11.08.17
✎
11:16
|
(19) точнее до 999 может и будет число, а все что выше будет точно строка.
|
|||
21
AsadRoman
11.08.17
✎
11:19
|
Я в восторге от всего происходящего: чел, задавший вопрос, на форуме отсутствует, а все с..ться между собой как ему задачу решить. Может он сам чутка подумает по наводящим вопросам? А то ведь у него в мозгу ничего не останется. Он и так не может в Я найти ответ на свой вопрос.
|
|||
22
Chameleon1980
11.08.17
✎
11:20
|
(21) ну да. А слона-то мы и потеряли
|
|||
23
Wirtuozzz
11.08.17
✎
11:28
|
(21) Так пятница же!
|
|||
24
Ramis333
11.08.17
✎
11:34
|
всем спасибо.
подправил код. количество в документ загрузилось. номенклатура и склад пустые ячейки. Для а = 2 по ФайлСтрок Цикл НоваяСтрока = Остатки.Товары.Добавить(); НоваяСтрока.Номенклатура = Excel.Cells(а,1).Value; НоваяСтрока.Склад = Excel.Cells(а,2).Value; НоваяСтрока.Количество = Excel.Cells(а,3).Value |
|||
25
Бубр
11.08.17
✎
11:35
|
так то можно пользоваться типовой обработкой ЗагрузкаДанныхИзТабличногоДокумента
|
|||
26
h-sp
11.08.17
✎
11:35
|
(21) почему решил, что он отсутствует? Например, если входить в тему с интервалом в минуту и сразу выходить, то он ведь присутствует, хотя и не виден. Это всё туфта, присутствует-отсутствует так не определишь.
|
|||
27
Ramis333
11.08.17
✎
11:41
|
мне надо научиться самому. стандартной обработкой понятное дело, можно загрузить.
пытаюсь освоить 1с. |
|||
28
Chameleon1980
11.08.17
✎
11:47
|
(24)
ну тебе жеж подсказали. ты все посты читал? не НоваяСтрока.Номенклатура = Excel.Cells(а,1).Value; а типа НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛА(Excel.Cells(а,1).Value)); |
|||
29
Chameleon1980
11.08.17
✎
11:47
|
*СокрЛА=СокрЛП
|
|||
30
Chameleon1980
11.08.17
✎
11:48
|
+ (28) ну или ищи ее (номенклатуру) запросом
|
|||
31
Chameleon1980
11.08.17
✎
11:49
|
со складом такая-же печенька
|
|||
32
Ramis333
11.08.17
✎
13:02
|
теперь выдает ошибку
Поле объекта не обнаружено (Номенклатура) НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Excel.Cells(а,1).Value)); |
|||
33
pessok
11.08.17
✎
13:03
|
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу); Построитель = Новый ПостроительОтчета; Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область()); Построитель.Выполнить(); ТаблицаРезультат = Построитель.Результат.Выгрузить(); и работай с ТЗ |
|||
34
AsadRoman
11.08.17
✎
13:23
|
(32) т.е.
НоваяСтрока.Номенклатура = Excel.Cells(а,1).Value; прокатывает без ошибки, а НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Excel.Cells(а,1).Value)); выдает ошибку? |
|||
35
Chameleon1980
11.08.17
✎
13:25
|
(32) про отладчик слышали?
|
|||
36
Chameleon1980
11.08.17
✎
13:26
|
что за конфигурация, какой тип реквизита номеклатура у теабличной части документа?
|
|||
37
Ramis333
11.08.17
✎
14:17
|
реквизит Номенклатуры: СправочникСсылка.Номенклатуры
|
|||
38
Ramis333
11.08.17
✎
14:20
|
ссори. ошибку нашел. загрузка пошла.
|
|||
39
Chameleon1980
11.08.17
✎
14:23
|
СправочникСсылка.НоменклатурЫ
"Ы" Карл. Нетленка? |
|||
40
Chameleon1980
11.08.17
✎
14:26
|
+ да и конфигуратор (зачастую) показывает что у тебя есть в конфигурации.
|
|||
41
Ramis333
11.08.17
✎
14:30
|
приятно когда получается. спасибо всем за помощь.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |