Имя: Пароль:
1C
 
Вывод калькуляции из Excel
,
0 Mitka90
 
21.12.17
09:02
Здравствуйте!
Возникает такая проблема.
При загрузке данных из файла Excel при нажатии на кнопку "Грузим калькуляции" возникает ошибка.

{Документ.ПриказНаКалькуляцию.Форма.ФормаДокумента.Форма(610)}: Ошибка при вызове метода контекста (Cells)
    пока сокрлп(""+док.SHeets("Лист").Cells(номстр,1).value)<>"zzzzzz" цикл //смотрим код!!!
по причине:
Произошла исключительная ситуация (0x800a03ec)

Код:
Процедура ГрузимКалькуляции(Кнопка)
    Если ЗначениеЗаполнено(файл) тогда
    сообщить(файл);
    док=получитьComобъект(файл);
    номстр=НачалоСтроки;
      ии=0;
      нн=0;
    пока сокрлп(""+док.SHeets("Лист").Cells(номстр,1).value)<>"zzzzzz" цикл //смотрим код!!!
        ии=ии+1;
        Зкод=сокрлп(""+док.SHeets("Лист").Cells(номстр,1).value);
        сообщить(Зкод); //код
        Знаим=сокрлп(""+док.SHeets("Лист").Cells(номстр,2).value); //наименование
        спр=справочники.Прейскурант.НайтиПоКоду(СокрЛП(Зкод));
        Если спр.Ссылка<>справочники.Прейскурант.ПустаяСсылка()  Тогда
            стро=Работы.Добавить();
            стро.ПунктПрейскуранта=спр.Ссылка;
            стро.код=Зкод;
            стро.ценанас=сокрлп(""+док.SHeets("Лист").Cells(номстр,24).value);
            стро.ценаюл=сокрлп(""+док.SHeets("Лист").Cells(номстр,24).value);
            стро.нормавремени= Окр(сокрлп(""+док.SHeets("Лист").Cells(номстр,22).value),   2);
            стрразр=сокрлп(""+док.SHeets("Лист").Cells(номстр,4).value);
            цр=ДайЦиферкуИзРазряда(стрразр);
            стро.Разряд= ДайРазрядПоНомеру(цр);            
        Иначе    
             сообщить("не найден код="+Зкод);
        КонецЕсли;        
            номстр=номстр+1;        
        КонецЦикла;
       Конецесли;
КонецПроцедуры
1 regniws
 
21.12.17
09:18
видимо не надо округлять строки

стро.нормавремени= Окр(сокрлп(""+док.SHeets("Лист").Cells(номстр,22).value),   2);
2 Mitka90
 
21.12.17
09:33
Даже без округления та же самая ошибка появляется.
3 Остап Сулейманович
 
21.12.17
09:33
(1) Нифига. До округления строк дело еще не дошло. Оно не может понять что такое "Cells". Нужно смотреть, что возвращает
получитьComобъект(файл).
4 Остап Сулейманович
 
21.12.17
09:38
(3) /*Сторно*/.
получитьComобъект возвращает все как нужно. Скорее всего в книге нет листа с именем "Лист". А проверка его существования возложена на дядю Пушкина.
5 Mitka90
 
21.12.17
09:47
Как раз лист такой в документе есть, специально даже его переименовал в "Лист".
6 Остап Сулейманович
 
21.12.17
09:49
(5) Если все так - отлично. Теперь подошли к конструкции "номстр=НачалоСтроки;". Чему равно "НачалоСтроки"? Что говорит отладчик?
7 Mitka90
 
21.12.17
10:23
Выводит значение "0".
8 Остап Сулейманович
 
21.12.17
10:30
(7) Ну так выставь в "1".
9 Mitka90
 
21.12.17
11:42
(8) спасибо, выводит!

А как сделать так, чтобы выводились те данные, которых нет в справочнике "Прейскурант" (т.е. код и наименование)? Т.е. устроить "обратный" вывод.
10 Остап Сулейманович
 
21.12.17
11:45
(9) Не понятно.
"данные, которых нет в справочнике "Прейскурант" (т.е. код и наименование)?"

А вот это где по коду ищет?
спр=справочники.Прейскурант.НайтиПоКоду(СокрЛП(Зкод));
11 Mitka90
 
21.12.17
13:43
(10)
То есть, существует в конфигурации справочник "Прейскурант", в котором есть код, наименование, цена и т.д.
И в этом справочнике существуют данные, которые данной процедурой 1С "проверяются" на то, что они есть или в этом справочнике, соответственно, выводятся данные, которых нет там.

То есть, "спр" - это то, что проверяется по справочнику (в данном случае - по столбцу "Код") и выводится или нет.

У меня получилось переделать так, но при этом в столбец "Наименование" ничего не выводится, а также в таблице появляются пустые строки, причём их много заносится после вывода всех данных:

