1с8 ошибка времени выполнения

Конструкция Попытка-Исключение-КонецПопытки

Если в модуле на встроенном языке 1С будет ошибка времени выполнения, например деление на 0, то выполнение модуля будет прервано и на экран будет выведено сообщение об ошибке:

&НаКлиенте Процедура Исключение(Команда) а = 5/0; КонецПроцедуры

Ошибки времени выполнения (run time) — это ошибки во время выполнения модуля. Еще есть ошибки времени компиляции (compile time) — это ошибки во время компиляции модуля.

Для обработки ошибок времени выполнения можно использовать исключения:

&НаКлиенте Процедура Исключение(Команда) Попытка а = 5/0; Исключение Сообщить("Нельзя делить на 0"); КонецПопытки; КонецПроцедуры

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

Конструкцию Попытка-Исключение-КонецПопытки нельзя использовать для обработки ошибок времени компиляции. Такой модуль все равно не будет скомпилирован:

&НаКлиенте Процедура Исключение(Команда) Попытка а = 5/0;+ //здесь ошибка Исключение Сообщить("Нельзя делить на 0"); КонецПопытки; КонецПроцедуры

Вызовы процедур и функций внутри попытки тоже будут обработаны:

&НаКлиенте Процедура Исключение(Команда) Попытка ПоделитьНаНоль(); Исключение Сообщить("Нельзя делить на 0"); КонецПопытки; КонецПроцедуры &НаКлиенте Процедура ПоделитьНаНоль() а = 5/0; КонецПроцедуры

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

Оператор ВызватьИсключение

Попытки могут быть вложенными:

&НаКлиенте Процедура Исключение(Команда) Попытка ПоделитьНаНоль(); Исключение Сообщить("Нельзя делить на 0"); КонецПопытки; КонецПроцедуры &НаКлиенте Процедура ПоделитьНаНоль() Попытка а = 5/0; Исключение Сообщить("Ошибка в процедуре"); КонецПопытки; КонецПроцедуры

Если выполнить данный код, то выйдет сообщение «Ошибка в процедуре», то есть код из первого исключения даже не будет выполнен. Чтобы выполнялся код из вышестоящего исключения нужно использовать оператор ВызватьИсключение:

&НаКлиенте Процедура Исключение(Команда) Попытка ПоделитьНаНоль(); Исключение Сообщить("Нельзя делить на 0"); КонецПопытки; КонецПроцедуры &НаКлиенте Процедура ПоделитьНаНоль() Попытка а = 5/0; Исключение ВызватьИсключение; КонецПопытки; КонецПроцедуры

В этом случае исключение будет проброшено вверх по стеку и обработано первым блоком Попытка-Исключение.

Можно вызывать исключение из кода оператором ВызватьИсключение. Выполнение кода будет прервано, на экране будет сообщение с текстом исключения:

&НаКлиенте Процедура Исключение(Команда) ВызватьИсключение "Исключение вызванное из кода"; КонецПроцедуры

Информация об ошибке

В 1С нельзя использовать несколько блоков Исключений для разных типов ошибки. Какая бы ошибка не произошла всегда будет вызываться код после оператора Исключение. Для получения описания ошибки можно использовать метод ОписаниеОшибки():

&НаКлиенте Процедура Исключение(Команда) Попытка а = 4/0; Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецПроцедуры

Пример с другим типом ошибки:

&НаКлиенте Процедура Исключение(Команда) Попытка а = ПредопределенноеЗначение("Справочник.Склады.ОсновнойСклад"); //при этом такого предопределенного элемента нет Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; КонецПроцедуры

Но правильней использовать метод ИнформацияОбОшибке(), который вернет объект типа ИнформацияОбОшибке:

&НаКлиенте Процедура Исключение(Команда) Попытка а = 4/0; Исключение Инф = ИнформацияОбОшибке(); //объект типа ИнформацияОбОшибке передаем //в метод КраткоеПредставлениеОшибки() //для вывода сообщения на экран Сообщить(КраткоеПредставлениеОшибки(Инф)); КонецПопытки; КонецПроцедуры

