Имя: Пароль:
1C
1С v8
Загрузка из 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
приятно когда получается. спасибо всем за помощь.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.