В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;
Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.
Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.
Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа ";
НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
КонецЦикла;
1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.
В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.
Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.
Солнце
01.08.13
✎
09:44
Пишу так
Книга = ПолучитьCOMОбъект(Файл,»Excel.Application»);
Ошибка: Ошибка при вызове метода контекста (ПолучитьCOMОбъект): Ошибка получения объекта COM: No such interface supported
А если так
Книга = ПолучитьCOMОбъект(Файл);
Ошибка: Ошибка при вызове метода контекста (ПолучитьCOMОбъект): Ошибка получения объекта COM: Moniker cannot open file
Код что первый что втрой в файловой базе выполняется на ура…
А в серверной не хочет…
На сервере установлен Excel.
Код выполняется на сервере….
Помогите справиться с проблемкой…
Лефмихалыч
модератор
01.08.13
✎
09:46
(0) на сервере нет нужных COM-объектов. Установить MSOffice на сервер.
Солнце
01.08.13
✎
09:50
MSOffice Установлен…
Солнце
01.08.13
✎
09:54
Эксель = Новый COMОбъект(«Excel.Application»);
Книга = Эксель.WorkBooks.Open(Файл);
К Excel подключается а к открытию файла говорит:
Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу Это может быть вызвано одной из следующих причин.
• Указан несуществующий файл или путь.
• Файл используется другой программой.
• Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент.
Хотя доступ есть к нему… Файл нигде не используется и он закрыт!
Солнце
01.08.13
✎
10:03
Никто не может помочь?…((
Лефмихалыч
модератор
01.08.13
✎
10:05
(2) он установлен на клиенте, а не на сервере. Установите офис на сервер
Лефмихалыч
модератор
01.08.13
✎
10:06
а, ну или файла нет на сервере.
В переменной «Файл» поди путь относительно твоей клиентской машины?
Солнце
01.08.13
✎
10:07
(7) сетевой путь такие же ошибки делает
lEvGl
01.08.13
✎
10:07
а что значит «выполняется на сервере» — регламентное задание?
Солнце
01.08.13
✎
10:08
Нет процедура выполняется &НаСервере
Лефмихалыч
модератор
01.08.13
✎
10:09
(9) а у пользователя, под которым сервер 1С предприяти запущен, права-то на шару есть?
Солнце
01.08.13
✎
10:09
(12) Конечно
Serginio1
01.08.13
✎
10:09
Лефмихалыч
модератор
01.08.13
✎
10:10
(13) не верю
wowik
01.08.13
✎
10:10
Лефмихалыч, +100. Сам недавно с этой ерундой занимался. Все по делу.
Солнце
01.08.13
✎
10:11
(15) Все права настроены. Права на все даны!
Лефмихалыч
модератор
01.08.13
✎
10:13
(17) Ты имя пользователя, под которым служба сервера запущена-то хоть знаешь?
Лефмихалыч
модератор
01.08.13
✎
10:14
да и не через шару надо на сервер файлы передавать, а через временное хранилище
lEvGl
01.08.13
✎
10:14
(15) если права точно есть, тогда попробуйте через ADODB
Connection = Новый COMОбъект («ADODB.Connection»);
Connection.Open («Provider=Microsoft.ACE.OLEDB.12.0;Data Source=» + Файл + «;Extended Properties=»»Excel 8.0;HDR=Yes;IMEX=1″»»);
Catalog = Новый COMОбъект («ADOX.Catalog»);
Catalog.ActiveConnection = Connection;
ИмяЛиста = Catalog.Tables.Item(0).Name;
String = «Select * from [» + ИмяЛиста + «]»;
Recordset = Новый COMОбъект («ADODB.Recordset»);
Recordset.Open (String, Connection, 2, 3);
Пока НЕ Recordset.EOF() Цикл
Строка = СокрЛП(Строка(Recordset.Fields(1).Value));
КонецЦикла;
Солнце
01.08.13
✎
10:15
USR1CV82
lEvGl
01.08.13
✎
10:16
(21) возможно админ менял пользователя, из под которого rphost запускается
Лефмихалыч
модератор
01.08.13
✎
10:16
(21) тебе эксель русским языком все сказал в (3)
Галахад
01.08.13
✎
10:17
Права можно так проверить:
Файл = Новый Файл(ИмяФайла);
Файл.Удалить()
Serginio1
01.08.13
✎
10:18
(17) Посмотри права DCOM
Солнце
01.08.13
✎
10:18
(22)Не менял
Солнце
01.08.13
✎
10:18
(25) Дали
Лефмихалыч
модератор
01.08.13
✎
10:20
как вариант — на клиентской тачке висит срежи процессов excel.exe, созданный при отладке ы файловом варианте и корректно не закрытый при завершении обработки. Этот процесс залочил файл.
lEvGl
01.08.13
✎
10:20
(26) может процесс экселя на сервере висит — занял файл. проверьте — (24)
Солнце
01.08.13
✎
10:21
(28)Это тоже проверяла
Солнце
01.08.13
✎
10:21
(29) НЕТУ
Солнце
01.08.13
✎
10:21
(24) есть права)
Лефмихалыч
модератор
01.08.13
✎
10:21
(30) тогда я знаю ответ — не твой день
lEvGl
01.08.13
✎
10:21
ПРОВЕРЬТЕ через удаление
casio
03.12.09
✎
22:16
Помогите разобраться, выдает ошибку. Не могу понять в чем дело.
Ошибка при вызове метода контекста (ПолучитьCOMОбъект): Ошибка получения объекта COM: Интерфейс не поддерживается
XLSФайл = ПолучитьCOMОбъект(«C:\DATA\DATA.XLS»);
Prikum
03.12.09
✎
22:20
Может быть сначала Exel.Application?
Чайник Рассела
03.12.09
✎
22:20
(1) зачем? и так должно работать
Prikum
03.12.09
✎
22:22
(2) Я просто предположил!
Чайник Рассела
03.12.09
✎
22:25
(0)а эксель то стоит?
casio
03.12.09
✎
22:25
операционка Win7
casio
03.12.09
✎
22:25
1c 8.1.15.13
Чайник Рассела
03.12.09
✎
22:25
я делаю так
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ОБЩЕГО НАЗНАЧЕНИЯ
// Проверяет возможность открытия файла Excel
//
// Параметры:
// ПутьКФайлу — Строка — Путь до файла Excel
//
// Возвращаемое значение
// — Булево
Функция ОткрытьФайл(ПутьКФайлу)
Результат = Истина;
Попытка
Эксель = ПолучитьCOMОбъект(ПутьКФайлу);
Исключение
Сообщить(ОписаниеОшибки(), СтатусСообщения.ОченьВажное);
Предупреждение(«Не удалось открыть файл «»» + ПутьКФайлу + «»»»);
Результат = Ложь;
КонецПопытки;
Возврат Результат;
КонецФункции
casio
03.12.09
✎
22:25
стоит 2007
casio
03.12.09
✎
22:28
Ошибка при вызове конструктора (COMОбъект): Недопустимая строка с указанием класса
XLSФайл = Новый COMОбъект(«V8.Application»);
Еще ошибка.
Чайник Рассела
03.12.09
✎
22:34
(9) V8 = Новый COMОбъект(«V81.ComConnector»);
Чайник Рассела
03.12.09
✎
22:35
(9) телепатирую: у тебя 64-х битная винда
casio
03.12.09
✎
22:39
(11) нет, у меня 32-х разрядная
Чайник Рассела
03.12.09
✎
22:40
(12) тогда файл сервер
casio
03.12.09
✎
22:41
(9)V8 = Новый COMОбъект(«V81.ComConnector»); работает, спасибо
casio
03.12.09
✎
22:41
XLSФайл = ПолучитьCOMОбъект(«C:\DATA\DATA.XLS»); а как это победить?
Чайник Рассела
03.12.09
✎
22:44
(15) файл-сервер?
casio
03.12.09
✎
22:58
нет
casio
03.12.09
✎
23:03
Если делаю так
XLSФайл = Новый COMОбъект(«Excel.Application»);
XLSФайл.Open(«C:\DATA\DATA.XLS»);
выдает такую ошибку:
Метод объекта не обнаружен (Open)
XLSФайл.Open(«C:\DATA\DATA.XLS»);
Чайник Рассела
03.12.09
✎
23:04
(18) сделай реквизит см. (7) и не ипи мозг
casio
03.12.09
✎
23:10
(19) Сделал как (7), выдало ошибку
Ошибка при вызове метода контекста (ПолучитьCOMОбъект): Ошибка получения объекта COM: Класс не зарегистрирован
Axel2009
03.12.09
✎
23:12
экселя нет?
casio
03.12.09
✎
23:15
есть 2007
Axel2009
03.12.09
✎
23:22
(22) скопированный но неустановленный. эксель не установлен корректно, хоть и запускается..
casio
03.12.09
✎
23:27
(23) попробую переустановить
casio
03.12.09
✎
23:59
переустановил, не помогло
casio
04.12.09
✎
00:36
Excel = Новый COMОбъект(«Excel.Application»);
WB = Excel.Workbooks.Open(ИсточникФайла);
так заработало.
Всем спасибо за помошь.
ilpar
04.12.09
✎
07:24
(0)На 2007 офисе вчера также было …
функция ПолучитьCOMОбъект() на интерфейс ругалась. Х.з. что это
114
Решение вопроса:
1) Войдите на сервер 1С (т.е где базы 1С) с правами администратора. 2. Зайти в Пуск>Панель управления>Администрирование>Службы> Найти в списке служб службу «Агент сервера 1С:Предприятия 8.3» / «1C:Enterprise 8.3 Server Agent» и остановить её. 2) Найдите папку reg_1541 или ввести в адресной строке «%ProgramFiles%\1cv8\srvinfo\reg_1541\» (расположение зависит от разрядности установленного сервера 1С) . 3) Откройте каталог snccntx / (пример C:\Program Files\1cv8\srvinfo\reg_1541\snccntx9ea019eb-ccdd-41c3-ac92-75661dfadd19). 4) Удалите файлы snccntx.00000000 и snccntx с расширением *.dat — как раз искомые сеансовые данные. 5) Зайти в Пуск>Панель управления>Администрирование>Службы> Найти в списке служб службу «Агент сервера 1С:Предприятия 8.3» / «1C:Enterprise 8.3 Server Agent» и запустить службу! Дополнительно почистить кэш пользователя зайдя в каталоги C:\Пользоватеть\Имя_Пользователя\AppData\Roaming\1C\1cv8\ или C:\Пользоватеть\Имя_Пользователя\AppData\Local\1C\1Cv8 удалить в каталогах буквенно циферные папки. Всё готово к работе.
Информация
Комментировать статьи на сайте возможно только в течении 31 дней со дня публикации.