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

Помещаю структуру во временное хранилище:

СтруктураХранения = Новый Структура;

СтруктураХранения.Вставить(«ТЗСоответствиеУслуг», ТЗСоответствиеУслуг);

СтруктураХранения.Вставить(«ТЗКвитанции», ТЗКвитанции);

   
АдресДанных = ПоместитьВоВременноеХранилище(СтруктураХранения, УникальныйИдентификатор);

После этого в фоновом задании запускаю процедуру общего модуля, в которой получаю эти же таблицы из структуры:

СтруктураХранения = ПолучитьИзВременногоХранилища(АдресДанных);

ТЗСоответствиеУслуг = СтруктураХранения.ТЗСоответствиеУслуг;

ТЗКвитанции = СтруктураХранения.ТЗКвитанции;

Как результат получаю ошибку:

{Форма.Форма.Форма(404)}: Ошибка при вызове метода контекста (ОжидатьЗавершения)

ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);

по причине:

Выполнение одного или нескольких заданий завершилось с ошибкой

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

ТЗСоответствиеУслуг = СтруктураХранения.ТЗСоответствиеУслуг;

При этом если вызвать процедуру общего модуля, которую запускает задание, то никаких ошибок не возникает. В чем может быть проблема? Заранее благодарю за дельные советы)

При использовании в отладчике функции от(запрос) возникает ошибка:

Ошибка записи объекта для отладки: {ОбщийМодуль.ирОбщий.Модуль(12508)}: Ошибка при вызове метода контекста (ОжидатьЗавершения): При ожидании завершения заданий наступил таймаут 

ОС: Windows x86 version 6.2  (Build 9200)
Платформа: 8.3.11.2700
Конфигурация: Управление небольшой фирмой для Украины, редакция 1.4 (1.4.11.4)
Режим БД: клиент-серверный
Приложение: Обычное приложение 32б
Основной режим запуска: Управляемое приложение
От имени администратора Windows: Нет
Режим совместимости: Версия8_3_7
Инструменты разработчика: Подсистема 4.33

Используется «Отладка по протоколу HTTP» на кластере.

Здравствуйте, помогите пожалуйста. при попытке создать регламентированный отчёт по 1С по страховым взносам выскакивает ошибка  — «ошибка при вызове метода контекста (ожидатьзавершения)» поставил остановку по ошибке, остановилось по строчее Задание.ОжидатьЗавершения(ЗаданиеВыполнено) У задания о отладке значение «ФоновоеЗадание», у него неопределено только три типа Конец, информация об ошибке и Регламентное задание. Подскажите, что куда дальше смотреть? Спасибо

Вопрос как то падает и падает,так совсем и упадёт

тип параметра ЗаданиеВыполнено верный?

Честно говоря не понимаю, задание выполнено ложь, ну это и понятно, он же и выпал здесь, наверное надо посмотреть и поменять, но не пойму что надо сделать, спасибо

посмотреть в СП тип параметра

ссори, а это где? Просто не очень понимаю ещё код, а выковыривать ошибки приходится, на добровольных началах

ОжидатьЗавершения (WaitForCompletion) Синтаксис: ОжидатьЗавершения(<Таймаут>) Параметры: Тип: Число.

Спасибо, посмотрю чуть-чуть позже, оторвали от данного процесса.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Помещаю структуру во временное хранилище:

СтруктураХранения = Новый Структура;

СтруктураХранения.Вставить(«ТЗСоответствиеУслуг», ТЗСоответствиеУслуг);

СтруктураХранения.Вставить(«ТЗКвитанции», ТЗКвитанции);

   
АдресДанных = ПоместитьВоВременноеХранилище(СтруктураХранения, УникальныйИдентификатор);

После этого в фоновом задании запускаю процедуру общего модуля, в которой получаю эти же таблицы из структуры:

СтруктураХранения = ПолучитьИзВременногоХранилища(АдресДанных);

ТЗСоответствиеУслуг = СтруктураХранения.ТЗСоответствиеУслуг;

ТЗКвитанции = СтруктураХранения.ТЗКвитанции;

Как результат получаю ошибку:

{Форма.Форма.Форма(404)}: Ошибка при вызове метода контекста (ОжидатьЗавершения)

ФоновыеЗадания.ОжидатьЗавершения(МассивЗаданий);

по причине:

Выполнение одного или нескольких заданий завершилось с ошибкой

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

ТЗСоответствиеУслуг = СтруктураХранения.ТЗСоответствиеУслуг;

При этом если вызвать процедуру общего модуля, которую запускает задание, то никаких ошибок не возникает. В чем может быть проблема? Заранее благодарю за дельные советы)

При использовании в отладчике функции от(запрос) возникает ошибка:

Ошибка записи объекта для отладки: {ОбщийМодуль.ирОбщий.Модуль(12508)}: Ошибка при вызове метода контекста (ОжидатьЗавершения): При ожидании завершения заданий наступил таймаут 

ОС: Windows x86 version 6.2  (Build 9200)
Платформа: 8.3.11.2700
Конфигурация: Управление небольшой фирмой для Украины, редакция 1.4 (1.4.11.4)
Режим БД: клиент-серверный
Приложение: Обычное приложение 32б
Основной режим запуска: Управляемое приложение
От имени администратора Windows: Нет
Режим совместимости: Версия8_3_7
Инструменты разработчика: Подсистема 4.33

Используется «Отладка по протоколу HTTP» на кластере.

Каким образом программно можно удалить фоновое задание зависшее со статусом «Задание завершено с ошибками»?

Если оно завершено, зачем его удалять?

У меня в базе ночью с помощью Регламентного задания запускаются вспомогательные процедуры, но по каким-то причинам они не отрабатывают. В журнале регистрации ошибок нет.

КонсольЗаданий.epf с ИТС тебе поможет во всем разобраться.

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

а каким образом я могу завершить задания (пока под рукой нету КонсольЗаданий.epf)?

А его нет в базе. Это только след. Перезапусти агент сервера, сам увидишь.

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

Подучаю задания с помощью Массив ФЗ = ФоновыеЗадания.ПолучитьФоновыеЗадания. Потом обхожу полученный массив. Какую функцию нужно вызвать, чтобы удалить фоновое задание?

Пробовал вот так: Получаю ошибку: {Форма.Форма.Форма}: Ошибка при вызове метода контекста (ОжидатьЗавершения): Выполнение одного или нескольких заданий завершилось с ошибкой

Вот компьютер, который выдернули из розетки. Как его выключить?

Не «Как его выключить?», а как убрать его из комнаты, чтобы он место не занимал?

да нет его уже, что вы хотите? компьютор спёрли из комнаты, вы только понимте что он там был

Нет. Именно «как выключить»

Нет. Именно «как удалить, чтобы не занимал место»

Я не понял, кто кому задачу ставит? Хорошо. У тебя есть квадрат на полу, где написано мелом «тут был комп». Как убрать его из комнаты, чтобы он место не занимал?

какое место? давай уж по существу. Состояние какое у этих фоновых?

Свойства: Описание: Состояние фонового задания. См. также: ФоновоеЗадание, свойство Состояние Если завершено (или завершено аварийно), то ресурсы не используются. Чтобы ушло из списка — перезапусти сервер 1с.

Вот это что такое? я писал выше «Задание завершено с ошибками»

В том-то и дело, что не «тут был комп», а «тут стоит комп и на нем мигает лампочка «Авария»»

это ёперный пистец, и о не связан с нормальной работой 1с. перезапускай севрер. Может код кривой в задании? вызывает утечку памяти?

что за задание? каждые 15 секунд стартует и видимо такая ошибка, что не снимает соединение, а-ля «зависший» сеанс, когда сервак пыхтит и пыхтит над заданием, хотя клиент давно забил

В том-то и дело, что используются. Дело в том, что эта база вспомогательная: она ночью через COM-соедиение коннектится к другим базам и запускает регламентные задания. При этом она не «отпускает» COM-соединение в случае аварийного завершения фонового задания. Вот у меня весь кластер «засран» COM-соединениями и фоновыми заданиями.