Метод КраткоеПредставлениеОшибки() выведет более понятное для обычного пользователя сообщение: «Деление на 0» вместо «{Обработка.Обработка1.Форма.Форма.Форма(5)}: Деление на 0».

Для более полного описания ошибки можно использовать метод ПодробноеПредставлениеОшибки():

&НаКлиенте Процедура Исключение(Команда) Попытка а = 4/0; Исключение Инф = ИнформацияОбОшибке(); //объект типа ИнформацияОбОшибке передаем //в метод ПодробноеПредставлениеОшибки() //для вывода подробного сообщения на экран Сообщить(ПодробноеПредставлениеОшибки(Инф)); КонецПопытки; КонецПроцедуры

Но правильней пользователю сообщать кратное представление, а в журнал регистрации записывать подробное представление ошибки:

&НаКлиенте Процедура Исключение(Команда) //ЗаписьЖурналаРегистрации доступно только на сервере Команда1НаСервере(); КонецПроцедуры &НаСервере Процедура Команда1НаСервере() Попытка а = 4/0; Исключение Инф = ИнформацияОбОшибке(); //сообщим пользователю Сообщить(КраткоеПредставлениеОшибки(Инф)); //и запишем в журнал регистрации ПодробнаяОшибка = ПодробноеПредставлениеОшибки(Инф); ЗаписьЖурналаРегистрации("Ошибка", УровеньЖурналаРегистрации.Ошибка,,, ПодробнаяОшибка); КонецПопытки; КонецПроцедуры

Приведение к нужному типу

При загрузке числовых данных из файла (например из текстового документа) в 1С часто применяется такой прием для получения числа из строки:

&НаКлиенте Процедура Исключение(Команда) //это строка с числом, допустим она была получена из файла ЧислоСтрокой = "123.45"; Попытка //пробуем перевести ее в число ЧислоЧислом = Число(ЧислоСтрокой); Исключение //если не получилось ЧислоЧислом = 0; КонецПопытки; //дальше работаем как с числом ЧислоЧислом = ЧислоЧислом + 1; Сообщить(ЧислоЧислом); КонецПроцедуры

С точки зрения производительности это не совсем корректно. Правильно использовать объект ОписаниеТипов:

&НаКлиенте Процедура Исключение(Команда) //это строка с числом, допустим она была получена из файла ЧислоСтрокой = "123.45"; //создаем объект типа ОписаниеТипов с типом Число ОписаниеТипа = Новый ОписаниеТипов("Число"); //приводим строку к числу, если не получится вернет значение по умолчанию //для числа это 0 ЧислоЧислом = ОписаниеТипа.ПривестиЗначение(ЧислоСтрокой); //дальше работаем как с числом ЧислоЧислом = ЧислоЧислом + 1; Сообщить(ЧислоЧислом); КонецПроцедуры

Смотрите также:
Электронный учебник по по программированию в 1С
Рекомендации по изучению программирования 1С с нуля
Программное решение для сдачи и подготовки к экзаменам
Программирование в 1С 8.3 с нуля — краткий самоучитель
Комплексная подготовка программистов 1С:Предприятие 8.2
Сайты с уроками программирования и со справочниками
Youtube-каналы с уроками программирования
Сайты для обучения программированию
Лекции и уроки

Добрый день!

После обновления при попытке добавить документ ввода начальных остатков выходит сообщение «Поле объекта не обнаружено (Подразделение Организации). Поставил остановку по ошибке и теперь при нажатии «+» в конфигураторе появляется сообщение: «Ошибка времени выполнения» и далее отправляет меня в модуль Документ.ВводНачальныхОстатков.Форма.ФормаДокумента.Форма.Строка680.

Сама процедура приведена ниже:

Процедура УстановитьВидимостьПодразделения()

        
    ВидимостьПодразделения = (Найти(Метаданные.Имя, «КОРП») > 0)

        ИЛИ (РазделУчета = Перечисления.РазделыУчетаДляВводаОстатков.ОсновныеСредства)

        ИЛИ (РазделУчета = Перечисления.РазделыУчетаДляВводаОстатков.НезавершенноеПроизводство)

        ИЛИ (РазделУчета = Перечисления.РазделыУчетаДляВводаОстатков.РасходыБудущихПериодов)        

        ИЛИ (РазделУчета = Перечисления.РазделыУчетаДляВводаОстатков.Материалы);

    
    ЭлементыФормы.ПодразделениеОрганизации.Видимость        = ВидимостьПодразделения;    

    ЭлементыФормы.НадписьПодразделениеОрганизации.Видимость = ВидимостьПодразделения;        

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

Я в программировании мало что понимаю, потому огромная просьба к понимающим людям подсказать что именно здесь не так?

Конфигурация типовая, организация и раздел учета в форме заполнены.

Ошибка времени выполнения ☑ 0

Segate

08.05.15

13:05

Выборка = Справочники.ПодразделенияОрганизаций.Выбрать();

Подр = новый Структура;

Пока Выборка.Следующий() цикл

    Подр.вставить(УбратьЛишниеСимволы(Выборка.Наименование),Выборка.Ссылка);

КонецЦикла;

НУжно сформировать структуру из подразделения и его имени(из которого убрано все лишнее)

На одном из подразделений все падает. В соседней базе все отрабатывает без проблем. Куда копать?

ЗЫ база клиент-серверная, Функция «УбратьЛишниеСимволы» отрабатывает нормально, говорит отладчик.

1

Segate

08.05.15

13:09

2

vicof

08.05.15

13:13

по-моему отладчик падает на строке 1757

3

Segate

08.05.15

13:20

(2) Ты просто гений

4

vicof

08.05.15

13:25

(3) Я знаю. А ты похоже остановку по ошибке не можешь сделать.

5

Segate

08.05.15

13:51

(4) а ты думаешь как я этот скрин извлек?

Я привел тебе пример кода:

Подр = новый Структура;

Пока Выборка.Следующий() цикл

    Ключ =УбратьЛишниеСимволы(Выборка.Наименование); ///Ключ на выходе тип строка.

    Значение =Выборка.Ссылка;                       /// Значение тип справочник ссылка подразделение

    Подр.вставить(Ключ,Значение);                   /// это строка 1758, на ней все падает. при чем на одном конкретном подразделении. Остановка по ошибке дает именно такой результат, который показан на скрине. Я с такой ошибкой сталкиваюсь в первый раз. В конфигурации с такой же точно структурой, все отрабатывает без проблем.

КонецЦикла;

6

ДенисЧ

08.05.15

13:51

Значит в строке Ключ корявые данные, например, непечатные символы

7

Segate

08.05.15

13:54

(6)из строки Ключ убраны все символы, кроме букв рус/лат и цифр. Вот по такой маске:ПравильныеСимволы=»QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnmЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮйцукенгшщзхъфывапролджэячсмитьбю1234567890″)

Так что тоже не вариант…

8

hhhh

08.05.15

13:54

(7) цифры тоже убирай. Зачем цифры туда запендюрил?

9

ДенисЧ

08.05.15

13:55

похоже, таки черепашка…

10

Segate

08.05.15

13:56

(8) потому что подразделение имеет название по адресу. И на одной улице может быть несколько подразделений… так что цифры нужны

11

vde69

08.05.15

13:57

вставь перед этой строкой

сообщить(типЗнч(Ключ));

сообщить(типЗнч(Значение))

есть подозрение на null

12

hhhh

08.05.15

13:57

(10) тогда чего удивляешься? Хотя бы сделай тогда

Подр.вставить(«Поле» + УбратьЛишниеСимволы(Выборка.Наименование),Выборка.Ссылка);

13

H A D G E H O G s

08.05.15

14:01

