В экселевском файле на определенной странице есть таблица. Нужно скопировать пару столбцов в справочник, в одном текст, в другом соответствующая картинка. Картинку с помощью сторонней библиотеки копирую в буфер и сохраняю в файл. Потом из файла в справочник. Все норм работает и отображает, но выдает ошибку при удалении временных файлов:
{ОбщаяФорма.ОсновнаяФорма.Форма(121)}: Ошибка при вызове метода контекста (УдалитьФайлы): Ошибка удаления файлов: Ошибка совместного доступа к файлу ‘C:tempРисунок12.bmp’
После закрытия 1ски все без проблем удаляется. Где-то эти файлы открыты и их закрыть надо, но не знаю где, и какой параметр обнулить. Наугад пробовал (строчки с «Неопределено» после закрытия экселя), но безрезультатно. Подскажите пожалуйста где ошибка.
З.Ы. 1С:Предприятие 8.3, учебная версия (8.3.5.1248). конфигурация пустая, только справочник, общая форма и форма списка справочника. В 1с нуб, в программировании по большому счету тоже.
Эксель = Новый COMОбъект(«Excel.Application»);
Книга = Эксель.WorkBooks.Open(«C:LibraryIG.xls»);
Лист = Книга.WorkSheets(32);
Для Строка = 12 По 15 Цикл
Лист.Cells(Строка,3).Copy();
КартинкаПуть = «C:tempРисунок»+Строка+».bmp»;
Буфер = Новый ComОбъект(«cClipBoardObject.cClipBoard»);
Буфер.GetClipBoard(КартинкаПуть);
Файл = Новый Картинка(КартинкаПуть);
Хранилище = Новый ХранилищеЗначения(Файл, Новый СжатиеДанных(9));
НовыйОбъект = Справочники.Справочник1.СоздатьЭлемент();
НовыйОбъект.Наименование = Лист.Cells(Строка,2).Value;
НовыйОбъект.ДанныеФайлаКартинки = Хранилище;
НовыйОбъект.Записать();
КонецЦикла;
Эксель.Application.Quit();
Буфер = Неопределено;
КартинкаПуть = Неопределено;
Картинка = Неопределено;
Файл = Неопределено;
Хранилище = Неопределено;
УдалитьФайлы(«C:temp»);
В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора
Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.
Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.
Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа ";
НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
КонецЦикла;
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной
1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.
Рис.3 Синтакс-помощник
В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.
Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает
Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.
Декомпилятор 1Cv8.x – обработка восстанавливающая тексты модулей с паролем или без исходного кода. Принцип действия – генерация исходного кода модулей на основе скомпилированных образов. Поэтому полученные модули могут немного отличаться от исходных, в частности, в сгенерированном коде модуля могут отсутствовать комментарии.
Скачать обработку можно по ссылке.
Обрабатываемые типы файлов: *.cf, *.epf и *.erf.
Для снятия пароля или восстановления исходного кода следует выбрать файл обработки, отчета или конфигурации и нажать — “Декомпилировать”.
Настройка “Не создавать копию”.
Если флаг не установлен, то перед декомпиляцией создастся копия файла с добавкой “_U” в имени. Установка данного флага сократит время выполнения восстановления кода(особенно если обрабатываются конфигурации *. cf), но при повреждении файла его уже будет не восстановить.
Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.
Связаться с нами можно по телефону +7 499 350 29 00.
Услуги и цены можно увидеть по ссылке.
Будем рады помочь Вам!
Настройка “Искать все модули (медленно)”.
Если флаг не установлен Декомпилятор обрабатывает только модули найденные в метаданных. При установке данного фдага Декомпилятор сканирует весь исходный файл в поисках внутренних файлов image, которые являются скомпилированными образами модулей. Использовать данную настройку стоит только если декомпиляция без нее не дала результата.
Ошибка при вызове метода контекста (Удалить)
по причине: Нарушение прав доступа!
Ошибка при вызове метода контекста (Удалить)
Как программно удалить документ? Пример кода
&НаСервере
Процедура УдалитьРеализацииНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| РеализацияТоваровУслуг.Ссылка
|ИЗ
| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|ГДЕ
| РеализацияТоваровУслуг.ПометкаУдаления = ИСТИНА»;
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
итератор =0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
итератор = итератор+1;
докОбъект = ВыборкаДетальныеЗаписи.ссылка.получитьОбъект();
докобъект.удалить();
КонецЦикла;
сообщить(«удалено » +итератор + » док. «);
КонецПроцедуры
нужно разрешить роль на чтение и запись, для последовательности.
кроме этого можно проверить галочки у всех регистров сведений
Теги: Ошибка при вызове метода контекста (Удалить)