код в студию, принудительно отпускай ком соединение в задании. Почему ошибки? в попытки заворачивай подключения и действия, в исключениях — сброс кома

Да, с этим придется разобраться. Идей, как завершить фоновые задания ни у кого не появилось? У меня вопрос не про отладку фонового задания

такое ты завершишь только перезапуском службы

Не только, например, через консоль администрирования 1С можно завершить

ну разорви соединения обработкой. в чем трабл?

только проверяй чтоб это было фоновое

Спасибо за пример, но мне бы фоновое задание завершить

дак отладчиком погляди, Для Каждого Соединение Из СоединенияБазы Цикл там тоже фоновые должны быть

Да, правильная идея. Я почему-то думал, что можно как-то через ФоновыеЗадания управлять зависшими фоновыми заданиями

+1. А из списка ФоновыеЗадания.ПолучитьФоновыеЗадания оно удаляется само где-то через полчасика.

+ Т. е. работу платформа делает самостоятельно. Зачем это надо? У меня вот, например, фоновые и регламентные задания запускаются по несколько штук за минуту — и ничего.

ты скрины видишь ? видишь время? они висят день целый, в СЕАНСАХ, а не в ФоновыеЗадания.ПолучитьФоновыеЗадания.

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

Аааа… Это уже другой компот.

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.

Исправляем ситуацию

Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.

Планшет

Приглашаем на
бесплатный вебинар!

06 июня в 11:00 мск

1 час

Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:


	 Запрос = Новый Запрос;
	 Запрос.Текст =
	         "ВЫБРАТЬ
	          |        Номенклатура.Ссылка КАК Ссылка,
	          |        Номенклатура.ВерсияДанных КАК ВерсияДанных,
	          |        Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	          |        Номенклатура.Родитель КАК Родитель,
	          |        Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	          |        Номенклатура.Код КАК Код,
	          |        Номенклатура.Наименование КАК Наименование,
	          |        Номенклатура.Артикул КАК Артикул,
	          |        Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	          |        Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	          |        Номенклатура.Предопределенный КАК Предопределенный,
	          |        Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	          |ИЗ
	          |        Справочник.Номенклатура КАК Номенклатура
	          |ГДЕ
	          |         ";
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 КонецЦикла;

Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


	 Запрос = Новый Запрос;
	            Запрос.Текст =
	                       "ВЫБРАТЬ
	                        |          Номенклатура.Ссылка КАК Ссылка,
	                        |          Номенклатура.ВерсияДанных КАК ВерсияДанных,
	                        |          Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	                        |          Номенклатура.Родитель КАК Родитель,
	                        |          Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	                        |          Номенклатура.Код КАК Код,
	                        |          Номенклатура.Наименование КАК Наименование,
	                        |          Номенклатура.Артикул КАК Артикул,
	                        |          Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	                        |          Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	                        |          Номенклатура.Предопределенный КАК Предопределенный,
	                        |          Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	                        |ИЗ
	                        |          Справочник.Номенклатура КАК Номенклатура
	                        |ГДЕ
	                        |          НЕ Номенклатура.ЭтоГруппа ";
	 НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
	 КонецЦикла;

Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник

Рис.3 Синтакс-помощник