Процедура ГрузимКалькуляции(Кнопка)
    Если ЗначениеЗаполнено(файл) тогда
    сообщить(файл);
    док=получитьComобъект(файл);
    номстр=1;
      ии=0;
      нн=0;
    пока сокрлп(""+док.SHeets("Лист").Cells(номстр,1).value)<>"zzzzzz" цикл //смотрим код!!!
        ии=ии+1;
        Зкод=сокрлп(""+док.SHeets("Лист").Cells(номстр,1).value);
        сообщить(Зкод); //код
        Знаим=сокрлп(""+док.SHeets("Лист").Cells(номстр,2).value); //наименование
        спр=справочники.Прейскурант.НайтиПоКоду(СокрЛП(Зкод));
        Если спр.Ссылка=справочники.Прейскурант.ПустаяСсылка()  Тогда
            стро=Работы.Добавить();
            стро.ПунктПрейскуранта=спр.Ссылка;
            стро.код=Зкод;
            стро.ценанас=сокрлп(""+док.SHeets("Лист").Cells(номстр,29).value);
            стро.ценаюл=сокрлп(""+док.SHeets("Лист").Cells(номстр,29).value);
        Иначе    
             сообщить("не найден код="+Зкод);
        КонецЕсли;
            номстр=номстр+1;    
        КонецЦикла;
       Конецесли;
КонецПроцедуры
12 fleur
 
21.12.17
15:28
Видимо, надо добавить:
Стро.наименование=3наим;
13 Mitka90
 
22.12.17
08:40
Исправил на вот этот вариант (плюс устранил лишние пустые строки в конце), но всё равно наименование не отображается:

Процедура ГрузимКалькуляции(Кнопка)
    Если ЗначениеЗаполнено(файл) тогда
    сообщить(файл);
    док=получитьComобъект(файл);
    номстр=1;
      ии=0;
      нн=0;
    пока сокрлп(""+док.SHeets("Лист").Cells(номстр,1).value)<>"zzzzzz" цикл //смотрим код!!!
        ии=ии+1;
        Зкод=сокрлп(""+док.SHeets("Лист").Cells(номстр,1).value);
        сообщить(Зкод); //код
        Знаим=сокрлп(""+док.SHeets("Лист").Cells(номстр,2).value); //наименование
        спр=справочники.Прейскурант.НайтиПоКоду(СокрЛП(Зкод));
        спр2=справочники.Прейскурант.НайтиПоНаименованию(СокрЛП(Знаим));
        Если спр.Ссылка=справочники.Прейскурант.ПустаяСсылка()  Тогда
            стро=Работы.Добавить();
            стро.ПунктПрейскуранта=Знаим;
            стро.код=Зкод;
            стро.ценанас=сокрлп(""+док.SHeets("Лист").Cells(номстр,61).value);
            стро.ценаюл=сокрлп(""+док.SHeets("Лист").Cells(номстр,59).value);
        Иначе    
             сообщить("не найден код="+Зкод);
        КонецЕсли;
            номстр=номстр+1;
    КонецЦикла;
Конецесли;
КонецПроцедуры
14 Mitka90
 
22.12.17
08:42
Точнее, вот такой код получается (наименование не отображается):

Процедура ГрузимКалькуляции(Кнопка)
    Если ЗначениеЗаполнено(файл) тогда
    сообщить(файл);
    док=получитьComобъект(файл);
    номстр=1;
      ии=0;
      нн=0;
    пока сокрлп(""+док.SHeets("Лист").Cells(номстр,1).value)<>"zzzzzz" цикл //смотрим код!!!
        ии=ии+1;
        Зкод=сокрлп(""+док.SHeets("Лист").Cells(номстр,1).value);
        сообщить(Зкод); //код
        Знаим=сокрлп(""+док.SHeets("Лист").Cells(номстр,2).value); //наименование
        спр=справочники.Прейскурант.НайтиПоКоду(СокрЛП(Зкод));
        спр2=справочники.Прейскурант.НайтиПоНаименованию(СокрЛП(Знаим));
        Если спр.Ссылка=справочники.Прейскурант.ПустаяСсылка()  Тогда
        Если спр2.Ссылка=справочники.Прейскурант.ПустаяСсылка()  Тогда
            стро=Работы.Добавить();
            стро.ПунктПрейскуранта=Знаим;
            стро.код=Зкод;
            стро.ценанас=сокрлп(""+док.SHeets("Лист").Cells(номстр,29).value);
            стро.ценаюл=сокрлп(""+док.SHeets("Лист").Cells(номстр,29).value);
        Иначе    
             сообщить("не найден код="+Зкод);
        КонецЕсли;
            номстр=номстр+1;
    КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры