В платформе 1С сообщения об ошибках бывают достаточно запутаны, и без должных навыков разобраться в причинах достаточно сложно. Вот и сообщение об ошибке при вызове контекста может ввести в ступор начинающего разработчика. Однако в подавляющем большинстве случаев мы видим подобное сообщение, если разработчик допустил ошибку в своем коде. Причем речь зачастую идет не об орфографических ошибках, а о логических.
Исправляем ситуацию
Чтобы избавиться от этого неприятного сообщения об ошибке при вызове метода контекста, следует понимать, что контекстом называют методы платформы 1С. Значит в определенной строке кода воспользовались методом с неверными параметрами или вызвали его не от того владельца. Всегда внимательно и полностью читайте сообщения об ошибках – часто в них содержится указание на строку и метод, вызвавший ошибку. Это поможет сэкономить время на отладку и поиск проблемного места в коде.
Рассмотрим действия разработчика на примере со специально допущенной ошибкой. Мы запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора. Компилятор 1С пропускает такую процедуру, так как орфографических ошибок в написании команд мы не допустили. Однако в режиме предприятия нас ждет такое сообщение об ошибке:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;
Приведенный текст ошибки программисту 1С скажет, что в модуле формы обработки «ЧтениеЗаписьXML на 152 строчке кода не может выполниться запрос. Причина в том, что на 17 строчке запроса нет чего-то, что ждал компилятор. Таким образом, чтобы убрать подобное сообщение, необходимо выяснить, что там должно быть и написать недостающий код.
Увидев вышеприведенный кусок кода, разработчик заметит, что в запросе есть служебное слово «ГДЕ», дающее сигнал 1С, что дальше будет условие. Но мы забыли дописать его и, естественно, система с помощью сообщения об ошибке спрашивает нас – «а где условие?». Чтобы исправить эту ситуацию необходимо либо убрать оператор «ГДЕ» из запроса, либо добавить условие.
Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.ВерсияДанных КАК ВерсияДанных,
| Номенклатура.ПометкаУдаления КАК ПометкаУдаления,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.ЭтоГруппа КАК ЭтоГруппа,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование,
| Номенклатура.Артикул КАК Артикул,
| Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
| Номенклатура.ТипНоменклатуры КАК ТипНоменклатуры,
| Номенклатура.Предопределенный КАК Предопределенный,
| Номенклатура.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа ";
НужнаяГруппаЭлементов = Справочники.Номенклатура.НайтиПоНаименованию("Мебель");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(ВыборкаДетальныеЗаписи.Ссылка.ПринадлежитЭлементу("НужнаяГруппаЭлементов"));
КонецЦикла;
1С выдает настолько же информативное сообщение, из которого мы понимаем, что на 158 строке у 1 параметра неправильный тип. Но что же делать, если мы не знаем, какой тип должен быть? В этом нам поможет Синтакс-помощник, встроенный в платформу 1С.
В конфигураторе находим строку и метод, на который указывало сообщение об ошибке, и нажимаем на него правой кнопкой мыши. Выбираем пункт «Поиск в синтакс-помощнике» и платформа самостоятельно ищет справочную информацию по выделенному методу. В справке мы видим не только подробное описание параметров и самого метода, но и пример. Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает.
Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Но ошибки при разработке ПО случаются постоянно, поскольку иногда ошибаются даже специалисты с многолетним опытом. Самое главное – уметь исправлять их и учиться на них. Постепенно вы будете видеть сообщения об ошибках все реже и научитесь замечать подобные «опечатки» еще до запуска 1С.
Показывать по
10
20
40
сообщений
Новая тема
Ответить
МАнастасия
Дата регистрации: 19.03.2011
Сообщений: 17
Не формируется закладка проводки документа «Отражение зарплаты в реглам.учете» за декабрь(!за ноябрь все нормально). Вылетает на ошибку: <br> <br>{Документ.ОтражениеЗарплатыВРеглУчете.МодульОбъекта(30531)}: Ошибка при вызове метода контекста (ПринадлежитЭлементу)<br> Если (СчетКт = ПланыСчетов.Хозрасчетный.РасчетыСПерсоналомПоОплатеТруда или СчетКт = ПланыСчетов.Хозрасчетный.РасчетыПоВыплатеДоходов)<br>по причине:<br>Элемент не выбран<br>Основные и дополнительные начисления проставляет.<br>Помогите пожалуйста, не можем найти ошибку.
Дина
Дата регистрации: 21.05.2010
Сообщений: 2981
Поищите на заполненных закладках: отсортируйте по полю Счет Дт — нет ли записи с чем-то неправильным, н-р, 000.
Показывать по
10
20
40
сообщений
-
Случился скачок напряжения и комп с базой 1с вырубился. После включения база 1с выдала ошибки СУБД. Вылечили утилитой chdbfl.exe. Но при попытке выгрузить базу на сайт, при формировании xml файлов сразу вываливается ошибка вида
{Обработка.ОбменССайтом.МодульОбъекта(1169)}: Ошибка при вызове метода контекста (ПринадлежитЭлементу)
Если Группа.Значение.ПринадлежитЭлементу(Элемент) Тогда
по причине:
Элемент не выбран!.Подскажите, пожалуйста, как вылечить.
-
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 556
- Баллы:
- 204
Кэш попробуйте очистить, ТИИ в конфигураторе
-
Спасибо, попробую
— Объединение сообщений, 19 сен 2016 —
Простите незнающего, но в Конфигураторе Администрирование-Тестирование и исправление ничего про очистку кеша нету.
Последнее редактирование: 19 сен 2016 -
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 556
- Баллы:
- 204
Так там и не должно быть, я предложил вам два совершенно разных действия
-
Ясно, спасибо
— Объединение сообщений, 19 сен 2016 —
Может подскажете, после сбоя пропало несколько групп номенклатуры. Бэкап сильно устарел. Можно как-нибудь восстановить?
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.518
- Симпатии:
- 985
- Баллы:
- 204
Нельзя. Бэкап нужно делать чаще и поставить ИБП.
-
Так в том-то и дело что ИБП стоит. Свет моргнул, компы без ИБП этого не заметили, а комп с базой и ИБП вырубился.
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.518
- Симпатии:
- 985
- Баллы:
- 204
Значит нужно разобраться с ИБП, возможно заменить полностью/АКБ в нем.
-
Теперь-то ясное дело что с ним надо что-то делать, раньше комп с ИБП выдерживали.
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.518
- Симпатии:
- 985
- Баллы:
- 204
Вы еще радуйтесь, что БД легко отделалась…..могло бы быть все горадо хуже….
При выполнении некого обмена, возникает ошибка. Обмен не выполняется. Как можно начать поиск причины этого и попытаться устранить возникновение ошибки? выполнение обмена начинается из, — Сервис-> Прочие обмены данными-> Все настройки обмена данными — обмен/выполнить обмен по текущей настройке Ошибка при выгрузке данных для узла плана обмена ТипОбъекта = Документ объект: Поступление товаров и услуг Объект = Поступление товаров и услуг СВ000027019 от 31.12.2016 23:59:59 ОписаниеОшибки = Ошибка при вызове метода контекста (ПроизвестиЧтениеДанных): Произошла исключительная ситуация (1C:Enterprise 8.3.9.1850): Ошибка инициализации модуля: ОбщийМодуль.Модуль {ОбщийМодуль.Модуль(111,4)}: Переменная не определена (Перем_МеханизмСинонимов) Окончание выгрузки: 24.01.2017 11:35:07 Произошла ошибка при выгрузке объектов. Было выгружено: 1
Ну так вроде ошибка написана, не?
ну да написана я хотел подсказку о месте где её искать
Попробуйте здесь: {ОбщийМодуль.Модуль(111,4)}: Переменная не определена (Перем_МеханизмСинонимов)
+ Или здесь: Обработка.ОбменДаннымиXML.МодульОбъекта(14447)
+ Если что, цифры в скобках это позиция ошибки в строке
а может в обработчиках правил обмена ещё? в событиях?
(6+) В режиме предприятия конвертации данных.
План обмена типовой? Если самопальный, то, возможно, какого-то обработчика из типового не хватает. Поставьте точку останова на Обработка.ОбменДаннымиXML.МодульОбъекта(14447) и посмотрите что за переменная Перем_МеханизмСинонимов и где она должна заполняться, тогда поймете каких данных не хватает.
Да пробую отыскать это место, (111,4) — это обозначение какой то строки? Там просто много раз объявлена эта переменная
но в этой обработке, в её модуле объекта нет такой переменной
ТС, ты про отладчик слышал? А про «Останавливаться по ошибке»?
Ок, попробую этот метод! то есть, по этой записи строку не выявить? Обработка.ОбменДаннымиXML.МодульОбъекта(14447)
Прошелся по нему, ошибок конечно много встречается но что какая то переменная не определена, что в ошибке написана, не встретил разбираюсь далее
Ребят, как все же можно устранить ошибку? Ставил останавливаться по ошибке, останавливается, но ничего выявить не удается. Переменную что в тексте ошибки увидеть не удается. Ни в том ни в другом модуле. Как быть?
открой модуль объекта Обработка.ОбменДаннымиXML.МодульОбъекта и поставь точку останова на строке 14447
выявил что есть такой общий модуль, как название переменной
Эта строка вот, — в переменной СтрокаОшибкиВБазеПриемнике, всегда «» останавливается несколько раз на этой строке и все((( потом далее, и ошибка выходит!
но в этой строке просто выводится ошибка СтрокаСообщенияОбОшибке = ЗаписатьВПротоколВыполнения(72, ЗП, Истина); в модуле объекта обработки обмен данныи xml ЗП это структура, текст ошибки, номер строки почему то документ поступление товаров услуг ещё указан но как именно устранить эту ошибку не пойму (((( подскажите ?
ну ОбщийМодуль открой, строку 111
реально не пойму что поправить, как утсранить ошибку
Чисто на Ванге. В общем модуле, в самом начале у тебя объявление переменных, и там у тебя написано: Перем_МеханизмСинонимов; А надо Перем МеханизмСинонимов;
срабатывает исключение в попытке как вот его найти это место
Остановка по ошибке должна там останавливать, только если у тебя не выполняется на сервере и вырублена отладка на сервере.
Да остановиться по ошибке, там во многих местах останавливается. Но что это место возникновения данной ошибки не определяется. А если стоит ветвление попытка исключение конец попытки, и срабатывает исключение, то это и есть место возникновения ошибки? дальше программный код же не будет выполняться?
тогда в самом низу этого общего модуля смотрите. В общем запустить поиск в ОбщийМодуль слова Перем_МеханизмСинонимов
и вообще в ОбщийМодуль нажми синтаксический контроль
Поступление товаров и услуг СВ000027019 от 31.12.2016 23:59:59 вот этот документ указан в ошибке срабатывает это на вот этой строке на ней же срабатывает исключение, сейчас буду разбираться с этой строкой ничего это не выявляет????
вот на этой строке выходит ошибка, и по F11 не заходит в процедуру, как быть? Сваливается в исключение где выводится текст ошибки.
вы вообще ответы не читаете. У вас синтаксическая ошибка в модуле этом. Написано же «Ошибка инициализации модуля: ОбщийМодуль.Модуль » То есть ошибка при инициализации модуля. Модуль не инициализирован, а вы про какие-то процедуры. Процедур вообще нет еще. Ни одной. они возникнут, когда модуль проинициализируется.
да спасибо! Новая ошибка. Подскажите пожалуйста как начинать решать, где смотреть? Утомился, плохо соображаю, — бка в глобальном обработчике события ПередВыгрузкойОбъекта (конвертация) ПВД = бит_ЗаявкаНаРасходованиеСредств Объект = Заявка на расходование ДС СВ000022494 от 16.12.2016 11:09:53 (Документ объект: Заявка на расходование денежных средств (БИТ)) Обработчик = ПередВыгрузкойОбъектаВыборки (глобальный) ОписаниеОшибки = Ошибка при вызове метода контекста (ПринадлежитЭлементу): Элемент не выбран! Ошибка при выгрузке данных для узла плана обмена ТипОбъекта = Документ объект: Заявка на расходование денежных средств (БИТ) Объект = Заявка на расходование ДС СВ000022494 от 16.12.2016 11:09:53 ОписаниеОшибки = Ошибка в глобальном обработчике события ПередВыгрузкойОбъекта (конвертация) ПВД = бит_ЗаявкаНаРасходованиеСредств Объект = Заявка на расходование ДС СВ000022494 от 16.12.2016 11:09:53 (Документ объект: Заявка на расходование денежных средств (БИТ)) Обработчик = ПередВыгрузкойОбъектаВыборки (глобальный) ОписаниеОшибки = Ошибка при вызове метода контекста (ПринадлежитЭлементу): Элемент не выбран!
Пишу в процедуре ПередВыгрузкойОбъекта сообщить но сообщить при выгрузке не показывается. Перенес сообщить в процедуру передВыгрузкойДанных сообщить показалось!!! Но я хотел бы смотреть реквизиты самих объектов перед выгрузкой, а точнее вот этого кода, — И (НЕ(Объект.ПодразделениеДт.ПринадлежитЭлементу(ПодразделениеФильтр) ИЛИ Объект.ПодразделениеДт = ПодразделениеФильтр) ИначеЕсли Объект.Метаданные.Реквизиты.Найти(«ПодразделениеПолучатель») <> Неопределено И Объект.Метаданные.Реквизиты.Найти(«ПодразделениеОтправитель») <> Неопределено И (НЕ(Объект.ПодразделениеПолучатель.ПринадлежитЭлементу(ПодразделениеФильтр) ИЛИ Объект.ПодразделениеПолучатель = ПодразделениеФильтр) ИначеЕсли Объект.Метаданные.Реквизиты.Найти(«Подразделение») <> Неопределено И Объект.Метаданные.Реквизиты.Найти(«ПодразделениеОтправитель») <> Неопределено И (НЕ(Объект.Подразделение.ПринадлежитЭлементу(ПодразделениеФильтр) ИЛИ Объект.Подразделение = ПодразделениеФильтр) вставлен он в событии КД ПередВыгрузкойОбъекта. Как мне смотреть реквизиты подразделений объекта?
Тэги:
Комментарии доступны только авторизированным пользователям