В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

  1. Доброго дня
    Бухгалтерия 3
    делал обновление с 3.0.43.208 на 3.0.43.235
    ошибки
    первая
    {ОбщийМодуль.ОбменСообщениямиВнутренний.Модуль(381)}: Ошибка при вызове метода контекста (ЭтотУзел)
    Возврат ПланыОбмена.ОбменСообщениями.ЭтотУзел();
    по причине:
    Найдено более одной записи
    вторая
    При вызове обработчика обновления:
    «ОбменСообщениямиВнутренний.УстановитьКодЭтойКонечнойТочки()»
    произошла ошибка:
    «{ОбщийМодуль.ОбменСообщениямиВнутренний.Модуль(381)}: Ошибка при вызове метода контекста (ЭтотУзел)
    Возврат ПланыОбмена.ОбменСообщениями.ЭтотУзел();
    по причине:
    Найдено более одной записи».

    почитал пишут косяк платформы попробовал на разных версиях платформах
    пробовал взять чистую конфу последней версии и просто тупо полной заменой загрузить
    вообщем не помогло всегда одно и тоже . Подскажите вдруг кто сталкивался ?
    [​IMG]

  2. Offline

    1cUserAndrew
    Профессионал в 1С
    Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.125
    Симпатии:
    212
    Баллы:
    104

    Через «Все функции» зайдите в план обмена «Обмен сообщениями». Там должен быть предопределенный узел (соответствующий этой информационной базе).
    Посмотрите, нет ли там у Вас задвоений. Может, два предопределенных узла.

  3. вроде всех по одной
    это если конфигурацию новую чистую заменой загрузить
    {ОбщийМодуль.ОбменСообщениямиВнутренний.Модуль(381)}: Ошибка при вызове метода контекста (ЭтотУзел)
    Возврат ПланыОбмена.ОбменСообщениями.ЭтотУзел();
    по причине:
    Найдено более одной записи

    При вызове обработчика обновления:
    «ОбменСообщениямиВнутренний.УстановитьКодЭтойКонечнойТочки()»
    произошла ошибка:
    «{ОбщийМодуль.ОбменСообщениямиВнутренний.Модуль(381)}: Ошибка при вызове метода контекста (ЭтотУзел)
    Возврат ПланыОбмена.ОбменСообщениями.ЭтотУзел();
    по причине:
    Найдено более одной записи».

    [​IMG]

  4. Offline

    1cUserAndrew
    Профессионал в 1С
    Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.125
    Симпатии:
    212
    Баллы:
    104

    Сам план обмена-то откройте (провалитесь в него) ).

  5. две строчки удалить которая без зеленной точки ?

    — Объединение сообщений, 22 июн 2016

    как удалить только он не дает ошибку пишет и завершить либо перезапустить

    «Элемент с установленным признаком «ЭтотУзел» уже существует»

  6. Online

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.724
    Симпатии:
    1.014
    Баллы:
    204

    Тестирование и Исправление запустите с проверкой ссылочной и логической целостности с удалением объектов и ссылок.

  7. Offline

    1cUserAndrew
    Профессионал в 1С
    Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.125
    Симпатии:
    212
    Баллы:
    104

    С зеленой точкой один элемент или два?

  8. Offline

    1cUserAndrew
    Профессионал в 1С
    Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.125
    Симпатии:
    212
    Баллы:
    104

    Попробуйте тогда просто открыть его и перезаписать.
    Если не поможет, тогда воспользуйтесь советом выше (тестирование и исправление).

  9. ужас после тестирования их три штуки одна с зеленой при входе в нее пишет найдено более одной записи

    — Объединение сообщений, 22 июн 2016

    [​IMG]

  10. Offline

    1cUserAndrew
    Профессионал в 1С
    Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.125
    Симпатии:
    212
    Баллы:
    104

    В общем, суть в чем. «Предопределенный» элемент (с зеленой точкой) должен быть всегда один. У Вас он один. Но система думает, что какой-то из двух других — тоже предопределенный. Поэтому и ругается, что найдено их более одного.
    Я с этим планом обмена никогда не работал. Не знаю, за что он отвечает.
    Думаю, единственный выход — удалить те два элемента. Жестко.
    Попробуйте на копии.
    Если через пометку на удаление не получается, тогда какой-то обработкой надо.

  11. не могу удалить
    Можно как то ручное супер удаление включить ?(интерактивное через шифт делет пробовал)
    {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(28)}: Ошибка при вызове метода контекста (Удалить)
    ПП.Удалить();
    по причине:
    Действие недоступно для этого узла

    &НаСервере
    Процедура Команда1НаСервере()
    запрос = Новый запрос ;
    Запрос.Текст =
    «ВЫБРАТЬ
    | ОбменСообщениями.Ссылка,
    | ОбменСообщениями.ВерсияДанных,
    | ОбменСообщениями.ПометкаУдаления,
    | ОбменСообщениями.ЭтотУзел,
    | ОбменСообщениями.Код,
    | ОбменСообщениями.Наименование,
    | ОбменСообщениями.НомерОтправленного,
    | ОбменСообщениями.НомерПринятого,
    | ОбменСообщениями.Ведущая,
    | ОбменСообщениями.Заблокирована
    |ИЗ
    | ПланОбмена.ОбменСообщениями КАК ОбменСообщениями»;

    выборка = Запрос.Выполнить().Выбрать();
    Пока выборка.Следующий() Цикл
    ПП = выборка.ссылка.ПолучитьОбъект();
    Если ПП.Ведущая = Ложь тогда
    ПП.Удалить();
    КонецЕсли;
    КонецЦикла;
    КонецПроцедуры

    &НаКлиенте
    Процедура Команда1(Команда)
    Команда1НаСервере();
    КонецПроцедуры

    — Объединение сообщений, 23 июн 2016

    пытался узел изменить с истины на ложь
    пишет
    {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(24)}: Ошибка при вызове метода контекста (Записать)
    ПП.записать();
    по причине:
    Данные изменения приведут к отсутствию элемента с установленным признаком «ЭтотУзел»

    Последнее редактирование: 23 июн 2016

  12. все получилось , Всем спасибо !

  13. Offline

    1cUserAndrew
    Профессионал в 1С
    Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.125
    Симпатии:
    212
    Баллы:
    104
  14. узел с истины на ложь поменял выше писал думал не получилось , а потом зашел посмотреть сработало

