Имя: Пароль:
1C
1C 7.7
v7: таблицу Excel в ТЧ документа 1С
, ,
0 bijela
 
05.09.11
17:34
Даже не знаю, как обратиться. Поэтому как говорил товарищ О. Бендер: ближе к телу. Необходимо данные из таблиц Excel загрузить в табличную часть приходной накладной.Идея стара как мир.  Нашел всем известную внешнюю обработку, даже книжку Дубянского прикупил по случаю.  Сделать наскоком, убрав и заменив мне понятные места, не получилось. Видно запутался с реквизитами и идентификаторами.  Поэтому ниже привожу код обработки и задам несколько вопросов. Заранее прошу терпения, т.к. в этом вопросе  я «бей ведро». Поэтому «популярно для невежд».
Функция ПолучитьЗначение(Excel,y,x)
Cell=Excel.Cells(y,x);
Возврат Cell.Value;
КонецФункции

Процедура ВыбратьФайл()
Файл=СоздатьОбъект("ФС");
Если Файл.ВыбратьФайл(0,ИмяФайла,ИмяКаталога, "Выберите файл, содержащий накладную", "Файлы Microsoft Excel|*.xls|Все файлы|*.*","xls")<>1 Тогда
Возврат;
КонецЕсли;
ИмяФайла=ИмяКаталога+ИмяФайла;
КонецПроцедуры
//********************************************************************************
Процедура Загрузка()
Спр=СоздатьОбъект("Справочник.Номенклатура");
ВыбратьФайл();
Excel=СоздатьОбъект("Excel.Application");
РабочаяКнига=Excel.Workbooks;
РабочаяКнига.Open(ИмяФайла,0,1);
i=7;
Стр=(СокрЛП(Строка(ПолучитьЗначение(Excel,i,1))));
Пока ПустаяСтрока(Стр)=0 Цикл
Стр=(СокрЛП(Строка(ПолучитьЗначение(Excel,i,1))));
Если ПустаяСтрока(Стр)=1 Then
Сообщить("Загрузка закончена","i");
Прервать;
КонецЕсли;
НоваяСтрока();
НомерСтроки=Стр;
ТоварСпр=(СокрЛП(Строка(ПолучитьЗначение(Excel,i,2))));
Если Спр.НайтиПоНаименованию(ТоварСпр,0)=0 Тогда
Спр.Новый();
Спр.Наименование=(СокрЛП(Строка(ПолучитьЗначение(Excel,i,2))));
Спр.Себестоимость=Число(ПолучитьЗначение(Excel,i,3));
Спр.СтавкаНДС=Число(ПолучитьЗначение(Excel,i,6));
КонецЕсли;
Спр.Записать();
Спр.НайтиПоНаименованию(ТоварСпр,0);
Тов=Спр.Наименование;
Товар=Спр.ТекущийЭлемент();
Цена=Число(ПолучитьЗначение(Excel,i,3));
Количество=Число(ПолучитьЗначение(Excel,i,4));
Сумма=Число(ПолучитьЗначение(Excel,i,5));
СтавкаНДС=Число(ПолучитьЗначение(Excel,i,6));
НДС=Число(ПолучитьЗначение(Excel,i,7));
i=i+1;
КонецЦикла;
КонецПроцедуры  

Как написано в книжке, первоначально в модуле добавил переменные
Перем ИмяФайла, ИмяКаталога;
Затем:
1.("Справочник.Номенклатура") заменил на ("Справочник.ТМЦ"), т.к. мой справочник где находится номенклатура имеет Идентификатор ТМЦ.
2. i=7 заменил на i=1, т.к. решил что все будет начинаться с первой строки.
3. дошел до строки кода Тов=Спр.Наименование; - наморщил репу, не знаю что делать дальше.
Хелп.
1 G-Re
 
05.09.11
21:35
Что-то не совсем понятно, в коде, насколько я понял, из Ексел берутся данные, харакиеризующие некую запись справочника ТМЦ, на основании которых эта запись и создается.
В теме же указана ТЧ документа.
Так в чем же вопрос или проблема?

Общий алгоритм примерно такой.
1. Создается новый документ(через СоздатьОбъект). (или в документе на форме, например, должна быть Кнопка типа "Создать ТЧ из Ексел" или что-то подобное).
2. В цикле считываются строки из Ексел, на основании значений ячеек которых формируется ТЧ., то есть что-то типа

Цикл по строкам Ексел
  НоваяСтрока();
  РеквизитСтроки1=ПолучитьЗначение(Ексел,НомР1,стр);
  РеквизитСтроки2=ПолучитьЗначение(Ексел,НомР2,стр);
КонецЦикла;

где стр - номер строки в Ексел-файле
НомРх - номер ячейки Ексел, соответствующей РеквизитСтроких ТЧ документа.
Где-то так.
2 bijela
 
05.09.11
22:40
сорри, сам дурак. это не внешняя обработка, а кусок который вставляется модуль форма-документа. в диалоге есть кнопка (Формула Загрузка()по которой происходит загрузка выбранного фай
3 G-Re
 
05.09.11
22:43
Так что, проблему решил, все понятно? или еще есть вопросы?
4 bijela
 
05.09.11
22:44
сорри, сам дурак. это не внешняя обработка, а кусок кода, который вставляется в модуль формы-документа ПриходнаяНакладная. в диалоге сделана кнопка Загрузка(), по которой происходит выбор и должна происходить загрузка Excel файла.
5 G-Re
 
05.09.11
23:00
Да, дополнение к (1).
Если в Екселе в ячейке нечто из справочника, например Наименование, то, конечно, нужно сначала найти этот элемент по наименованию или создать новый, если не найден и только потом присвоить этот элемент реквизиту ТЧ, например, так
РеквизитТЧспр=Спр.ТекущийЭлемент();
6 bijela
 
05.09.11
23:46
Извините, но взятый за основу кусок работает судя по отзывам, а я пытаюсь его переделать под таблицу Excel с двумя столбцами: первый номенклатура второй количество.
После Тов=Спр.Наименование; убрал все, что не касается количества\ после выбора и загрузки файла выдает сообщение
Cell=Excel.Cells(y,x);
{Документ.ПриходнаяНакладная.Форма.Модуль(7)}: Значение не представляет агрегатный объект (Cells)
7 smaharbA
 
06.09.11
00:57
по поводу келсов - переписывай код заново

Книги=Excel.Workbooks;
Книга=Книги.Open(ИмяФайла,0,1);
...
ПолучитьЗначение(Книга,i,2)
8 bijela
 
06.09.11
14:03
а теперь переведите фразу "по поводу келсов - переписывай код заново"
9 G-Re
 
06.09.11
20:43
(6) Попробуй вставить в самом начале всего
Перем Excel;
10 G-Re
 
06.09.11
20:48
(6) Да, еще заморочка у тебя ожидается, если количество, то сразу вопрос ЕдиницаИзмерения!!! Как правило, это подчиненный к ТМЦ справочник, в котором ссылка на Перечисление. Если у тебя в Екселе будут ед.изм, то могут быть большие проблемы - Перечисление программно не модифицируется, поэтому, если встретится некорректно написанная или нестандартная(отсутствующая в Перечислении).
11 ЧеловекДуши
 
06.09.11
20:56
Лучше не через ексель все делать, а через моксель или адо.
12 bijela
 
07.09.11
14:05
первоначально Перем Excel не написал, в книжке про это не говорилось. получил ругательство при попытке открыть расходную накладную. прочитал ругательство, наморщил лоб и вписал там где и все Перем Excel. Манипуляции продвинулись вплоть до выбора файла Excel, а потом ошибка о которой писал раньше: Cell=Excel.Cells(y,x);
{Документ.ПриходнаяНакладная.Форма.Модуль(7)}: Значение не представляет агрегатный объект (Cells)
13 smaharbA
 
07.09.11
19:01
(8) что тут переводит ?
вы свой код посмотрите и (7)
14 G-Re
 
07.09.11
21:20
(12) Если на это

...
Excel=СоздатьОбъект("Excel.Application");
РабочаяКнига=Excel.Workbooks;
РабочаяКнига.Open(ИмяФайла,0,1);
...
не ругается(Текст скопипастил с твоего) и Перем Еxcel есть,
посмотри
1. Одно ли это в тексте описание этой переменоой. Должно быть одно. Поставь его самым первым оператором в модуле Формы.
2. Проверь на буквы слово Excel, может где-то кириллица попалась. Скопипасти это имя из объявления Excel=СоздатьОбъект("Excel.Application");
-----
в Перем.
Каких-то других причин вроде нет. Задачка в общем-то примитивная.
15 bijela
 
07.09.11
23:24
переменные в начале модуля в следующем виде
Перем ИтОст;  
Перем ИтСуммаБезНДСВал,    ИтСуммаСНДС, ОбщаяСтоимость;
Перем ИмяФайла, ИмяКаталога, Excel;
, а кириллицу проверю.
16 smaharbA
 
08.09.11
00:13
Код переписывай, о такой наколке рано или поздно во всех ветках про ексель предупреждаю
в (7) все, что тебе нужно
17 bijela
 
08.09.11
19:42
кириллица подвела однозначно. переписал заново ошибка выше пропала. потом возникли локальные ошибки с реквизитами и идентификаторами, но в конечном итоге справился. больше не ругается. проверяет старые и создает новые наименования в справочнике ТМЦ. Но, и похоже это уже сильный геморой для меня: данные из таблицы Excel (второй столбец наименование товара, третий - его количество)в приходную накладную загоняет , но только без товара первой ячейки Excel. Повторюсь, в справочник ТМЦ товар попал, а в приходную накладную нет, есть только его количество, естественно там где оно и должно быть. с последующими товарами из Exel таблицы проблем нет - попадают все в нужном количестве.
ниже показываю код, который получился:

Процедура Загрузка()
Спр=СоздатьОбъект("Справочник.ТМЦ");
ВыбратьФайл();
Excel=СоздатьОбъект("Excel.Application");
РабочаяКнига=Excel.Workbooks;
РабочаяКнига.Open(ИмяФайла,0,1);
i=2;
Стр=(СокрЛП(Строка(ПолучитьЗначение(Excel,i,1))));
Пока ПустаяСтрока(Стр)=0 Цикл
Стр=(СокрЛП(Строка(ПолучитьЗначение(Excel,i,1))));
Если ПустаяСтрока(Стр)=1 Then
Сообщить("Загрузка закончена","i");
Прервать;
КонецЕсли;
НоваяСтрока();
НомерСтроки=Стр;
ТМЦСпр=(СокрЛП(Строка(ПолучитьЗначение(Excel,i,2))));
Если Спр.НайтиПоНаименованию(ТМЦСпр,0)=0 Тогда
Спр.Новый();
Спр.Наименование=(СокрЛП(Строка(ПолучитьЗначение(Excel,i,2))));
//Спр.Себестоимость=Число(ПолучитьЗначение(Excel,i,3));
//Спр.СтавкаНДС=Число(ПолучитьЗначение(Excel,i,6));
КонецЕсли;
Спр.Записать();
Спр.НайтиПоНаименованию(ТМЦСпр,0);
ТМЦ=Спр.Наименование;
ТМЦ=Спр.ТекущийЭлемент();
//Цена=Число(ПолучитьЗначение(Excel,i,3));
Кво=Число(ПолучитьЗначение(Excel,i,3));
//Сумма=Число(ПолучитьЗначение(Excel,i,5));
//СтавкаНДС=Число(ПолучитьЗначение(Excel,i,6));
//НДС=Число(ПолучитьЗначение(Excel,i,7));
i=i+1;
КонецЦикла;
КонецПроцедуры
18 smaharbA
 
08.09.11
19:43
код однозначно не верен и на грабли наступишь снова рано или поздно
19 Tatitutu
 
08.09.11
19:51
20 Tatitutu
 
08.09.11
19:52
+(19) внизу страницы, почти готовый вариант (рыба) бесплатно и открытым кодом
21 bijela
 
08.09.11
20:09
с этим прыгскоком ситуация аналогичная: не ругается, наименование первого товара в табличную часть документа (любого) 1с не пишет.
22 GreyK
 
08.09.11
20:14
(0) Отладчик рулит в ситуациях "научного тыка".
23 G-Re
 
09.09.11
11:40
(17) Присоединяюсь к (18). Код экстравагантен для такой простой задачки.
Тебе уже обо всем рассказали и показали, выкинь все, подумай и структурно и осознанно напиши все снова... и все получится!
24 bijela
 
09.09.11
14:43
Коллеги, если я могу вас так назвать?, а скорей всего нет, так как я просто интересующийся. Проведя анализ я понял, что дело не в моем коде, а точнее позаимствованном, пусть даже и таком экстравагантном для такой простой задачки. аналогичную проблему я получал при использовании внешней обработки "прыгскок". Поэтому полез посмотреть свойства реквизита ТМЦ приходной накладной, где в поле Тип значения Справочник.ТМЦ поменял на просто Справочник. Представьте, заработала. Все мои ТМЦ попали в приходную накладную.
25 smaharbA
 
10.09.11
02:16
наколешся
26 G-Re
 
10.09.11
09:32
(24) Не стОит, в неопределенных типах есть некоторые нюансы в работе.
Все же перепиши код, очень понадобится в дальнейшем, потому что в этой кальке пишутся все обмены с чем угодно.