Ошибка при вызове метода контекста cells

Загрузка номенклатуры из Excel в 1С 8. Раздел «Программирование 1С». Форум программистов «Весельчак У»

Здравствуйте! Подскажите, пожалуйста! Загружаю из Excel данные, хочу обратиться к именованной области, выдает следующую ошибку: «Ошибка при вызове метода контекста (Cells): Произошла исключительная ситуация (0x800a03ec)
ФайлСтрок = Excel.Cells(2,1).SpecialCells(21).Row;
по причине:
Произошла исключительная ситуация (0x800a03ec)»

Процедура ОсновныеДействияФормыЗагрузить(Кнопка)

НомерКолонкиАртикул = ЭлементыФормы.ТабличныйДокумент.Область(«R2C1»;
НомерКолонкиНаименованияТовара = ЭлементыФормы.ТабличныйДокумент.Область(«R2C2»;
НомерКолонкиЕдиницаИзмерения = ЭлементыФормы.ТабличныйДокумент.Область(«R2C3»;
НомерКолонкиСтрана = ЭлементыФормы.ТабличныйДокумент.Область(«R2C4»;

//В разных версиях Excel получаются по-разному, поэтому сначала определим версию Excel
Excel = новый COMОбъект(«Excel.Application»;

Версия = Лев(Excel.Version,Найти(Excel.Version,».»-1);
Если Версия = «8» тогда
ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Excel.Cells(2,1).SpecialCells(21).Row;
ФайлКолонок = Excel.Cells(2,1).SpecialCells(21).Column;
Конецесли;

// Выбираем данные из файла
Для а = Excel.Cells(2,1).SpecialCells(21).Row по ФайлСтрок Цикл

//Полуим данные из соответсвующих ячеек
Артикул = СокрЛП(Excel.Cells(а,Артикул).Value);
НаименованиеТовара = СокрЛП(Excel.Cells(а,НомерКолонкиНаименованияТовара).Value);
ЕдиницаИзмерения = СокрЛП(Excel.Cells(а,НомерКолонкиЕдиницаИзмерения).Value);

Товар = Справочники.Номенклатура.ПустаяСсылка();

// Ищем товар в справочнике по коду
Товар = Справочники.Номенклатура.НайтиПоКоду.Артикул;

// Если не нашли по коду, то ищем по наименованию
Если Товар.Пустая() Тогда
Товар = Справочники.Номенклатура.НайтиПоНаименованию.Наименование;
Конецесли;

//Если не нашли создаем новый
Если Товар.Пустая() Тогда
Товар = Справочники.Номенклатура.СоздатьЭлемент();
Товар.Наименование = НаименованиеТовара;
Товар.Артикул = Артикул;
Товар.БазоваяЕдиницаИзмерения = ЕдиницаИзмерения;
Товар.СтранаПроисхождения = НомерКолонкиСтрана;
Товар.Записать();
Конецесли;
КонецЦикла;

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

Heltarion

2 / 2 / 0

Регистрация: 21.11.2011

Сообщений: 57

1

02.12.2011, 11:18. Показов 8725. Ответов 11

Метки нет (Все метки)


Добрый день!
Посмотрите пожалуйста. Есть в обработке таблица значений, в которую я выгружаю данные их XML, после этого я корректирую таблицу и хочу чтобы программа сохранила ее в новый документ эксель. Для этого я создал процедуру «Процедура СохранитьНажатие(Элемент) Экспорт». При сохранении выскакивает: «Ошибка при установке значения атрибута контекста (Value)». Насколько я понимаю, программе не нравится тип значения, который я передаю.
Переменные:

ТПП — «табличное поле правил», в ней уже занесены некотрые значения из XML
НоменклатураЗагрузки, НоменклатураБазы — имена столбцов ТПП
СтолбЗагр, СтолбБаз — столбцы в экселе

Код процедуры:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
СтолбЗагр = 1;
СтолбБаз = 2;
 
Если ИнициализацияЭкселя() Тогда
      Книга = Excel.WorkBooks.Add();
      Sheet = Книга.Sheets(1);
    
      Для каждого стр из ТПП Цикл
              Sheet.Cells(стр,СтолбЗагр).Value=стр.НоменклатураЗагрузки;
              Sheet.Cells(стр,СтолбБаз).Value=стр.НоменклатураБазы;
      КонецЦикла;
 
      Попытка
              Книга.SaveAs("F:1CBaseВнешнии обработкиправила.xls");
      Исключение
              Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
              Возврат;
      КонецПопытки;
КонецЕсли;
Сообщить("Готово");

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



308 / 308 / 1

Регистрация: 16.01.2011

Сообщений: 1,073

02.12.2011, 11:32

2

СохранитьНажатие(Элемент) это событие формы
в этой процедуре пропиши вызов другой процедуры, например СохранитьВЭксель();
саму же процедуру СохранитьВЭксель() добавь в модуль объекта и сделай её экспортной. Вставь свой код представленный выше.
обращение из формы будет ЭтотОбъект.СохранитьВЭксель();



1



2 / 2 / 0

Регистрация: 21.11.2011

Сообщений: 57

02.12.2011, 11:56

 [ТС]

3

СохранитьНажатие(Элемент) это событие формы
в этой процедуре пропиши вызов другой процедуры, например СохранитьВЭксель();
саму же процедуру СохранитьВЭксель() добавь в модуль объекта и сделай её экспортной. Вставь свой код представленный выше.
обращение из формы будет ЭтотОбъект.СохранитьВЭксель();

В МодулеОбъекта создал функцию «Процедура СохранитьВЭксель(ТПП) Экспорт»
Прописал в ней тотже код, что выше. В событии формы написал: ЭтотОбъект.СохранитьВЭксель(ТПП);
Выскочила ошибка: Ошибка при вызове метода контекста (Cells)
Что я нетак сделал?



0



308 / 308 / 1

Регистрация: 16.01.2011

Сообщений: 1,073

02.12.2011, 12:10

4

процедуру ИнициализацияЭкселя() тоже закинь в модуль объекта
СохранитьВЭксель(ТПП), параметр ТПП скорее всего не нужен



1



2 / 2 / 0

Регистрация: 21.11.2011

Сообщений: 57

02.12.2011, 12:19

 [ТС]

5

Да я именно так и сделал, просто забыл упомянуть, ТПП нужна в противном случае он не понимает что это за переменная

Добавлено через 4 минуты
Проблема вот в чем:
Sheet.Cells(стр,СтолбЗагр).Value=1;
Sheet.Cells(стр,СтолбБаз).Value=2;

Так работает, но если я поставлю
Sheet.Cells(стр,СтолбБаз).Value=стр.НоменклатураБа зы;
Выдает ошибку «Ошибка при установке значения атрибута контекста (Value)».

Дело в том что «стр.НоменклатураБазы» — это справочник ссылка, если у нее текстовый тип то программа глотает и записывает.



0



19 / 18 / 1

Регистрация: 15.11.2011

Сообщений: 54

02.12.2011, 12:22

6

чет вы мудрено делаете.
У вас не правильно указывается адресс ячейки в cell. Если стр — это коллекция или массив записей, то он не может нести в себе номер ячейки.
Не знаком с 1C, но програмлю в Excel и делаю выгрузки из других систем.



1



2 / 2 / 0

Регистрация: 21.11.2011

Сообщений: 57

02.12.2011, 12:28

 [ТС]

7

В данный момент ему не нравится присваемое значение к ячейке экселя (если я правильно понимаю сообщение «Ошибка при установке значения атрибута контекста (Value)» )

Причем если тип значения строка, то он его получает без вопросо, если тип значения СправочникССсылка, то он руегается на «Ошибка при установке значения атрибута контекста (Value)».

Я просто не понимаю как обратиться к такому типу переменных чтобы получить значение типа строка.



0



19 / 18 / 1

Регистрация: 15.11.2011

Сообщений: 54

02.12.2011, 12:30

8

а принудительно все значения в текст перевести нельзя?



1



308 / 308 / 1

Регистрация: 16.01.2011

Сообщений: 1,073

02.12.2011, 12:30

9

стр.НоменклатураБазы.Наименование например



1



2 / 2 / 0

Регистрация: 21.11.2011

Сообщений: 57

02.12.2011, 12:32

 [ТС]

10

стр.НоменклатураБазы — это уже есть наименование интересующего меня поля (имя столбца), в некотрых случаях можно писать: стр.НоменклатураБазы.Значение, но это нетот случай

Добавлено через 56 секунд
Спасибо вам большое, вы меня на правильный путь направили, мне сейчас только понять как получить значение из данного элемента



0



308 / 308 / 1

Регистрация: 16.01.2011

Сообщений: 1,073

02.12.2011, 12:34

11

значение из Excel?



1



Heltarion

2 / 2 / 0

Регистрация: 21.11.2011

Сообщений: 57

02.12.2011, 12:43

 [ТС]

12

Рабочий код:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Функция ИнициализацияЭкселя()
 
    //Пытаемся подключиться к Excel
    Попытка
        Excel = новый COMОбъект("Excel.Application");
        Сообщить("=====> Загрузка производится через MS Excel...");
        Возврат Истина;
    Исключение
        Возврат Ложь                
    КонецПопытки;     
    
КонецФункции
 
 
Процедура СохранитьНажатие(Элемент) Экспорт
    СтолбЗагр = 1; // задаю номер столбца№1 в эксель
    СтолбБаз = 2;  // задаю номер столбца№2 в эксель
    
    Если ИнициализацияЭкселя() Тогда
        Книга = Excel.WorkBooks.Add(); // создал новый документ
        Sheet = Книга.Sheets(1);          // открыл страницу 1
   
// цикл для заполнения таблицы эксель данными из табличного поля (по двум полям)     
        Для каждого стр из ТПП Цикл
            Sheet.Cells(стр,СтолбЗагр).Value=стр.НоменклатураЗагрузки;
            Sheet.Cells(стр,СтолбБаз).Value=стр.НоменклатураБазы.Наименование;
        КонецЦикла;
 
//выполняю сохранение документа       
        Попытка
            Книга.SaveAs("F:1CBaseВнешнии обработкиправила12.xlsx");
        Исключение
            Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
            Возврат;
        КонецПопытки;
    КонецЕсли;
    Книга.Application.Quit();
    Сообщить("Готово");
КонецПроцедуры



0



Автор Sweety Bell, 24 ноя 2015, 12:44

0 Пользователей и 1 гость просматривают эту тему.

Здравствуйте! Мне надо загрузить данные из excel в 8.2 обычное приложение. В цикле вывода возникает ошибка в методе Добавить. Первые 2 итерации пропускает нормально, потом выдает ошибку:
НоваяКолонка=ЭлементыФормы.Таблица.Колонки.Добавить(ИмяБезПробелов,ИмяКолонки);
по причине:
Недопустимое значение параметра (параметр номер ‘1’)

Процедура ОкрытьФайлНажатие(Элемент)
   ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   ДиалогВыбора.Заголовок ="Выберите файл";
   
Если ДиалогВыбора.Выбрать()Тогда
   ИмяФайла=ДиалогВыбора.ПолноеИмяФайла;
  КонецЕсли ;

   Таблица.Очистить();
Таблица.Колонки.Очистить();

Попытка
Excel=Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(ИмяФайла);
Состояние("Обработка файла Excel");
ExcelЛист=Excel.Sheets(1);
Исключение
Сообщить("шибка при открытии файла");
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;


Версия =Лев(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;
КонецЕсли;

Счетчик=1;
Пока ЗначениеЗаполнено(Excel.Cells(1,Счетчик).Text)Цикл
ИмяКолонки=Excel.Cells(1,Счетчик).Text;
ИмяБезПробелов=СтрЗаменить(ИмяКолонки," ","");
//Таблица.Колонки.Добавить(ИмяБезПробелов,,ИмяКолонки);
Таблица.Колонки.Добавить(ИмяКолонки);
НоваяКолонка=ЭлементыФормы.Таблица.Колонки.Добавить(ИмяБезПробелов,ИмяКолонки);
НоваяКолонка.Данные=ИмяБезПробелов;
Счетчик=Счетчик+1;
КонецЦикла;

Для нс=2 по Файлстрок Цикл
НоваяСтрока=Таблица.Добавить();
Для НомерКолонки=1 По Таблица.Колонки.Количество()Цикл
ТекущееЗначение=Excel.Cells(нс.НомерКолонки).Text;
  ИмяКолонки=Таблица.Колонких[НомерКолонки-1].Имя;
  НоваяСтрока[ИмяКолонки]=ТекущееЗначение;



  КонецЦикла;
   КонецЦикла;

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


Смело запускайте отладчик. Он вам покажет название колонки.


показал колонку Наименование.
После этого на форме появляются 3 пустые колонки.
Помогите, пожалуйста, вывести на экран. Начальство убивает:fdbsdfbsd:


Вы слово «отладчик» сознательно не видите?


Вижу. Он показывает на эту строку
НоваяКолонка=ЭлементыФормы.Таблица.Колонки.Добавить(ИмяКолонки);


Цитата: Sweety Bell от 24 ноя 2015, 13:12
Вижу. Он показывает на эту строку
НоваяКолонка=ЭлементыФормы.Таблица.Колонки.Добавить(ИмяКолонки);

В приведенном вами коде нет такой строки. Есть такая:

НоваяКолонка=ЭлементыФормы.Таблица.Колонки.Добавить(ИмяБезПробелов,ИмяКолонки);


Скажите, а что такое отладчик вы вообще знаете? Вывод строки с ошибкой и отладчик — это знаете ли, очень разные вещи.


Цитата: vitasw от 24 ноя 2015, 13:25
Скажите, а что такое отладчик вы вообще знаете? Вывод строки с ошибкой и отладчик — это знаете ли, очень разные вещи.

инструмент для пошаговой отладки. Я им и пользуюсь. Значение смотрю на табло

Добавлено: 24 ноя 2015, 13:47


Оно зависает на этом месте кода

ИмяКолонки=Excel.Cells(1,Счетчик).Text;


ИмяКолонки=СокрЛП(Excel.Cells(1,Счетчик).Value);


исправила. Теперь другая ошибка: Ошибка при вызове метода контекста (Cells)
      Пока ЗначениеЗаполнено(Excel.Cells(1,Счетчик).Value)Цикл
по причине:
Произошла исключительная ситуация (0x800a03ec)


  • Форум 1С

  • Форум 1С — ПРЕДПРИЯТИЕ 8.0 8.1 8.2 8.3 8.4

  • Конфигурирование, программирование в 1С Предприятие 8

  • загрузка данных из excel в 8.2

Похожие темы (5)

Рейтинг@Mail.ru

Rambler's Top100

Поиск

Показывать по
10
20
40
сообщений

Новая тема

Ответить

Olga3891

Дата регистрации: 10.10.2006
Сообщений: 497

внешняя обработка. читается файлик из ексель. база серверная, «100 лет» обработка работала, и вот вдруг перестала файлики читать, Ошибка при вызове метода контекста (Cells)
НомерИсследования=ТекЛист.Cells(2,3).Value;
по причине:
Неизвестная ошибка
причем вылетает то в одном месте при попытке cells, то в другом. на файловой базе все норм.
голову уже сломала, что еще предпринять.
сервер 1с перегружала.

ABell

Дата регистрации: 22.07.2007
Сообщений: 324

Аналогично. Если не стоит Микрософтовский Excel на машине.

Показывать по
10
20
40
сообщений

  1. Платформа 8,2 УПП. Задача загрузить из Excel файла данные в Справочники.бюджет. При загрузке файла такое ощущения что он зацикливается. и выкидывает ошибку {Форма.Форма.Форма(29)}: Ошибка при вызове метода контекста (Cells)
    БюдОбъект.Комментарий = СокрЛП(Ex.Cells(НС,2).Value);
    по причине:
    Произошла исключительная ситуация (0x800a03ec)
    Подскажите что не так я выполняю. сам код

    Запрос = Новый Запрос("ВЫБРАТЬ
    | Бюджеты.Наименование КАК Наименование ,
    | Бюджеты.НаименованиеПолное КАК НаимПолное ,
    | Бюджеты.Комментарий КАК  Комментарий
    |ИЗ
    | Справочник.Бюджеты КАК Бюджеты");
    Выборка=Запрос.Выполнить().Выбрать();
    
    //проверим что файл существует
    ФайлНаДиске = Новый Файл(Файл);
    Если Не ФайлНаДиске.Существует() Тогда
    Предупреждение("Файл не найден!");
    Возврат;
    КонецЕсли;
    
    Ex = ПолучитьТаблицуExcel(Файл);
    БюдОбъект=Справочники.Бюджеты.СоздатьЭлемент();
    
    СтруктураДанных = Новый Структура("Комментарий");
    
    НС = 1;
    Пока Истина Цикл 
    СтруктураДанных.Комментарий = СокрЛП(Ex.Cells(НС,2).Value); 
    Если СтруктураДанных.Комментарий = "" Тогда
    Прервать;
    КонецЕсли;
    БюдОбъект.Комментарий= СтруктураДанных.Комментарий;
    #Если Клиент Тогда
    Состояние("Номер обработанной строки: " + НС);
    #КонецЕсли
    
    
    БюдОбъект.Записать();
    НС = НС + 1;
    КонецЦикла;
    
    
    Ex.Quit();
    

  2. Tiger86

    Offline

    Tiger86
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104

    1. вы в один и тот же элемент комментарии сыплете и перезаписываете в коде.
    2. скорее всего зацикливает

  3. Народ подскажите почему он сохраняет и заносит последнию строку из цикла а не весь список

    Запрос = Новый Запрос("ВЫБРАТЬ
    | Бюджеты.Наименование КАК Наименование ,
    | Бюджеты.НаименованиеПолное КАК НаимПолное ,
    | Бюджеты.Комментарий КАК  Комментарий
    |ИЗ
    | Справочник.Бюджеты КАК Бюджеты");
    Выборка=Запрос.Выполнить().Выбрать();
    
    //проверим что файл существует
    ФайлНаДиске = Новый Файл(Файл);
    Если Не ФайлНаДиске.Существует() Тогда
    Предупреждение("Файл не найден!");
    Возврат;
    КонецЕсли;
    
    Ex = ПолучитьТаблицуExcel(Файл);
    БюдОбъект=Справочники.Бюджеты.СоздатьЭлемент();
    
    НС = 1;
    Пока Истина Цикл
    
    ПодСтрока=СокрЛП(Ex.Cells(НС,2).Value);
    ПодСтрока1=Сред(ПодСтрока,Найти(ПодСтрока,"инв.№"));
    БюдОбъект.Наименование=Прав(ПодСтрока1,8);
    БюдОбъект.НаименованиеПолное ="Ебись оно все конем по цене="+ СокрЛП(Ex.Cells(НС,4).Value);
    БюдОбъект.Комментарий = СокрЛП(Ex.Cells(НС,2).Value);
    БюдОбъект.Записать();
    
    Если БюдОбъект.Комментарий = "" Тогда
    Прервать;
    КонецЕсли;
    #Если Клиент Тогда
    Состояние("Номер обработанной строки: " + НС);
    #КонецЕсли
    
    
    
    НС = НС + 1;
    
    КонецЦикла;
    
    
    Ex.Quit();
    
    КонецПроцедуры
    
  4. Потому, что получение объекта, у вас вне цикла, где вы его заполняете. По коду получается, что вы многократно перезаполняете и записываете один и тот-же объект

    И еще

    Пока Выборка.Следующий() Цикл 
  5. Процедура ИмяПроцедуры(Файл)
    //Вначале проверим что файл существует
    ФайлНаДиске = Новый Файл(Файл);
    Если Не ФайлНаДиске.Существует() Тогда
    Предупреждение("Файл не найден!");
    Возврат;
    КонецЕсли;
    Запрос = Новый Запрос("
    |ВЫБРАТЬ
    |  Бюджеты.Ссылка			 КАК Ссылка,
    |  Бюджеты.Наименование	   КАК Наименование,
    |  Бюджеты.НаименованиеПолное КАК НаимПолное,
    |  Бюджеты.Комментарий	    КАК Комментарий
    |ИЗ
    |  Справочник.Бюджеты КАК Бюджеты
    |");
    Выборка = Запрос.Выполнить().Выбрать();
    // Чтение файла
    Exel = ПолучитьТаблицуExcel(Файл);
    Индекс = 1;
    Пока Выборка.Следующий() Цикл
    ПодСтрока  = СокрЛП(Exel.Cells(Индекс,2).Value);
    ПодСтрока1 = Сред(ПодСтрока,Найти(ПодСтрока,"инв.№"));
    Если СокрЛП(Exel.Cells(Индекс,2).Value) = "" Тогда Продолжить; КонецЕсли; // Если комментарий не получен, переходим к следующему элементу
    БюдОбъект = Выборка.Ссылка.ПолучитьОбъект(); // Получим объект для заполнения
    // заполняем объект
    БюдОбъект.Наименование	   = Прав(ПодСтрока1,8);
    БюдОбъект.НаименованиеПолное = "<Ненормативная лексика> по цене=" + СокрЛП(Exel.Cells(Индекс,4).Value);
    БюдОбъект.Комментарий	    = СокрЛП(Exel.Cells(Индекс,2).Value);
    // Запись заполненного объекта
    Попытка
    БюдОбъект.Записать();
    #Если Клиент Тогда
    Состояние("Номер обработанной строки: " + Индекс);
    #КонецЕсли
    Исключение
    #Если Клиент Тогда
    Сообщить(ОписаниеОшибки(),СтатусСообщения.Важное);
    #КонецЕсли
    КонецПопытки;
    // увеличиваем индекс на 1
    Индекс = Индекс + 1;
    
    КонецЦикла;
    // Закрытие файла
    Exel.Quit();
    КонецПроцедуры
  6. Спасибо за корректировку кода

  7. Народ подскажите пожалуйста как создать группу в справочнике 1с когда мы экспортируем из excel. Я хочу что бы те строки которые выделены жирным стали группами в справочнике 1с


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Понравилась статья? Поделить с друзьями:
  • Ошибка при вызове контекста сдвинуть
  • Ошибка при вызове метода контекста установитьпредставлениевыражений
  • Ошибка при вызове метода контекста установитьмонопольныйрежим
  • Ошибка при вызове конструктора структура
  • Ошибка при вызове метода контекста установитьдействие