Похожие темы

  1. yuranius

    Ответов:
    1
    Просмотров:
    1.268

В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.

Исправляем ситуацию

Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.

Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:


	 Запрос = Новый Запрос;
	 Запрос.Текст =
	         "ВЫБРАТЬ
	          |        Номенклатура.Ссылка КАК Ссылка,
	          |        Номенклатура.ВерсияДанных КАК ВерсияДанных,
	          |        Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	          |        Номенклатура.Родитель КАК Родитель,
	          |        Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	          |        Номенклатура.Код КАК Код,
	          |        Номенклатура.Наименование КАК Наименование,
	          |        Номенклатура.Артикул КАК Артикул,
	          |        Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	          |        Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	          |        Номенклатура.Предопределенный КАК Предопределенный,
	          |        Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	          |ИЗ
	          |        Справочник.Номенклатура КАК Номенклатура
	          |ГДЕ
	          |         ";
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 КонецЦикла;
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора

Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.

Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.

Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.


	 Запрос = Новый Запрос;
	            Запрос.Текст =
	                       "ВЫБРАТЬ
	                        |          Номенклатура.Ссылка КАК Ссылка,
	                        |          Номенклатура.ВерсияДанных КАК ВерсияДанных,
	                        |          Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
	                        |          Номенклатура.Родитель КАК Родитель,
	                        |          Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
	                        |          Номенклатура.Код КАК Код,
	                        |          Номенклатура.Наименование КАК Наименование,
	                        |          Номенклатура.Артикул КАК Артикул,
	                        |          Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
	                        |          Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
	                        |          Номенклатура.Предопределенный КАК Предопределенный,
	                        |          Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
	                        |ИЗ
	                        |          Справочник.Номенклатура КАК Номенклатура
	                        |ГДЕ
	                        |          НЕ Номенклатура.ЭтоГруппа ";
	 НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
	 РезультатЗапроса = Запрос.Выполнить();
	 ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	 Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	 Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
	 КонецЦикла;
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной

1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.

Рис.3 Синтакс-помощник
Рис.3 Синтакс-помощник

В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.

Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает
Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает

Чаще всего причиной подобных ошибок выступают следующие факторы:

  1. Невнимательность;
  2. Отсутствие опыта или знаний;
  3. Несогласованность действий разработчиков друг с другом;
  4. Изменения в методах контекста в новых версиях платформы.

Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.

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