Цифры впереди букоф.

15

vde69

08.05.15

14:03

Ключ =»_»+УбратьЛишниеСимволы(Выборка.Наименование);

16

Segate

08.05.15

14:10

(11)http://s45.radikal.ru/i109/1505/71/ce3d3e6366a7.jpg

Тип: «Самключ»

Тип: «СамоЗначение»

падает именно на этом подразделении

17

ДенисЧ

08.05.15

14:10

(16) у тебя ключ на цифру начинается. О чём тебе уже долго твердят.

18

H A D G E H O G s

08.05.15

14:14

Нельзя в Структуру много данных писать.

19

Segate

08.05.15

14:18

(17) Пятница дает о себе знать… читал сп, но почему то не придал значение…

(13),(15)Все решилось, спасибо всем.

(18) там не сильно много много.

Синтаксис:
Код 1C v 8.2 УП

 Попытка
// Операторы попытки
Исключение
// Операторы исключения [ВызватьИсключение;]
Сообщить(ОписаниеОшибки());
КонецПопытки;

Англоязычный синтаксис:
Try
// Операторы попытки
Except
// Операторы исключения
[Raise;]
// Операторы исключения
EndTry;


Параметры:
// Операторы попытки
Исполняемый оператор или последовательность таких операторов.

Исключение
Операторы, следующие за ключевым словом Исключение выполняются, если при выполнении последовательности операторов произошла ошибка времени выполнения.

// Операторы исключения
Исполняемый оператор или последовательность операторов, которые обрабатывают исключительную ситуацию.

ВызватьИсключение
Оператор позволяет вызвать исключение в тех случаях, когда несмотря на отработку исключительной ситуации операторами исключения необходимо прервать выполнение модуля с ошибкой времени выполнения. Оператор допустим только внутри операторных скобок Исключение – КонецПопытки.

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

КонецПопытки
Ключевое слово, которое завершает структуру оператора обработки исключительных ситуаций.


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

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

Конструкции Попытка – Исключение – КонецПопытки могут быть вложенными. При этом, при возникновении исключительной ситуации управление передается на тот обработчик, в попытке которого произошла ошибка. Если же в последовательности операторов исключения этого обработчика выполняется оператор ВызватьИсключение, выполнение передается вышестоящему обработчику исключения и так далее. Если вышестоящего обработчика нет, исключительная ситуация обрабатывается системно с прекращением выполнения программного модуля.

Добрый день. Подскажите, пожалуйста, почему может возникать «ошибка времени выполнения» при записи в регистр сведений? Регистр сведений непериодический, независимый. Все реквизиты, ресурсы, измерения задаются корректно. Использую следующий код:

+ к — Отбор при создании набора записей не делаю, но и при записи набора старые записи не удаляю (Набор.Записать(Ложь))

Варианта 2: 1) ты записываешь с признаком замещения Ложь, значит система пытается добавить новую запись в регистр, а если в ней есть дубли измерений, то это приводит к ошибке; 2) возможно все-таки не все свойства новой записи корректны. Кстати, если работаешь без отбора по одной записи, то вместо коллекции НаборЗаписей, лучше использовать объект МенеджерЗаписи.

«ошибка времени выполнения» это баг платформы или системы. А вообще приведи полное сообщение.

Автор, ответь (впрочем, можно не отвечать, — просто подумай): Почему эти две строки кода удаляют ВСЕ записи регистра?

Ничего подобного! Чаще всего это — кривой код, поставивший систему в тупик.

Пример такого кода покажи.

Да, Вы правы. Оказалось, что в регистре сведений уже есть записи с такими же измерениями, с которыми я повторно пытаюсь записать.

Да вот пож-та, в 1-м посте этого топика :-)

Тэги:

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

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • 1с77 ошибка загрузки данных
  • 2004 ошибка flashtool как исправить
  • 2003f ошибка макбук
  • 202 ошибки адресных маркеров
  • 2003 ошибка конфигурации торговой точки

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии