|
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) Не стОит, в неопределенных типах есть некоторые нюансы в работе.
Все же перепиши код, очень понадобится в дальнейшем, потому что в этой кальке пишутся все обмены с чем угодно. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |