Имя: Пароль:
1C
 
Чтение данных из листа Excel
0 jq
 
25.07.06
14:24
Что для этого нужно - создать обработку или процедуру?
1 Волшебник
 
25.07.06
14:25
можно даже функцию
2 Бригадир 1С
 
25.07.06
14:26
(0) СОМОбъект
3 jq
 
25.07.06
14:27
А как создать COM Объект? Sub COM()... ???
4 dimoff
 
25.07.06
14:32
Эксель = new COMОбъект("Excel.Application");
Эксель.Workbooks.Add(Путь);
Лист = Эксель.Worksheets(1);
5 jq
 
25.07.06
14:35
А где это писать, в обработке?

И куда тогда вставлять

Sub COM()
   Dim trade As Object
   Dim Элемент As Object

   Set obj = CreateObject("V8.ComConnector")
   Set trade = obj.Connect ("File=""c:\InfoBases\Trade"";Usr=""Director"";")
   
   Rem создаем документ
   Set Документ = trade.Документы.Приходная.СоздатьДокумент()
       
   Rem получаем данные из листа
   Set Контрагент = trade.Справочники.Контрагенты.НайтиПоНаименованию(Application.Cells(1, 2).Value)
   НомерДокумента = Application.Cells(2, 2).Value
   Дата = Application.Cells(3, 2).Value
   
   Rem записываем полученные данные в документ
   Документ.Контрагент = Контрагент
   Документ.Дата = Дата
   Документ.Номер = НомерДокумента
   
   Номер = 6   'Первая строка табличной части
   НомерСтроки = Application.Cells(Номер, 1).Value
   
   Rem в последней строке табличной части будет символ #
   While НомерСтроки <> "#"
   
       Rem получаем данные из листа
       Set Номенклатура = trade.Справочники.Номенклатура.НайтиПоНаименованию(Application.Cells(Номер, 2).Value)
       Количество = Application.Cells(Номер, 5).Value
       Цена = Application.Cells(Номер, 6).Value
       Сумма = Application.Cells(Номер, 7).Value
       
       Rem записываем полученные данные в строку табличной части
       Set Строка = Документ.Товары.Добавить()
       Строка.Номенклатура = Номенклатура
       Строка.Количество = Количество
       Строка.Цена = Цена
       Строка.Сумма = Сумма
       Номер = Номер + 1
       НомерСтроки = Application.Cells(Номер, 1).Value
   Wend
   Документ.Записать
   
End Sub
6 АдамДжанавар
 
25.07.06
14:39
(4) Неправильно.
Было:
Эксель = new COMОбъект("Excel.Application");
Эксель.Workbooks.Add(Путь);
Лист = Эксель.Worksheets(1);

Надо:
Эксель = new COMОбъект("Excel.Application");
Книга=Эксель.Workbooks.Add(Путь);
Лист = Книга.Worksheets(1);
7 jq
 
25.07.06
16:26
Так как насчет (5)? Или это вообще не в тему?
8 jq
 
25.07.06
16:51
Не понял ?
9 MikleV
 
25.07.06
17:05
(8) ну чего непонятно.. в (5) вызов и работа с 1С из ёкселя.
тебе наоборот...
10 jq
 
25.07.06
17:18
(9)Нет это как-раз мне и надо, это пример из книжки, только вот там не написано, куда это вставлять, и как потом обращаться???
11 Mort
 
25.07.06
17:22
В * вставь.
В приложение на VB.
12 jq
 
25.07.06
17:24
(11)А где я его возьму? Я же в 1С
13 MikleV
 
25.07.06
17:24
(10) это макрос.. экселевский.. куда вставлять -в документ ексёль.
(там редактор VB есть)
обращаться.. хм. GetComObject("testfile.xls",) - в СП посморти ПолучитьКомОбъект.
а потом. млин. не помню как макрос запустить. мож кто и подскажет.
а, да, проще(понятнее для меня. имхо) было бы это из 1С сделать.
14 MikleV
 
25.07.06
17:27
Ex = New COMObject("Excel.Application");
   Ex.Workbooks.Open(Путь);
   Ex.Visible = 1;    
   ТекЛист=Ex.WorkSheets(1);        
   Для Ячейка = 1 по 400 цикл
       Если НЕ  ТекЛист.Cells(Ячейка,1).Value  = Неопределено тогда
           Сообщить(Строка(ТекЛист.Cells(Ячейка,1).Value));    
           Карта = Справочники.Номенклатура.НайтиПоКоду(ИзЧислаВСтроку(ТекЛист.Cells(Ячейка,1).Value));    
           Если Карта.Пустая() тогда        
               Сообщить(" Пустой элемент "  + ТекЛист.Cells(Ячейка,1));
           иначе
               Объект = Карта.ПолучитьОбъект();
               Объект.ОсновнойПоставщик = ОсновнойКлиент;
               Объект.Записать();
               конецесли;    
       конецесли;
   конеццикла;    

я думаю что проще так..
15 dimoff
 
25.07.06
17:27
(6) В чем же разница, милый?
16 Добрый
 
25.07.06
17:28
(12) А где ты взял код из (5)?
17 Добрый
 
25.07.06
17:30
(16)Вопрос снят, из книжки...
18 jq
 
25.07.06
17:37
(16)Это листинг из книги v8: v8: Купил книгу "Профессиональная разработка в системе 1С: предприятие 8"

(13)Не пойму зачем мне макросы? Мне ведь надо это из 1С сделать, так вроде в книжке написано
19 jq
 
25.07.06
17:38
(14)Это, как я понимаю, на 1С написано? А где это писать, в процедуре модуля (какого)или еще где?
20 MikleV
 
25.07.06
17:40
автор опять Питросянить начинаешь..
(19) ну сделай обработку.. в Процедуру КнопкаВыполнитьНажатие() в модуле формы запихни этот код..
21 Scooter
 
25.07.06
17:41
22 jq
 
25.07.06
17:59
Сделал как в (20), а там такое...

Sub <<?>>COM()
{Обработка.Обработка1.Форма.Форма(27,55)}: Ожидается символ ';'
   Rem в последней строке табличной части будет символ #<<?>>
{Обработка.Обработка1.Форма.Форма(28,26)}: Ожидается ключевое слово 'Цикл' ('Do')
   While НомерСтроки <> "#"<<?>>

Чего не так?
23 MikleV
 
25.07.06
18:00
(22) я говорил про код из (14).. не забудь там путь к файлу указать..
24 jq
 
25.07.06
18:01
Аааа, а почему мой код не катит?
25 MikleV
 
25.07.06
18:06
(24) да патаму что твой код написан на языке VISUAL BASIC!!!!!!!!!!!!! и для его исполнения нужна среда , которая поддерживает этот язык.. у тебя же блокнот команды 1С не исполняет..
26 smaharbA
 
25.07.06
20:48
Восьмерочники, у вас есть сейф массивы, вам сам бог велел за одну строку данные с листа в 1С передавать (уж если в 7.7 показывал как, то в 8 подавно должно)
27 Моха Лёхов
 
25.07.06
20:50
(26) Покажи как в 8-ке, плз.
28 ШтушаКутуша
 
25.07.06
21:02
(15) во-1-х: я тебе не "милый" (впрочем,ахтунгам закон не писан)
    во-2-х: экземляр может остаться в памяти и...видел висящие процессы?
            ну про дефрагментацию,про сборку "мусора" памяти,наверное и не стоить говорить, ты по моему далек от мысли.
29 smaharbA
 
25.07.06
21:04
(27) восьмерку не знаю, но вот как весь лист передать в массив...
arr=WS.UsedRange.Value 'и все
могу в семерке написать...
30 Моха Лёхов
 
25.07.06
21:05
(29) Напиши на 7-ке, я переведу :).
(28) Надо говорить: "Какой я тебе милый, с*ка?" :)
31 ШтушаКутуша
 
25.07.06
21:06
(30.2) Ок.Понял.
32 smaharbA
 
25.07.06
21:07
В семерке нет такого массива, но можно исхитриться...
...
Процедура Сформировать2()
   scr=СоздатьОбъект("MSScriptControl.ScriptControl");
   scr.language="javascript";
   scr.timeout=-1;
   oExcel=СоздатьОбъект("Excel.Application");
   WB=oExcel.Workbooks.Open("C:\Клиенты.xls");
   scr.addobject("WS",WB.Worksheets(1));
   arr=scr.eval("new VBArray(WS.UsedRange.Value)");
   WB.Close(0);
   Для л=arr.lbound(1) По arr.ubound(1) Цикл
       Для к=arr.lbound(2) По arr.ubound(2) Цикл
           Сообщить(arr.getItem(к,л));
       КонецЦикла;
   КонецЦикла;
КонецПроцедуры
33 ШтушаКутуша
 
25.07.06
21:07
+31 хотя,накуа говорить? и так же видать
34 smaharbA
 
25.07.06
21:08
+(32) может и не проканает сейфмасив, но почемубы не попробовать
35 ШтушаКутуша
 
25.07.06
21:09
(32) Отлично:век-живи,век-учись!
Я про вот это:"arr=scr.eval("new VBArray(WS.UsedRange.Value)");"
Помоему остроумно.
36 ШтушаКутуша
 
25.07.06
21:10
(34) должно прокатить,ведь safe массивы именно для COM и разработаны.
37 Моха Лёхов
 
25.07.06
21:23
(33) Типа "Ахтунга по каментам видно"? (народная поговорка) :)

(32) Ща попробую, отпишусь.
38 Моха Лёхов
 
25.07.06
21:23
+ а (32) Тянет на книгу знаний, если прокатит :).
39 ШтушаКутуша
 
25.07.06
21:28
(38) Пожалуй.
40 ШтушаКутуша
 
25.07.06
21:32
(37.1) Пожалуй.
41 Моха Лёхов
 
25.07.06
21:55
Процедура КнопкаВыполнитьНажатие(Кнопка)
   МС = Новый COMОбъект("MSScriptControl.ScriptControl");
   МС.language="javascript";
   МС.timeout=-1;
   ЕА = Новый COMОбъект("Excel.Application");
   Книга = ЕА.Workbooks.Open(Путь);
   МС.addobject("WS",Книга.Worksheets(1));
   Масс = МС.eval("new VBArray(WS.UsedRange.Value)");
   Книга.Close(0);
   Для Инд1 = Масс.lbound(1) По Масс.ubound(1) Цикл
       Для Инд2 = Масс.lbound(2) По Масс.ubound(2) Цикл
           Сообщить(Масс.getItem(Инд2, Инд1));
       КонецЦикла;
   КонецЦикла;

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



{Форма.Форма(11)}: Метод объекта не обнаружен (lbound)
   Для Инд1 = Масс.lbound(1) По Масс.ubound(1) Цикл
42 Моха Лёхов
 
25.07.06
21:56
В чем могут быть грабли?
43 Моха Лёхов
 
25.07.06
22:00
Зря я наверное на руссий перевел, запутал только
44 Моха Лёхов
 
25.07.06
22:02
scr = Новый COMОбъект("MSScriptControl.ScriptControl");
45 Моха Лёхов
 
25.07.06
22:03
(44) Эта строка смущает
46 ШтушаКутуша
 
25.07.06
22:03
ИМХО: lbound,может иметь 2 параметра
47 Моха Лёхов
 
25.07.06
22:03
(46) Можно подробнее?
48 Моха Лёхов
 
25.07.06
22:05
Процедура КнопкаВыполнитьНажатие(Кнопка)
   scr = Новый COMОбъект("MSScriptControl.ScriptControl");
   scr.language="javascript";
   scr.timeout=-1;
   oExcel=Новый COMОбъект("Excel.Application");
   WB=oExcel.Workbooks.Open(Путь);
   scr.addobject("WS",WB.Worksheets(1));
   arr=scr.eval("new VBArray(WS.UsedRange.Value)");
   WB.Close(0);
   Для л=arr.lbound(1) По arr.ubound(1) Цикл
       Для к=arr.lbound(2) По arr.ubound(2) Цикл
           Сообщить(arr.getItem(к,л));
       КонецЦикла;
   КонецЦикла;
КонецПроцедуры
49 smaharbA
 
25.07.06
22:06
В восьмерке не пойдет такой код, там надо попробовать просто сразу в массив передать без МССкриптКонтрол
50 smaharbA
 
25.07.06
22:08
в восьмерке покакимто причинам Евал возвращает не объект, а в семерке объект
51 Моха Лёхов
 
25.07.06
22:08
(49) Почему не пойдет? Причина?
52 Моха Лёхов
 
25.07.06
22:09
(50) Возвращает сом-объект, смотрел
53 smaharbA
 
25.07.06
22:10
В семерке этот код даже с последующим заполнением ТЗ быстрее чем адо начиная тысяч с 5 строк
54 Моха Лёхов
 
25.07.06
22:12
(53) Тут дело в чем-то другом.
55 Моха Лёхов
 
25.07.06
22:13
СОМ он и в Африке СОМ.
56 smaharbA
 
25.07.06
22:17
Не знаю причину, но и scr.Eval("new Enumerator(GetObject('winmgmts:win32_process').instances_())") возвращает не енумератор (покрайне мере народ так говорит), но тут и ненадо енумерат, а вот с получением данных из екселя нужно передавать в массив
может в 8 проста проканает
Масс=Лист.UsedRange.Value
57 Моха Лёхов
 
25.07.06
22:20
(56) Ща попробую
58 Моха Лёхов
 
25.07.06
22:25
oExcel=Новый COMОбъект("Excel.Application");
   WB=oExcel.Workbooks.Open(Путь);
   WS = WB.Worksheets(1);
   arr = WS.UsedRange.Value;
   WB.Close(0);
   Для л=arr.lbound(1) По arr.ubound(1) Цикл
       Для к=arr.lbound(2) По arr.ubound(2) Цикл
           Сообщить(arr.getItem(к,л));
       КонецЦикла;
   КонецЦикла;


Пишет, что arr - COMSafeArray
59 Моха Лёхов
 
25.07.06
22:26
Но метод lbound не видит
60 smaharbA
 
25.07.06
22:26
Ну все, тогда тебе и лбоунды не нужны, попробуй работать синтакисом восьмерки
61 Моха Лёхов
 
25.07.06
22:28
(60) Как с массивом?
62 smaharbA
 
25.07.06
22:30
Ну да, как с COMSafeArray, там ведь наверно можно опредилить его размерность ?
63 Моха Лёхов
 
25.07.06
22:32
Йес!!!
64 Моха Лёхов
 
25.07.06
22:32
Поперло!!!
65 Моха Лёхов
 
25.07.06
22:33
Ща код нарисую!!!
66 smaharbA
 
25.07.06
22:35
Тока при малых объемах, это не очч быстро, а при больших может заткнуться, но 40000 строк на 20 столбцов секунды за 3 выдергивает, но потом в массиве надо уж искать, но если к примеру ексель файл "нормирован" то самое оно, чем елозить по строкам и столбцам...
Да там массив выходит типа набок положенный, можно и транспонировать(тоже метод екселя), но никчему - затраты времени...
67 smaharbA
 
25.07.06
22:45
Кстати - и обратно также можно...
типа
НачальнаяЯчейка="A1";
КонечнаяЯчейка=ШиринаМассива*ВысотаМассива; //:) незнаю как обозвать
Диапазон=Лист.Range(НачальнаяЯчейка+":"+КонечнаяЯчейка);
Диапазон.Value=Ексель.application.WorksheetFunction.Transpose(Массив);
...
Тока тут Массив как положено должен быть, не "набокулежащим"
68 smaharbA
 
25.07.06
22:48
Вернее так
...
Диапазон=Лист.Range(Лист.Cells(1,1),Лист.Cells(ШиринаМассива,ВысотаМассива));
///
Ну в общем смысл чтобы диапазон равный размеру массива задать
69 Моха Лёхов
 
25.07.06
22:50
oExcel=Новый COMОбъект("Excel.Application");
   WB=oExcel.Workbooks.Open(Путь);
   WS = WB.Worksheets(1);
   arr = WS.UsedRange.Value;
   WB.Close(0);
   Для л=arr.GetLowerBound(0) По arr.GetUpperBound(0) Цикл
       Для к=arr.GetLowerBound(1) По arr.GetUpperBound(1) Цикл
           Сообщить(arr.GetValue(л, к));
       КонецЦикла;
   КонецЦикла;
70 Моха Лёхов
 
25.07.06
22:51
(69) - рабочий код :)
71 Моха Лёхов
 
25.07.06
22:51
В книгу знаний!!!
72 jq
 
26.07.06
10:03
Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   Excel = New COMОбъект("Excel.Application");
   Excel.Workbooks.Open("C:\Documents and Settings\Рабочий стол\Книга1.xls");
   Excel.Visible = 1;    
   ТекЛист = Excel.WorkSheets(1);        
   
   Для Ячейка = 1 По 400 Цикл
       Если Не  ТекЛист.Cells(Ячейка,1).Value  = Неопределено Тогда
           Сообщить(Строка(ТекЛист.Cells(Ячейка,1).Value));    
           Карта = Справочники.Контрагенты.НайтиПоКоду(ИзЧислаВСтроку(ТекЛист.Cells(Ячейка,1).Value));    
           
           Если Карта.Пустая() Тогда        
               Сообщить(" Пустой элемент "  + ТекЛист.Cells(Ячейка,1));
           Иначе
               Объект = Карта.ПолучитьОбъект();
               Объект.Контрагент = Контрагент;
               Объект.Записать();
           КонецЕсли;    
       КонецЕсли;
   КонецЦикла;
   
КонецПроцедуры

Выдает ошибки:

{Обработка.Обработка1.Форма.Форма(18,37)}: Переменная не определена (Контрагент)
               Объект.Контрагент = <<?>>Контрагент;
{Обработка.Обработка1.Форма.Форма(12,57)}: Процедура или функция с указанным именем не определена (ИзЧислаВСтроку)
           Карта = Справочники.Контрагенты.НайтиПоКоду(<<?>>ИзЧислаВСтроку(ТекЛист.Cells(Ячейка,1).Value));

Что это еще за процедура <<?>>ИзЧислаВСтроку???

Что за слово карта - его нет в синтакс-помощнике???

Почему пишим НайтиПоКоду, а не НайтиПоНаименованию???
73 jq
 
26.07.06
10:33
up
74 Andrey_spb
 
26.07.06
10:42
"Что за слово карта - его нет в синтакс-помощнике???"
:)))
75 Andrey_spb
 
26.07.06
10:45
ИзЧислаВСтроку убери вобще или напиши Строка()...
Карта - элемент справочника Контрагенты...
76 MikleV
 
26.07.06
10:48
ого.. малацца. вот это наизобретали..
(72) ну убери..чё за слово.. одно - функция, второе - элемент справочника..
а по наименованию ты сам искать будешь.) если они у тебя уникальны..
77 jq
 
26.07.06
10:51
Так откуда у меня возьмется эл-т справочника Карта, если у меня его нет?
78 MikleV
 
26.07.06
10:52
(77) млин.. я тебе в качестве примера привёл отрезок кода..
чтобы ты потом сделал из него свой рабочий код.. тут ребята вон описали альтернативный способ.. чего тибе исчо не хватает?
79 jq
 
26.07.06
10:57
Теперь вроде ясно
80 jq
 
26.07.06
12:22
Не ясно только что за слово Cells, приходится догадываться :)

Вот что получилось:

   Excel = Новый COMОбъект("Excel.Application");
   Excel.Workbooks.Open("C:\Documents and Settings\berezin\Рабочий стол\Книга1");
   Excel.Visible = 1;    
   ТекЛист=Excel.WorkSheets(1);        
   
   Документ = Документы.Приходная.СоздатьДокумент();
   
   Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(ТекЛист.Cells(1, 2).Value);
   НомерДокумента = ТекЛист.Cells(2, 2).Value;
   Дата = ТекЛист.Cells(3, 2).Value;
   
   Документ.Контрагент = Контрагент;
   Документ.Дата = Дата;
   Документ.Номер = НомерДокумента;

   Номер = 6;    //   'Первая строка табличной части
   НомерСтроки = ТекЛист.Cells(Номер, 1).Value;
   
   Пока НомерСтроки <> "#" Цикл
   
       Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ТекЛист.Cells(Номер, 2).Value);
       Количество = ТекЛист.Cells(Номер, 5).Value;
       Цена = ТекЛист.Cells(Номер, 6).Value;
       Сумма = ТекЛист.Cells(Номер, 7).Value;
       
       Строка = Документ.Товары.Добавить();
       Строка.Номенклатура = Номенклатура;
       Строка.Количество = Количество;
       Строка.Цена = Цена;
       //Строка.Сумма = Сумма
       Номер = Номер + 1;
       НомерСтроки = ТекЛист.Cells(Номер, 1).Value;
   КонецЦикла;
   
   Документ.Записать();

Ошибка: Поле объекта не обнаружено (Приходная)
   Документ = Документы.Приходная.СоздатьДокумент();

Я чего-то не пойму, какое поле не обнаружено? Приходная - это новый док-т, кот. я создаю.

И еще интерестно, когда я нажимаю выполнить, сначала открывается мой док-т Excel, как запретить это открытие, ведь оно нигде не прописано?
81 asady
 
26.07.06
12:29
(80) Если в редакторе после слова Документы поставить точку, то появится список. Есть ли в этом списке слово "Приходная"? Ответь
82 jq
 
26.07.06
12:31
Нету, я хочу его создать
83 Andrey_spb
 
26.07.06
12:32
(80) Cells - ячейки, хотя это по-моему и из кода понятно...
84 Andrey_spb
 
26.07.06
12:33
(82) Хочешь - создай!
85 asady
 
26.07.06
12:34
(82) Похоже автор не понимает разницы между метаданными и данными.
Автор ты хочешь создать новый объект метаданных или данных?
86 Andrey_spb
 
26.07.06
12:36
А вобще, прочитай для начала Радченко, например, чем такие вопросы задавать... И пользы больше будет, чем на форуме сидеть...
87 jq
 
26.07.06
12:44
(86) Так ведь так в книжке написано

Опять запутали - метаданные, данные... Я даже и не знал об этом.
Напишите вкратце, тогда быть может разберусь!
88 jq
 
26.07.06
12:46
Или надо сначала вручную создать документ с реквизитами, а потом все остальное в него запихивать, как в коде??? Так?
89 jq
 
26.07.06
13:13
В цикле:

   Пока НомерСтроки <> "#" Цикл
   
       Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ТекЛист.Cells(Номер, 2).Value);
       Количество = ТекЛист.Cells(Номер, 3).Value;
       Цена = ТекЛист.Cells(Номер, 4).Value;
//        Сумма = ТекЛист.Cells(Номер, 7).Value;
       
       Строка = Документ.Товары.Добавить();
       Строка.Номенклатура = Номенклатура;
       Строка.Количество = Количество;
       Строка.Цена = Цена;
//        Строка.Сумма = Сумма
       Номер = Номер + 1;
//        НомерСтроки = ТекЛист.Cells(Номер, 1).Value;
   КонецЦикла;

выдает ошибку:Ошибка при вызове метода контекста (Cells): Произошла исключительная ситуация (0x800a03ec)
       Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ТекЛист.Cells(Номер, 2).Value);

Что это значит? И что это за слово "Номер" в ТекЛист.Cells(Номер, 2).Value???
90 jq
 
26.07.06
13:25
up
91 asady
 
26.07.06
13:26
(90) ответь на (85)
92 Andrey_spb
 
26.07.06
13:28
(87) Не те ты книжки читаешь... Так ты не чему не научишься...
93 Andrey_spb
 
26.07.06
13:29
Ну а ошибка потому что в Номер чего-то не того передаешь
94 MikleV
 
26.07.06
13:30
ааа.. я в ужосе.. под столом;)
95 jq
 
26.07.06
13:37
Блин, не знаю, я хочу создать новый документ - что это данные или метаданные?
96 Andrey_spb
 
26.07.06
13:39
(95) Ну если ты хочешь создать документ которого ещё нет в конфигурации то это метаданные...
97 jq
 
26.07.06
13:40
Что это за слово "Номер" в ТекЛист.Cells(Номер, 2).Value???

В отоладчике выяснил, что у меня не проходит следующую строку.

Написано: Номер = 6; Номер = Номер + 1;
Должно быть 6+1=7 строка, 7+1=8 ...,  а у меня получается 61, 611, 6111 и еще парочка, а затем ошибка
98 Andrey_spb
 
26.07.06
13:42
Номер - это номер ячейки по вертикали
99 jq
 
26.07.06
13:42
(96)Я уже создал документ вручную, добавил реквизиты и табл. часть с реквизитами. Тогда мне теперь строчку Документ = Документы.Приходная.СоздатьДокумент(); заменить на док-т.открыть() ???
100 asady
 
26.07.06
13:43
(100) 100
101 Andrey_spb
 
26.07.06
13:43
(97) Сделай так: Номер = Число(Номер) + 1;
102 asady
 
26.07.06
13:43
(101) Ветку в юмор, автора в школу!
103 jq
 
26.07.06
13:44
(98)А (Номер, 1) - это будет 6+1=7 или 61???
104 Andrey_spb
 
26.07.06
13:44
(102) вот-вот и я о том же...
105 jq
 
26.07.06
13:45
Да лучше помогли бы разобраться, а не смеяться! Я в книжках этого не нашел
106 Andrey_spb
 
26.07.06
13:45
(103) чиво?
107 jq
 
26.07.06
13:45
см. (97)
108 Andrey_spb
 
26.07.06
13:49
Откуда ты вобще это номер берешь? из Экселя что-ли?
109 MikleV
 
26.07.06
13:50
(103) ужоснах.. автор, ты когда за компьютер садишься вилку из розетки выдергивай..
110 MikleV
 
26.07.06
13:51
+(109) никак это не будет, это 6 это строка, 1 - столбец..
111 jq
 
26.07.06
13:59
Это я понял, просто сейчас ступил.

А почему у меня Номер = Номер + 1 выводит бредятину?
112 jq
 
26.07.06
14:01
Если сделать как в (101), тогда ошибка Ошибка при получении значения атрибута контекста (Value): Неизвестная ошибка
       Количество = ТекЛист.Cells(Номер, 3).Value;

Ничего не пойму!
113 MikleV
 
26.07.06
14:03
(112)Количество =  Число(ТекЛист.Cells(Номер, 3).Value);
у тебя в этой ячейке либо пустое значение.. либо..
114 jq
 
26.07.06
14:11
Там не пустое значение
115 jq
 
26.07.06
14:16
(113)Преобразование значения к типу Число не может быть выполнено
       Количество = Число(ТекЛист.Cells(Номер, 3).Value);
116 Andrey_spb
 
26.07.06
14:20
(114) а ты говоришь не пустое...
117 Andrey_spb
 
26.07.06
14:21
И вобще давай уже целиком текст, а то не понятно ничего...
118 jq
 
26.07.06
14:30
Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   Excel = Новый COMОбъект("Excel.Application");
   Excel.Workbooks.Open("C:\Documents and Settings\berezin\Рабочий стол\Книга1");
   Excel.Visible = 1;    
   ТекЛист=Excel.WorkSheets(1);        
   
   Документ = Документы.Документ1.СоздатьДокумент();
   
   Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(ТекЛист.Cells(1, 2).Value);
   НомерДокумента = ТекЛист.Cells(2, 2).Value;
   Дата = ТекЛист.Cells(3, 2).Value;
   
   Документ.Контрагент = Контрагент;
   Документ.Дата = Дата;
   Документ.Номер = НомерДокумента;

   Номер = 6;    
   НомерСтроки = ТекЛист.Cells(Номер, 1).Value;
   
   Пока НомерСтроки <> "#" Цикл
   
       Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ТекЛист.Cells(Номер, 2).Value);
       Количество = ТекЛист.Cells(Номер, 3).Value;
       Цена = ТекЛист.Cells(Номер, 4).Value;
//        Сумма = ТекЛист.Cells(Номер, 7).Value;
       
       Строка = Документ.Товары.Добавить();
       Строка.Номенклатура = Номенклатура;
       Строка.Количество = Количество;
       Строка.Цена = Цена;
//        Строка.Сумма = Сумма
       Номер = Номер + 1;
       НомерСтроки = ТекЛист.Cells(Номер, 1).Value;
   КонецЦикла;
   
   Документ.Записать();
   
КонецПроцедуры

Ошибка при вызове метода контекста (Cells): Произошла исключительная ситуация (0x800a03ec)
       НомерСтроки = ТекЛист.Cells(Номер, 1).Value;
119 Andrey_spb
 
26.07.06
14:35
Зачем вобще НомерСтроки брать из Excel?
120 jq
 
26.07.06
14:37
Так в книжке написано, а как иначе?
121 Andrey_spb
 
26.07.06
14:38
Я так понимаю там таблица с товарами, ну и сделай цикл типа:
КолС=ТекЛист.UsedRange.SpecialCells(11).Row;
Для н=6 По КолС Цикл

КонецЦикла;
122 jq
 
26.07.06
14:39
Эээ, а можно по русски
123 Andrey_spb
 
26.07.06
14:41
(122) Ну чего ещё по-русски тебе?!
124 Andrey_spb
 
26.07.06
14:43
Процедура КнопкаВыполнитьНажатие(Кнопка)
   
   Excel = Новый COMОбъект("Excel.Application");
   Excel.Workbooks.Open("C:\Documents and Settings\berezin\Рабочий стол\Книга1");
   Excel.Visible = 1;    
   ТекЛист=Excel.WorkSheets(1);        
   
   Документ = Документы.Документ1.СоздатьДокумент();
   
   Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(ТекЛист.Cells(1, 2).Value);
   НомерДокумента = ТекЛист.Cells(2, 2).Value;
   Дата = ТекЛист.Cells(3, 2).Value;
   
   Документ.Контрагент = Контрагент;
   Документ.Дата = Дата;
   Документ.Номер = НомерДокумента;

  КолС=ТекЛист.UsedRange.SpecialCells(11).Row;
Для Номер=6 По КолС Цикл

   
   

   
       Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ТекЛист.Cells(Номер, 2).Value);
       Количество = ТекЛист.Cells(Номер, 3).Value;
       Цена = ТекЛист.Cells(Номер, 4).Value;
//        Сумма = ТекЛист.Cells(Номер, 7).Value;

       
       Строка = Документ.Товары.Добавить();
       Строка.Номенклатура = Номенклатура;
       Строка.Количество = Количество;
       Строка.Цена = Цена;
//        Строка.Сумма = Сумма

   
 
   КонецЦикла;
   
   Документ.Записать();
   
КонецПроцедуры
125 MikleV
 
26.07.06
14:43
(123) UsedRange.SpecialCells(11).Row; бугага.. не, это песня а не тема.)
126 jq
 
26.07.06
14:44
Чего это за UsedRange.SpecialCells? По-русски как?
127 Andrey_spb
 
26.07.06
14:45
(125) Непонял?
128 Andrey_spb
 
26.07.06
14:45
(126) Количество строк это...
129 MikleV
 
26.07.06
14:47
(127) да это так.. он тибе попросил по - русски написать команду vb..ну а мине смешно стало.)
130 jq
 
26.07.06
14:47
UsedRange? и SpecialCells?
131 jq
 
26.07.06
14:47
(129)Ну да, а то не понятно
132 Andrey_spb
 
26.07.06
14:48
(129) а-а-а...
133 Andrey_spb
 
26.07.06
14:48
Чего непонятно? Говорю же, количество строк!
134 Andrey_spb
 
26.07.06
14:49
+ в Экселе...
135 jq
 
26.07.06
14:50
А русскими выражениями это не пишется что-ли?
136 Andrey_spb
 
26.07.06
14:52
(129) Блин! Я с тобой согласен!
137 jq
 
26.07.06
14:53
Стоп! (121)Этот цикл не катит: Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата)
Для Номер=6 По КолС Цикл
138 Andrey_spb
 
26.07.06
14:55
(135) Тебе всё-таки для начала надо чего-нибудь попроще почитать, что бы вобще иметь хотя бы общее представление о программировании...
139 MikleV
 
26.07.06
14:55
(136):)
(137)
КолС=ТекЛист.UsedRange.SpecialCells(11).Row;
//вот здесь вставь
сообщить("" + КолС);
//вот здесь вставь

Для Номер=6 По КолС Цикл
140 Andrey_spb
 
26.07.06
14:56
(137) Где ты там сравнение увидел вобще?!
141 jq
 
26.07.06
14:59
(139)Таже ошибка + сообщение "10" - чего это означает?

(140)В том-то и дело, что я его не вижу, это выдала программа, - типа ошибка.
142 Andrey_spb
 
26.07.06
15:03
(141) Чё-то ты темнишь...
143 jq
 
26.07.06
15:07
Все так и есть, как пишу. Процедура (124) дает ошибку (137) на строку Для Номер=6 По КолС Цикл. И с добавлением (139) тоже самое
144 MikleV
 
26.07.06
15:11
(143) ошибка не там..
 
   Excel = Новый COMОбъект("Excel.Application");
   Excel.Workbooks.Open("C:\Documents and Settings\berezin\Рабочий стол\Книга1");
   Excel.Visible = 1;    
   ТекЛист=Excel.WorkSheets(1);        
    КолС=ТекЛист.UsedRange.SpecialCells(11).Row;
Для Номер=6 По КолС Цикл
КонецЦикла;
   
не думаю что здесь есть ошибки.
145 jq
 
26.07.06
15:12
А чего программа тогда сюда ссылается?
146 MikleV
 
26.07.06
15:13
Excel = Новый COMОбъект("Excel.Application");
   Excel.Workbooks.Open("C:\Documents and Settings\berezin\Рабочий стол\Книга1");
   Excel.Visible = 1;    
   ТекЛист=Excel.WorkSheets(1);        
    КолС=ТекЛист.UsedRange.SpecialCells(11).Row;
   
Для Номер=6 По КолС Цикл
КонецЦикла;

вот так что, тоже ошибка?!
147 jq
 
26.07.06
15:18
Специально проверил - тоже ошибка!
148 Andrey_spb
 
26.07.06
15:18
Excel=Новый COMОбъект("Excel.Application");
Книга=Excel.Workbooks.Open(C:\Documents and Settings\berezin\Рабочий стол\Книга1.xls);
ТекЛист=Книга.Worksheets(1);
КолС=ТекЛист.UsedRange.SpecialCells(11).Row;
Документ = Документы.Документ1.СоздатьДокумент();
Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(ТекЛист.Cells(1, 2).Value);
НомерДокумента = ТекЛист.Cells(2, 2).Value;
Дата = ТекЛист.Cells(3, 2).Value;
Документ.Контрагент = Контрагент;
Документ.Дата = Дата;
Документ.Номер = НомерДокумента;
Для Номер=6 По КолС Цикл
       Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ТекЛист.Cells(Номер, 2).Value);
       Количество = ТекЛист.Cells(Номер, 3).Value;
       Цена = ТекЛист.Cells(Номер, 4).Value;
       Строка = Документ.Товары.Добавить();
       Строка.Номенклатура = Номенклатура;
       Строка.Количество = Количество;
       Строка.Цена = Цена;
КонецЦикла;
Документ.Записать();
149 Andrey_spb
 
26.07.06
15:21
+ И Эксель вобще-то закрывать нужно, когда считаешь данные... А то у тебя Экселей в процессах висит наверно уже туева хуча...
150 jq
 
26.07.06
15:23
А как их закрыть, я уже спрашивал
151 jq
 
26.07.06
15:24
(148)Снова эта ошибка
152 MikleV
 
26.07.06
15:24
(150)xl.Quit();
153 Andrey_spb
 
26.07.06
15:26
(151) А ты где это вобще всё пишешь?
154 Andrey_spb
 
26.07.06
15:26
+ А там нету случайно реквизита Номер?
155 MikleV
 
26.07.06
15:27
(154)нда. телепат однако)
156 jq
 
26.07.06
15:29
Пишу в модуле формы обработки, реквизиты только в форме док-та
157 Andrey_spb
 
26.07.06
15:30
(156) И у обработки нету реквизита Номер?
158 jq
 
26.07.06
15:30
Excel.Quit(); не закрывает его
159 jq
 
26.07.06
15:30
(157)Нету, а разве надо?
160 jq
 
26.07.06
15:31
+(159)Вру, есть Номер, Контрагент и Дата
161 Andrey_spb
 
26.07.06
15:31
(159) В том-то и дело что не надо...
162 Andrey_spb
 
26.07.06
15:33
(160) И Номер наверно ещё какого-нибудь ссылочного типа... Удали его нах!
163 jq
 
26.07.06
15:34
Теперь: Ошибка при вызове метода контекста (Записать): Не задана дата документа
   Документ.Записать();

Может и реквизит Дата удалить?
164 Andrey_spb
 
26.07.06
15:37
(163) :)) Удали и обработку удали и конфигуратор закрой и никогда больше не открывай!!!
165 Andrey_spb
 
26.07.06
15:40
Дату не судьба задать?
Дата = ТекЛист.Cells(3, 2).Value; // вот здесь в ячейке пусто
166 jq
 
26.07.06
15:40
Или надо написать типа дата=получитьТекДату?
167 Andrey_spb
 
26.07.06
15:41
(166) Ну напиши Дата=ТекущаяДата(); И не парь мозги...
168 MikleV
 
26.07.06
15:43
у тебя чего в ячейке  ТекЛист.Cells(3, 2).Value;?
у тебя вообще в ёкселе дата документа есть?
169 jq
 
26.07.06
15:46
Есть дата- 3 строка, 2 колонка
170 jq
 
26.07.06
15:49
Хе-хе, работает, только почему-то количество и цены записались, а номенклатура -нет
171 MikleV
 
26.07.06
15:57
(169) в каком формате?
172 jq
 
26.07.06
16:01
Тип - спр.ссылка.номенклатура
173 Andrey_spb
 
26.07.06
16:03
(172) Ну ё-моё! Ну не находит по твоим наименованиям ничего в спр.
174 Andrey_spb
 
26.07.06
16:04
А вобще прислушайся к совету в (164)
175 jq
 
26.07.06
16:05
А контрагент тоже не записался. Такое впечатление, что записываются только числа, строки - нет
176 MikleV
 
26.07.06
16:08
(175) ну посморти значение в ёкселе..код контрагента..
какой он, числовой, строковый..
потом значение кода в 1с.. и поимёшь..
177 jq
 
26.07.06
16:17
Вот так правильно

Процедура КнопкаВыполнитьНажатие(Кнопка)

   Excel = Новый COMОбъект("Excel.Application");
   Excel.Workbooks.Open("C:\Documents and Settings\berezin\Рабочий стол\Книга1");
   Excel.Visible = 1;    
   ТекЛист=Excel.WorkSheets(1);        
   
   Документ = Документы.Документ1.СоздатьДокумент();
   
   Контрагент = (ТекЛист.Cells(1, 2).Value);
   НомерДокумента = ТекЛист.Cells(2, 2).Value;
   Дата = ТекЛист.Cells(3, 2).Value;
   
   Документ.Контрагент = Контрагент;
   Документ.Дата = ТекущаяДата();
   Документ.Номер = НомерДокумента;

   Номер = 6;    
   НомерСтроки = ТекЛист.Cells(Номер, 1).Value;
   
   Пока НомерСтроки <> "#" Цикл
   
       Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ТекЛист.Cells(Номер, 2).Value);
       Количество = ТекЛист.Cells(Номер, 3).Value;
       Цена = ТекЛист.Cells(Номер, 4).Value;
//        Сумма = ТекЛист.Cells(Номер, 7).Value;
       
       Строка = Документ.Товары.Добавить();
       Строка.Номенклатура = Номенклатура;
       Строка.Количество = Количество;
       Строка.Цена = Цена;
//        Строка.Сумма = Сумма
       Номер = Номер + 1;
       НомерСтроки = ТекЛист.Cells(Номер, 1).Value;
   КонецЦикла;
   
   Документ.Записать();
   Excel.Quit();
   Документ.Открыть();
                         
КонецПроцедуры
178 jq
 
27.07.06
10:22
Здесь все просто - в Excele тип строка, у реквизита тоже.
Интересует еще такой вопрос, как быть, если в документе тип у поля - Спр.Ссылка.Организации, а в Excele - строка. И соответственно не происходит записи.
179 MikleV
 
27.07.06
10:23
найди организацию в 1с по значению того реквизита, который у тебя в строке Excel.
180 jq
 
27.07.06
10:25
Не понял. У меня вообще пустая база.
181 Andrey_spb
 
27.07.06
10:30
(180) Ну а чего ж ты хочешь?!! Если у тебя база пустая?
182 MikleV
 
27.07.06
10:31
(180) Создай Организацию.. в справочнике Организации..ручками.
183 jq
 
27.07.06
10:32
Так я хочу из Excel все записать в док-т Оприходование товаров
184 MikleV
 
27.07.06
10:35
(183) ты на какую оргнизацию приходовать собрался.. которой нет?
ну сделай так.. Справочники.организации.СоздатьОбъект();
185 Andrey_spb
 
27.07.06
10:35
(183) Ну..., а в док. ОприходованиеТоваров реквизит Организация - это СправочникСсылка.Организации? Вот и проверяй есть ли элемент с таким Наименованием или Кодом, по чему ты там ищешь? Нет так добавляй....
186 jq
 
27.07.06
10:42
Справочники.организации.СоздатьОбъект("Организация1"); Так?

А потом так?
Организация = ТекЛист.Cells(1, 2).Value;)
Если Организация из Спр.организации тогда...

Или так?
Организация = Спр.Организации.НайтиПоНаименованию(Строка(ТекЛист.Cells(1, 2).Value));
187 MikleV
 
27.07.06
10:45
Организация = ТекЛист.Cells(1, 2).Value;)
ВремОрг = Справочники.организации.НайтиПОРеквизиту("ТвойРеквизит",Организация);
Если ВремОрг.Пустая()  тогда
Справочники.Организации.СоздатьОбъект();
Конецесли;
188 jq
 
27.07.06
10:48
ВремОрг - это что значит - временная организация?
Глупый вопрос: реквизит - который у док-та, да?
189 MikleV
 
27.07.06
10:51
тьху..
Организация = ТекЛист.Cells(1, 2).Value;)

Если Справочники.организации.НайтиПОРеквизиту("ТвойРеквизит",Организация).Пустая()  тогда
Справочники.Организации.СоздатьОбъект();
Конецесли;

рекизит который есть у элемента справочника организации. его значение у тебя в ячейке xl.
190 jq
 
27.07.06
11:22
(189)Опять пишет про несоответствие типов
191 Stilet
 
27.07.06
12:00
(190) Твоя ошибка не в коде по большому счету, а в отсуствии понимания 8.0 как таковой. Тебе могут ответить на кучу вопросов, но пока ты не поймешь разница , скажем между ссылкой,объектом и менеджером документа - ты просто не врубишься в код. Да и вообще - начни с концепции - регистры,движения и пр..
192 jq
 
27.07.06
12:03
Справочники.Организации.СоздатьОбъект(); ничего не создается, какие параметры должны быть?
193 MikleV
 
27.07.06
12:17
Организация = ТекЛист.Cells(1, 2).Value;)

Если Справочники.организации.НайтиПОРеквизиту("ТвойРеквизит",Организация).Пустая()  тогда
Нов = Справочники.Организации.СоздатьОбъект();
Нов.Реквизит1 = бла- бла - бла;
--
--
Нов.Записать();
Конецесли;

автор.. стыдно должно быть. это не верх программирования и не сложный вопрос..
почитай чего - нить, в самом деле..
194 Эфиоп
 
27.07.06
14:53
Как создать новый файл Эксель и сохранить его с произвольным именем?
195 MikleV
 
27.07.06
14:55
получитьCOMобъект.. в СП посмотри..
196 Эфиоп
 
27.07.06
15:13
File = ПолучитьCOMОбъект("C:\123.xls","Excel.Application");

Ошибка при вызове метода контекста (ПолучитьCOMОбъект): Ошибка получения объекта COM: Интерфейс не поддерживается
197 Эфиоп
 
27.07.06
15:14
+196  (195)так она хочет обратиться уже к имеющемуся файлу, а мне нужен новый.
198 Andrey_spb
 
27.07.06
15:18
(197) 100 раз уже было...
Excel = Новый COMОбъект("Excel.Application");
Книга=Excel.Workbooks.Add();
199 Эфиоп
 
27.07.06
15:21
(198) Епта, я сохранить не могу с именем файла!!!
(195), (198) Смотрите (194)!
200 MikleV
 
27.07.06
15:22
(197)File = ПолучитьCOMОбъект(,"Excel.Application");
201 MikleV
 
27.07.06
15:24
(199) Книга.SavaAs("C:\sdfsdf.xls");
202 jq
 
27.07.06
15:24
(193)Ошибка при вызове метода контекста (Записать): Операция не выполнена!
           Нов.Записать();

Служебное сообщение:Перед записью в элементе справочника "Номенклатура" необходимо заполнить "базовая единица"! Откуда эта баз. единица, если эл-т справочника создается новый???

Кстати, а где определить имя этого нового эл-та в (193)?
203 MikleV
 
27.07.06
15:24
(199)Книга.SaveAs("sdf.xls");
204 Эфиоп
 
27.07.06
15:26
(200) ПитсдеТЗ! ты сам Синтаксис читал? Там даже екземпл есть, вот он:

// Получение объекта COM, соответствующего файлу
Таб = ПолучитьCOMОбъект("C:\DATA\DATA.XLS");

// Создание нового экземпляра объекта
Таб = ПолучитьCOMОбъект("", "Excel.Application");

// Получение активного объекта
Таб = ПолучитьCOMОбъект( , "Excel.Application");
205 MikleV
 
27.07.06
15:26
(202) в поиск. это я объяснять не буду.. и думаю никто не будет.. тема уже столько раз обсуждалась..
Справочники.ЕдиницыИзмерения.. откуда бы ещё ей взятся
206 Эфиоп
 
27.07.06
15:26
(203) Ща посмотрю
207 MikleV
 
27.07.06
15:28
(204) чё ты орёшь как потерпевший.. кавычки забыл. это да.
208 jq
 
27.07.06
15:28
(205)Я создаю новый эл-т справочника и не добавляю такой реквизит (ед.измерения), почему же программа на него ссылается?
209 Andrey_spb
 
27.07.06
15:31
(208) Смотри в модуле объект ПриЗаписи()
210 Andrey_spb
 
27.07.06
15:34
а это новый файл в Экселе:
Excel = Новый COMОбъект("Excel.Application");
Книга=Excel.Workbooks.Add();
Книга.SaveAs(ИмяФайла);
Зачем получать СОМОбъект? Это извращение какое-то...
211 MikleV
 
27.07.06
15:37
(208) потому что у валенков должна быть единица измерения штуки.. ты ж их как то хранить будешь.. или кг.. какая разница.. главное чтобы она была(ед изм.)
т.е. как происходит - при создании элемента справочника надо ещё создавать и единицу измерения.
212 jq
 
27.07.06
15:39
Написал Нов.БазоваяЕдиницаИзмерения = "шт";, а все-равно таже ошибка
213 MikleV
 
27.07.06
15:39
(210) сам ты извращенец)) а методом Новый COMObject ты чего делаешь?
Новый COMObject("Excel.Application");
и
GetCOMObject("","Excel.Application") думаю что они равноценны..
214 MikleV
 
27.07.06
15:40
(212) я ж говорю.. клиника..
Нов.БазоваяЕдиницаИзмерения  - тип - ссылка на элемент справочника единицы измерения..
215 jq
 
27.07.06
15:51
Так что-ли?

Код = ТекЛист.Cells(Номер, 1).Value;
       Ссылка = Справочники.Номенклатура.НайтиПоКоду(Код);
       Если Ссылка.Пустая() Тогда
           Нов = Справочники.Номенклатура.СоздатьЭлемент();
           Нов.Код = Код;
           Нов.Наименование = ТекЛист.Cells(Номер, 2).Value;
           БазЕдИзм = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
           Нов.БазоваяЕдиницаИзмерения = БазЕдИзм;
           Нов.Записать();
216 jq
 
27.07.06
15:58
Вернее так

Код = ТекЛист.Cells(Номер, 1).Value;
       Ссылка = Справочники.Номенклатура.НайтиПоКоду(Код);
       Если Ссылка.Пустая() Тогда
           Нов = Справочники.Номенклатура.СоздатьЭлемент();
           Нов.Код = Код;
           Нов.Наименование = ТекЛист.Cells(Номер, 2).Value;
           БазЕдИзм = Справочники.ЕдиницыИзмерения.СоздатьЭлемент();
           БазЕдИзм.Наименование = "шт";
           Нов.БазоваяЕдиницаИзмерения = БазЕдИзм;
           Нов.Записать();

Все-равно пишет, что баз.ед.изм не задана
217 Эфиоп
 
27.07.06
16:06
А как создать каталог, в который запишется файл?
218 MikleV
 
27.07.06
16:07
(216) нда..я тебя малясь дезинформировал.. суть от этого не меняестся.. тип у БазовойЕдиницыИзмерения элемент справочника КлассификаторЕдиницИзмерения..кстати, он скорее всего уже создан.. посморти в пользовательском режиме.. если нет, создай..
219 Andrey_spb
 
27.07.06
16:14
(217) Например так:
СоздатьКаталог("C:\Temp");
220 jq
 
27.07.06
16:20
Точно, у БазовойЕдиницыИзмерения тип СправочникСсылка.КлассификаторЕдиницИзмерения, и этот эл-т уже создан.

Так как тогда вытянуть оттуда ед.изм., совсем запутался?

   БазЕдИзм = Справочники.КлассификаторЕдиницИзмерения;
   БазЕдИзм.Наименование = "шт";
   Нов.БазоваяЕдиницаИзмерения = БазЕдИзм;

Так?
221 MikleV
 
27.07.06
16:21
(220) БазЕдИзм = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт");
222 Andrey_spb
 
27.07.06
16:22
БазЕдИзм=Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт");
// можно так, если она там уже есть конечно...
223 Andrey_spb
 
27.07.06
16:22
(221) опередил....
224 jq
 
27.07.06
16:46
Хех, я думал будет группа, а получился список.
225 jq
 
27.07.06
17:23
Только что все работало.
Добавил

           НомГруппа = Справочники.НоменклатурныеГруппы.СоздатьГруппу("Основная");
           Нов.НоменклатурнаяГруппа = НомГруппа;
           Нов.Код = "001";

Пишет, что много фактических параметров. А каких именно?
226 MikleV
 
27.07.06
17:27
(225)СоздатьГруппу (CreateFolder)
Синтаксис:
СоздатьГруппу()
Возвращаемое значение:
Тип: СправочникОбъект.
Описание:
Создает новую группу справочника.
Пример:
НовыйОбъект = Справочники["Контрагенты"].СоздатьГруппу();
НовыйОбъект.Наименование = "Покупатели";
НовыйОбъект.Записать();

вот скажи мне.. где там написано что в метод СоздатьГруппу можно передавать параметр
227 jq
 
28.07.06
14:30
СсылкаНомГр = Справочники.НоменклатурныеГруппы;
   Если СсылкаНомГр.ПустаяСсылка() Тогда
       НомГр = Справочники["Номенклатура"].СоздатьГруппу();
       НомГр.Наименование = "Основная";
       НомГр.Записать();
   КонецЕсли;

Ошибка: Преобразование значения к типу Булево не может быть выполнено
   Если СсылкаНомГр.ПустаяСсылка() Тогда

До того, как добавил условие если...тогда - все работало, а теперь нет, в чем дело?
228 Andrey_spb
 
28.07.06
14:34
А это по твоему на чё ссылка: СсылкаНомГр?
229 jq
 
28.07.06
14:49
Не, вот так

   Пока НомерСтроки <> "#" Цикл    
       КодНомГр = Справочники.НоменклатурныеГруппы;    
       СсылкаНомГр = Справочники.НоменклатурныеГруппы.НайтиПоКоду(КодНомГр);
       Если СсылкаНомГр.Пустая() Тогда
           НомГр = Справочники["Номенклатура"].СоздатьГруппу();
           НомГр.Наименование = "Основная";
           НомГр.Записать();
       КонецЕсли;

Почему-то создается сразу две одинаковые группы, из-за чего это? И почему, если группа уже создана,то создается еще и еще, в условии же сказано: Если СсылкаНомГр.Пустая...?
230 jq
 
28.07.06
15:06
up
231 MikleV
 
28.07.06
15:11
КодНомГр = Справочники.НоменклатурныеГруппы;  - это чего такое
                                                             \|/
СсылкаНомГр = Справочники.НоменклатурныеГруппы.НайтиПоКоду(КодНомГр);
232 jq
 
28.07.06
15:16
Ну, типа я ищу по коду.
233 jq
 
28.07.06
15:18
А как тогда проверить есть ли такая группа или нет?
234 Andrey_spb
 
28.07.06
15:18
(232) Ну типа и ищи по коду, а ты чё делаешь? КодНомГр = Справочники.НоменклатурныеГруппы;
235 jq
 
28.07.06
15:26
Так я вроде так и делаю

       СсылкаНомГр = Справочники.НоменклатурныеГруппы.НайтиПоКоду(XYZ);

А что тогда писать вместо "XYZ"?
236 mx-daemon
 
28.07.06
15:59
(69) В указанном случае перебор лучше осуществлять
с помощью цикла Для Каждого (For Each)
237 MikleV
 
28.07.06
16:00
(235) ЗНАЧЕНИЕ..
а  Справочники.НоменклатурныеГруппы; - это Справочник в целом.. вернее, ссылка на справочник..
238 jq
 
28.07.06
16:07
(237)Так где я возьму значение, если такой группы еще нет. Я же ее создать хочу
239 MikleV
 
28.07.06
16:13
(238) бери код из екселя.. если код группы неважен поставь автонумерацию в справочнике и не мучайся.
240 jq
 
28.07.06
16:23
Автонумерация стоит, тогда вообще становится непонятно, как проверять ссылку на пустоту. А почему у меня две группы создаются???
241 MikleV
 
28.07.06
16:33
Пока НомерСтроки <> "#" Цикл    

       КодНомГр = Справочники.НоменклатурныеГруппы;    
       СсылкаНомГр = Справочники.НоменклатурныеГруппы.НайтиПоКоду(КодНомГр);
       Если СсылкаНомГр.Пустая() Тогда
           НомГр = Справочники["Номенклатура"].СоздатьГруппу();
           НомГр.Наименование = "Основная";
           НомГр.Записать();
       КонецЕсли;
НомерСтроки - вот и создаётся 2..(в цикле две итерации)
искать уже созданную? либо по коду либо по одному из реквизитов..
242 jq
 
28.07.06
16:39
Где две итерации? СоздатьГруппу написано 1 раз. Надо что-ли вне цикла это писать? И еще, когда код доходит до 9, то пишет: код не уникален
243 MikleV
 
28.07.06
16:56
(242) скажи мне , сколько у тебя строк с группами в файле xl?
244 jq
 
31.07.06
10:40
КодНомГр = Справочники.НоменклатурныеГруппы;    
   СсылкаНомГр = Справочники.НоменклатурныеГруппы.НайтиПоКоду(КодНомГр);
   Если СсылкаНомГр.Пустая() Тогда
       НомГр = Справочники["Номенклатура"].СоздатьГруппу();
       НомГр.Наименование = "Основная";
       НомГр.Записать();
   КонецЕсли;
   Пока НомерСтроки <> "#" Цикл    
       Код = ТекЛист.Cells(Номер, 1).Value;
       Ссылка = Справочники.Номенклатура.НайтиПоКоду(Код);
       Если Ссылка.Пустая() Тогда
           Нов = Справочники.Номенклатура.СоздатьЭлемент();
           Нов.Код = Код;
           Нов.Наименование = ТекЛист.Cells(Номер, 2).Value;
           Нов.НаименованиеПолное = ТекЛист.Cells(Номер, 3).Value;
       .....
           Нов.НоменклатурнаяГруппа = НомГр.Наименование;
           Нов.Записать();
       КонецЕсли;    

Почему у меня в форме списка в колонку НоменклатурнаяГруппа не записывается название группы??? Что не так?
245 jq
 
31.07.06
11:35
up
246 Эфиоп
 
04.08.06
14:01
Если это:
файл = Новый ComОбъект("Excel.Application") - COM соединение, тогда как создать OLE соединение?
247 Zoomer
 
04.08.06
14:29
(246) файл = Новый ComОбъект("Excel.Application") - это OLE. COM используется тогда, когда вызываемое приложение заточено под COM. Да и принципиальная разница у этих интерфейсов небольшая.
248 bahti78
 
09.08.06
13:53
я не умею програмировать на 1 с как быстро научиться програмировать бесплатно
249 Geza
 
09.08.06
14:15
(248) Убей себя и родись заново.
Дешево, но результат не гарантирован
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой